动态显示即多个数码管同时显示内容。
动态显示让每个数码管延时1~2ms,然后利用人眼的余晖(只要数码管切换的够快,你就看不出来)让人感觉多个数码管是同时显示的。
#include "reg52.h"
unsigned char month = 12;
unsigned char SMG[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; // 0~F - .
void DelaySmg(unsigned int t)
{
while(t--);
}
void SelectHc138(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void ShowSmgBit(unsigned char dat,unsigned char n)
{
SelectHc138(6);
P0 = 0x01 << n; // 数码管的位置
SelectHc138(7);
P0 = dat; // 数码管的内容
}
void DisplaySmg()
{
ShowSmgBit(SMG[2],0); // 在第0个数码管显示内容SMG[2]
DelaySmg(500);
ShowSmgBit(SMG[0],1); // 在第1个数码管显示内容SMG[0]
DelaySmg(500);
ShowSmgBit(SMG[2],2);
DelaySmg(500);
ShowSmgBit(SMG[2],3);
DelaySmg(500);
ShowSmgBit(SMG[16],4); // SMG[16]为 ' - '
DelaySmg(500);
ShowSmgBit(SMG[16],5);
DelaySmg(500);
ShowSmgBit(SMG[month/10],6); // month/10为month的十位
DelaySmg(500);
ShowSmgBit(SMG[month%10],7); // month%10为month的个位
DelaySmg(500);
}
void main()
{
while(1)
{
char t = 100;
while(t--) // 8个数码管整体显示时间进行延时
{
DisplaySmg();
}
month++;
if(month > 12) // 月份超过12时变为1
month = 1;
}
}