把程序简化一下便于楼主理解
#include"reg52.h" /* 调用头文件,单片机内部寄存器都定义在此,用的时候需要先调用 */
typedef unsigned char UINT8;/* 给unsigned char重新定义一个别名UINT8,用的时候直接写UINT8就可以 */
typedef unsigned int UINT16;/* 给unsigned int重新定义一个别名UINT16,用的时候直接写UINT16就可以 */
sbit LE1 = P2^2; /* 定义74HC573锁存使能端口 段锁存 */
sbit LE2 = P2^3; /* 定义74HC573锁存使能端口 位锁存 */
UINT8 code DuanMa[ ] = { 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F }; /* 段码值0-9 */
UINT8 code WeiMa[] = { 0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F };/* 分别对应相应的数码管位码,决定哪个数码管被点亮 */
UINT8 TempData[8]; /* 存储显示值 */
void DelayMs(UINT16 Ms)
{
UINT8 i;
while (Ms--)
{
for(i=0;i<114;i++);/* 循环114大概是1MS时间 */
}
}
void main (void)
{
UINT16 Num=0,j=0;
UINT8 i=0;
while(1)
{
j++;
if(j==1000)//约1秒
{
j=0;
Num++;
if(Num==1000)
Num = 0;
}//数据按十进制分解后保存在显示缓存中
TempData[0] = DuanMa[Num/100%10];/* 计算显示数据对应段码的数据成员,如要显示68,则68/10=6 68%10 = 8 */
TempData[1] = DuanMa[Num/10%10];
TempData[2] = DuanMa[Num%10];
P0=0x00;/* 清空数据,防止有交替重影 */
LE1 = 1; /* 段锁存 */
LE1 = 0;
P0=WeiMa[i];/* 取位码 */
LE2 = 1;/* 位锁存 */
LE2 = 0;
P0=TempData[i]; /* 取显示数据,段码 */
LE1 = 1; /* 段锁存 */
LE1 = 0;
i++;
if(i==3)
i=0;
DelayMs(1);//控制主循环周期约1ms
}
}
|