深入浅出玩转51单片机——学习笔记:数码管动态显示1
0赞
发表于 5/15/2014 12:36:08 PM
阅读(3946)
/************************************************
实现功能:数码管动态显示,依次显示01234567
硬件平台:基于MGMC-V1.0实验板
晶振频率:11.0592Mhz
时间:2014年5月14日
*************************************************/
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 i = 0;
uint8 j = 0;
uint8 time_1ms = 0;
sbit We_En = P1^6; //数码管位选端
sbit Du_En = P1^7; //数码管段选端
uint8 code SEG_Tab[8] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
void initial_myself(); //上电初始化
void Delayms(uint16 z); //延时函数
void initial_peripheral(); //外围设备初始化
void main()
{
initial_myself(); //上电初始化
Delayms(10); //延时函数
initial_peripheral(); //外围设备初始化
while(1)
{
if(1 == time_1ms)
{
time_1ms = 0;
switch(j) //动态刷新函数
{
case 0: //刷新第1个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xfe; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 1: //刷新第2个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xfd; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i];Du_En = 0;
j++;
i++;
break;
case 2: //刷新第3个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xfb; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 3: //刷新第4个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xf7; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 4: //刷新第5个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xef; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 5: //刷新第6个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xdf; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 6: //刷新第7个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0xbf; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j++;
i++;
break;
case 7: //刷新第8个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = 0x7f; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[i]; Du_En = 0;
j = 0;
i = 0;
break;
}
}
}
}
void initial_myself() //上电初始化
{
P0 = 0xff;
We_En = 0; //关位选
Du_En = 0; //关段选
TMOD &= 0xf0;
TMOD |= 0x01; //定时器0模式1
TH0 = 0xfc; //赋初值,时间为1ms
TL0 = 0x66;
}
void initial_peripheral() //外围设备初始化
{
EA = 1;
ET0 = 1;
TR0 = 1;
}
void T0_interrupt() interrupt 1
{
TF0 = 0;
TH0 = 0xfc;
TL0 = 0x66;
time_1ms = 1;
}
void Delayms(uint16 z) //延时函数
{
uint16 x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 100; y++);
}
