一、发光二极管与数码管基础
1、发光二极管
圆头塑封发光二极管的正负极判断
- 长脚为正极,短脚为负极
- 电极小的为正极,电极大的为负极
- 圆弧形边缘的为正极,直线型边缘的为负极
- 以上方法都无法判断,则可以借助万用表进行测量
普通二极管的正向导通电压普遍在1.2V或以上,而一般的指示用发光二极管工作电流在2至20mA内。
2、数码管
数码管的“位”指的是有多少个数码管。
数码管的“段”指的是一个数码管有多少个发光二极管。
位码是决定那一个数码管能够被点亮,而段码是决定被选中的数码管点亮一个什么样的数字。
数码管的内部结构
共阴与共阴数码管来减少引脚的引出其中A表示共阳的公共端,而K来表示共阴的公共端
共阳和共阴的排列顺序是相同的,其排列如图所示:
共阳数码管清0来显示数码,共阴数码管置1来显示数码;
配置段亮灭状态的值叫做段码,使能多位公共端的值称为位码。
共阳数码管的段码和位码的设定
共阳数码管段码0-F的表示形式如下:
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
共阴数码管的段码和位码的设定
共阴数码管段码0-F的表示形式如下:
u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
二、数码管显示操作
1、共阳数码管显示
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void Digital_Led_Play(void) { u8 num; PC_DDR=0xFF;//配置PC端口为输出模式 PC_CR1=0xFF;//配置PC端口为推挽输出模式 PC_CR2=0x00;//配置PC端口低速率输出 while(1) { for(num=0;num<=9;num++) { LED=Buff[num]; delay(300);//延时便于观察LED情况 } } }
2、共阴数码管显示
u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void Digital_Led_Play(void) { u8 num; PC_DDR=0xFF;//配置PC端口为输出模式 PC_CR1=0xFF;//配置PC端口为推挽输出模式 PC_CR2=0x00;//配置PC端口低速率输出 while(1) { for(num=0;num<=9;num++) { LED=Buff[num]; delay(300);//延时便于观察LED情况 } } }
3、串行数码管
原理与如下:
代码如下:
#define DIO PG_ODR_ODR7//串行数据输入 #define RCLK PG_ODR_ODR6//锁存控制信号(上升沿有效) #define SCLK PG_ODR_ODR5//时钟脉冲信号(上升沿有效) //共阳数码管段码“0123456789AbCdEF熄灭-” u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //位码数组 u8 wei_table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void Digital_Led_Play(void) { PG_DDR=0xFF;//配置PG端口为输出模式 PG_CR1=0xFF;//配置PG端口为推挽输出模式 PG_CR2=0x00;//配置PG端口低速率输出 PG_ODR=0x00;//初始化PG端口全部输出低电平 while(1) { LED8_Display(3,10);//显示数码"5" LED8_Display(7,6);//显示数码"6" } } void LED8_Display(u8 x,u8 y) { LED_OUT(LED_table[y]);//送出段码 LED_OUT(wei_table[x]);//送出位码 RCLK=0; RCLK=1;//RCLK产生上升沿 delay(1); } void LED_OUT(u8 outdata) { u8 i; for(i=0;i<8;i++)//循环8次 { if (outdata & 0x80)//逐一取出最高位 DIO=1;//送出“1” else DIO=0;//送出“0” outdata<<=1;//执行左移一位操作 SCLK=0; SCLK=1;//SCLK产生上升沿 } }