//采用8位LED软件译码动态显示,P0为字段码,P2为位选码,数码管共阳;
//key0为位选键;key1为加“1键;key2为减“1”键。
#include "reg51.h"
#define char unsigned char
char code
dis_7[12]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//4,5,6,7,8,9,"灭”和“-”
char code scan_con[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位的选择
char _data_dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};//显示缓冲区,时,分和秒初始为0,0x0b为“-”的编码
char data timedata[3]={0x00,0x00,0x00};
char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
sbit key0=P1^4;
sbit key1=P1^5;
sbit key2=P1^6;
//1ms延时
delay1ms(int t)
{ int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void deep() //当有效按键被按下时,蜂鸣器响;
{ int i;
for(i=.0;i<10;i++)
{P3^7 = 0;
delay1ms(1);
P3^7 = 1;
}
}
//按键处理
keycan()
{ EA=0;
if(key0==0)
{ delay1ms(10);deep();
while(key0==0);
con++;TR0=0;ET0=0;
if(con>=3)
{ con=0;TR0=1;ET0=1;}
}
if(con!=0)
{ if(key1==0)
{ delay1ms(10);deep();
while(key1==0);
timedata[con]++;
if(con==2) con1=24;else con1=60;
if(timedata[con]>=con1)
{ timedata[con]=0;}
}
}
if(con!=0)
{ if(key2==0)
{delay1ms(10);deep();
while(key2==0);
timedata[con]--;
if(con==2) con2=23;else con2=59;
if(timedata[con]<=0)
{ timedata[con]=con2;}
}
}
EA=1;
}
//数码管显示
scan()
{ char k;
_data_dis[0]=timedata[0]%10; _data_dis[1]=timedata[0]/10;
_data_dis[3]=timedata[1]%10; _data_dis[4]=timedata[1]/10;
_data_dis[6]=timedata[2]%10; _data_dis[7]=timedata[2]/10;
for(k=0;k<8;k++)
{ P0=dis_7[ _data_dis[k]];P2=scan_con[k];delay1ms(1);P2=0xff;}
}
//主函数
main()
{ TH0=0x3c;TL0=0xb0;
TMOD=0x01;ET0=1;TR0=1;EA=1;
while(1)
{ scan();
keycan();
}
}
//定时器/记数器T0中断服务
void time_intt0(void)interrupt 1
{ ET0=0;TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;
ms50++;
if(ms50==20)
{ ms50=0x00;timedata[0]++;
if(timedata[0]==60)
{ timedata[0]=0;timedata[1]++;
if(timedata[2]==24)
{timedata[2]=0;
}
}
} ET0=1;
}