1.动态显示的实现原理
1.数码管的动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果
2.在轮流显示的过程中,每位数码管的点亮时间为1到2ms,由于人的视觉暂流现象以及发光二极管的余晖效应,尽管实际上数码管不是同时点亮的,但只要扫描速度够快,给人眼的印象就是一组稳定的显示数据,不会有闪烁感,这样就节省了大量的I/O口,且功耗更低。
2.代码实现
#include <reg52.h> //头文件
unsigned char code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; // 数码管的断码表
void Delay(unsigned long int t) //延时函数
{
while(t--);
}
void HC138Init(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;//让Y4输出低电平,此时Y4C为高电平
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;//让Y5输出低电平,此时Y5C为高电平
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;//让Y6输出低电平,此时Y6C为高电平
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;//让Y7输出低电平,此时Y7C为高电平
break;
}
}
void showSMG(unsigned char position,unsigned char number) //字符显示函数
{
HC138Init(6); // 选通Y6C
switch(position)
{
case 1://第1个位置
P0 = 0x01;
break;
case 2://第2个位置
P0 = 0x02;
break;
case 3://第3个位置
P0 = 0x04;
break;
case 4://第4个位置
P0 = 0x08;
break;
case 5://第5个位置
P0 = 0x10;
break;
case 6://第6个位置
P0 = 0x20;
break;
case 7://第7个位置
P0 = 0x40;
break;
case 8://第8个位置
P0 = 0x80;
break;
}
HC138Init(7); // 选通Y7C
if(number == '0') //下面是显示各个字符
P0 = SMG_duanma[0];
else if(number == '1')
P0 = SMG_duanma[1];
else if(number == '2')
P0 = SMG_duanma[2];
else if(number == '3')
P0 = SMG_duanma[3];
else if(number == '4')
P0 = SMG_duanma[4];
else if(number == '5')
P0 = SMG_duanma[5];
else if(number == '6')
P0 = SMG_duanma[6];
else if(number == '7')
P0 = SMG_duanma[7];
else if(number == '8')
P0 = SMG_duanma[8];
else if(number == '9')
P0 = SMG_duanma[9];
else if(number == 'a')
P0 = SMG_duanma[10];
else if(number == 'b')
P0 = SMG_duanma[11];
else if(number == 'c')
P0 = SMG_duanma[12];
else if(number == 'd')
P0 = SMG_duanma[13];
else if(number == 'e')
P0 = SMG_duanma[14];
else if(number == 'f')
P0 = SMG_duanma[15];
else if(number == '-')
P0 = SMG_duanma[16];
else if(number == '.')
P0 = SMG_duanma[17];
}
void main()
{
while(1)
{
showSMG(1,'5');
Delay(500);
showSMG(2,'2');
Delay(500);
showSMG(3,'0');
Delay(500);
showSMG(4,'1');
Delay(500);
showSMG(5,'3');
Delay(500);
showSMG(6,'1');
Delay(500);
showSMG(7,'4');
Delay(500);
}
}