3.8 动态数码管
3.8.1 数码管原理图
图3-8-1
注意:使用排线连接时,排线有金属触点的一片必须朝右
开发板连线说明:
J21跳线帽接左边、JP165跳线帽断开、JP10(P0)接J12、JP16(右排)接JP8。
(数码管控制线)JP10接线详细说明: P0.0-->A P0.1--->B …….
(数码管片选线)JP16接线详细说明:P1.0--->1 P1.1 --->2 ………..
3.8.2 数码管动态显示介绍
LED显示器工作方式有两种:静态显示方式和动态显示方式。
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
数码管动态显示注意事项:
1、每个数码显示的驻留时间合理,保证显示的亮度
2、多个数码管显示时扫描的频率合理,保证显示不闪烁
3.8.3 对共阴极数码管进行编码
P07 P06 P05 P04 P03 P02 P01 P00
dp | g | f | e | d | c | b | a
---------------------------------
0 0 1 1 1 1 1 1 0x3F | 0
0 0 0 0 0 1 1 0 0x06 | 1
0 1 0 1 1 0 1 1 0x5B | 2
0 1 0 0 1 1 1 1 0x4F | 3
0 1 1 0 0 1 1 0 0x66 | 4
0 1 1 0 1 1 0 1 0x6D | 5
0 1 1 1 1 1 0 1 0x7D | 6
0 0 0 0 0 1 1 1 0x07 | 7
0 1 1 1 1 1 1 1 0x7F | 8
0 1 1 0 1 1 1 1 0x6F | 9
数字0~9
code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
3.8.4 对数码管片选端进行编码
P17 P16 P15 P14 P13 P12 P11 P10
1 1 1 1 1 1 1 0 0xFE 控制第1个数码管
1 1 1 1 1 1 0 1 0xFD 控制第2个数码管
1 1 1 1 1 0 1 1 0xFB 控制第3个数码管
1 1 1 1 0 1 1 1 0xF7 控制第4个数码管
1 1 1 0 1 1 1 1 0xEF 控制第5个数码管
1 1 0 1 1 1 1 1 0xDF 控制第6个数码管
1 0 1 1 1 1 1 1 0xBF 控制第7个数码管
0 1 1 1 1 1 1 1 0x7F 控制第8个数码管
//数码管的片选控制,查表选择法,一共8个数码管
code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
3.8.5 示例代码: 静态显示
下面代码实现,在8个数码管上轮流显示数字0~9(单个数码管的静态显示)。
(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)
//共阴极数码管编码(要显示的段就输出1)
//数字0~9
code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管的片选控制,查表选择法
code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*
静态数码管显示,共阴极数码管
*/
void LED2_StaticDisplay(u8 number,u8 val)
{
LED_CS=LED_CS_Config[number];//选择指定的数码管进行显示: 0~7
LED=LED2_Coding[val]; //显示数字: 0~9
}
//动态数码管一共有8个数码管
//数码的控制端接P0端口
//数码管的片选端接P1接口
int main()
{
u8 i,j;
while(1)
{
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)
{
LED2_StaticDisplay(i,j);
DelayMs(500);
}
}
}
}
3.8.6 示例代码: 动态显示数字0~9
下面代码,实现在8个数码管上动态同时显示1234567数字。
(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)
//共阴极数码管编码(要显示的段就输出1)
//数字0~9
code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管的片选控制,查表选择法
code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*
静态数码管显示,共阴极数码管
*/
//数码管的动态显示函数
void LED_DemoDisplay(void)
{
u16 i,j;
for(i=0;i<8;i++)
{
LED_CS=LED_CS_Config[i];//控制数码管的片选
LED=LED2_Coding[i]; //控制数码管的显示数据值
j = 180; //扫描间隔时间设定
while(j--){}
LED_CS=0xFF; //消隐,所有数码管都不显示
}
}
//动态数码管一共有8个数码管
//数码的控制端接P0端口
//数码管的片选端接P1接口
int main()
{
while(1)
{
LED_DemoDisplay();
}
}
3.8.7 示例代码: 在数码管上显示指定的整数
要在数码管上显示指定的数据,需要先学会数位分离,将指定的一个整数分离出来。
示例代码: 将整数的每个位分离
(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)
#include <stdio.h>
int main()
{
unsigned int data=123;
printf("%d\n",data/10000000%10); //1
printf("%d\n",data/1000000%10);//2
printf("%d\n",data/100000%10);//3
printf("%d\n",data/10000%10);//4
printf("%d\n",data/1000%10);//5
printf("%d\n",data/100%10);//6
printf("%d\n",data/10%10);//7
printf("%d\n",data/1%10);//8
return 0;
}
数码管显示代码:动态右对齐显示指定的整数
(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)
//共阴极数码管编码(要显示的段就输出1)
//数字0~9
code u8 LED2_Coding[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管的片选控制,查表选择法
code u8 LED_CS_Config[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
/*静态数码管显示,共阴极数码管*/
//设置数码管显示指定的数字
void LED_DisplayNumber(unsigned long number)
{
u16 i,j;
u8 display_data[8];//存放当前数码管显示的数据
//以下代码将number按十进制位从低到高依次提取并转为数码管显示字符
display_data[0] = LED2_Coding[number/10000000%10];
display_data[1] = LED2_Coding[number/1000000%10];
display_data[2] = LED2_Coding[number/100000%10];
display_data[3] = LED2_Coding[number/10000%10];
display_data[4] = LED2_Coding[number/1000%10];
display_data[5] = LED2_Coding[number/100%10];
display_data[6] = LED2_Coding[number/10%10];
display_data[7] = LED2_Coding[number/1%10];
for(i=0;i<8;i++)
{
LED_CS=LED_CS_Config[i]; //控制数码管的片选
LED=display_data[i]; //控制数码管的显示数据值
j = 180; //扫描间隔时间设定
while(j--){}
LED_CS=0xFF; //消隐,所有数码管都不显示
}
}
int main()
{
while(1)
{
LED_DisplayNumber(4579);
}
}