51做的数码管时钟。(第一次发帖 心情比较激动!)
[复制链接]
本人是单片机初学者,菜鸟级别的。。。O(∩_∩)O~~~ 初次发帖!请大家多多指教。
这是我做的数码管时钟程序,写的不是很好,反正我感觉很烂,刚开始学习 。 希望各位高人指点一二! 附上代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
void KEYSCAN();
uchar TEMP,S1,S2,M1,M2,H1,H2;
uchar flag,a,b,NUM;
sbit LED=P3^3;
sbit K1=P3^7;
sbit K2=P3^6;
sbit K3=P3^5;
sbit K4=P3^4;
/********共阳极数码管编码表********************/
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar SECOND,MINUTE,HOUR;
/******初始化子程序*****************************/
void init()
{
TMOD=0x01; //定时器工作方式
TH0=(65535-50000)/256;
TL0=(65535-50000)%256; //装初值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
SECOND=0;
MINUTE=34;
HOUR=12;
LED=1;
}
/**********延时子程序****************************/
void delay_ms(uchar z)
{
uchar x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);
}
/**********显示子函数***************************/
void display(uchar M1,M2,H1,H2)
{
P2=0xfb;
P0=table[M1];
delay_ms(5);
P2=0xf7;
P0=table[M2];
delay_ms(5);
P2=0xfe;
P0=table[H1];
delay_ms(5);
P2=0xfd;
P0=table[H2];
delay_ms(5);
}
/**********定时器中断子程序********************/
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TEMP++;
if(TEMP==10)
{
LED=~LED;
}
if(TEMP==20)
{
TEMP=0;
flag=1;
LED=~LED;
SECOND++;
if(SECOND==60)
{
SECOND=0;
MINUTE++;
if(MINUTE==60)
{
MINUTE=0;
HOUR++;
if(HOUR==24)
{
HOUR=0;
}
}
}
}
}
/*********主函数*************************/
void main()
{
init();
P1=0xff;
a=0xfe;
while(1)
{
H1=HOUR/10;
H2=HOUR%10;
M1=MINUTE/10;
M2=MINUTE%10;
S1=SECOND/10;
S2=SECOND%10;
display(M1,M2,H1,H2);
KEYSCAN();
if(flag==1)
{
flag=0;
P1=a;
a=_cror_(a,1);
}
}
}
/******键盘扫描函数********************/
void KEYSCAN()
{
uint i;
if(K1==0)
{
delay_ms(5);
if(K1==0)
{
NUM++;
if(NUM==3)
NUM=0;
}
switch(NUM)
{
case 1 :
b=1;
while(b)
{
H1=HOUR/10;
H2=HOUR%10;
M1=MINUTE/10;
M2=MINUTE%10;
for(i=100;i>0;i--)
{
P2=0xfb;
P0=table[M1];
delay_ms(5);
P2=0xf7;
P0=table[M2];
delay_ms(5);
P2=0xfe;
P0=table[H1];
delay_ms(5);
P2=0xfd;
P0=table[H2];
delay_ms(5);
}
for(i=100;i>0;i--)
{
P2=0xff;
P0=table[M1];
delay_ms(5);
P2=0xff;
P0=table[M2];
delay_ms(5);
P2=0xfe;
P0=table[H1];
delay_ms(5);
P2=0xfd;
P0=table[H2];
delay_ms(5);
}
if(K1==0)
{
delay_ms(5);
if(K1==0)
{
NUM++;
break;
}
}
if(K2==0)
{
delay_ms(5);
if(K2==0)
{
MINUTE++;
if(MINUTE==60)
MINUTE=0;
}
}
if(K3==0)
{
delay_ms(5);
if(K3==0)
{
MINUTE--;
if(MINUTE<0)
MINUTE=59;
}
}
if(K4==0)
{
delay_ms(5);
if(K4==0)
{
b=0;
}
}
}; break;
case 2:
b=1;
while(b)
{
H1=HOUR/10;
H2=HOUR%10;
M1=MINUTE/10;
M2=MINUTE%10;
for(i=100;i>0;i--)
{
P2=0xfb;
P0=table[M1];
delay_ms(5);
P2=0xf7;
P0=table[M2];
delay_ms(5);
P2=0xfe;
P0=table[H1];
delay_ms(5);
P2=0xfd;
P0=table[H2];
delay_ms(5);
}
for(i=100;i>0;i--)
{
P2=0xfb;
P0=table[M1];
delay_ms(5);
P2=0xf7;
P0=table[M2];
delay_ms(5);
P2=0xff;
P0=table[H1];
delay_ms(5);
P2=0xff;
P0=table[H2];
delay_ms(5);
}
if(K2==0)
{
delay_ms(5);
if(K2==0)
{
HOUR++;
if(HOUR==24)
HOUR=0;
}
}
if(K3==0)
{
delay_ms(5);
if(K3==0)
{
HOUR--;
if(HOUR<0)
HOUR=24;
}
}
if(K4==0)
{
delay_ms(5);
if(K4==0)
{
b=0;
}
}
} ; break;
case 3: NUM=0 ;
}
}
}
|