https://static.assets-stash.eet-china.com/album/old-resources/2009/5/14/76e7a252-30fc-4b5f-b440-5e6e8f0fc30c.rar//程序功能:时钟显示
//s1按键功能, 秒加一
//s2按键功能, 分加一
//s3按键功能,小时加一
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
//*************************************************
#include<reg51.h>
#define K 2
#define x 50
#define M 240
code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff}; //共阳数码管段码
unsigned int cnt="0"; //由于底下的cnt用到了4000,所以这时不能定义成char类型(最大才255)
unsigned char sec="0";
unsigned char min="0";
unsigned char hour="0";
void delay(int m)
{
unsigned char i,j;
for(i=0;i<m;i++)
for(j=0;j<100;j++);
}
void LED_display() //显示
{
P2=0x01; //选通第一位
P0=seg7code[hour/10]; //显示小时十位
delay(K);
P0=0xff; //消隐
P2=0x02; //选通第二位
P0=seg7code[hour%10]; //显示小时个位
delay(K);
P0=0xff; //消隐
P2=0x04; //选通第三位
P0=0xbf;
delay(K);
P0=0xff;
P2=0x08; //选通第四位
P0=seg7code[min/10]; //显示分十位
delay(K);
P0=0xff; //消隐
P2=0x10; //选通第五位
P0=seg7code[min%10]; //显示分个位
delay(K);
P0=0xff; //消隐
P2=0x20; //选通第六位
P0=0xbf;
delay(K);
P0=0xff;
P2=0x40; //选通第七位
P0=seg7code[sec/10]; //显示秒十位
delay(K);
P0=0xff; //消隐
P2=0x80; //选通第八位
P0=seg7code[sec%10]; //显示秒个位
delay(K);
P0=0xff; //消隐
}
void timer0 (void) interrupt 1 using 0
{
cnt++; //每过250us,cnt加一
if(cnt==4000) //250*4000=1s
{
cnt=0;
sec++;
if(sec==60) //60秒,重新计数,分钟加一
{ sec="0";
min++;
if(min==60) //60分,重新计数,小时加一
{
min=0;
hour++;
if(hour==13) //12个小时,重新计数
{hour=1;}
}
}
}
}
void intserv0 (void) interrupt 0 // 外部中断0,秒加1
{
sec++;
if(sec==60)
sec=0;
}
void intserv1 (void) interrupt 2 // 外部中断1.分加1
{
min++;
if(min==60)
min=0;
}
void timer1 (void) interrupt 3 // T1改为外部中断,小时加1
{
hour++;
if(hour==13)
hour=1;
}
main()
{
TMOD=0x62; //T0,方式2
EA=1; //开总中断
EX0=1;
EX1=1;
IT0=1;
IT1=1;
ET0=1; //开定时器T0中断
ET1=1; //开定时器T1中断
TH1=0XFF;
TL1=0XFF;
TR1=1;
TH0=0x06; //<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />12.0M的定时中断
TL0=0x06;
TR0=1;
while(1)
{
LED_display();
}
}
文章评论(0条评论)
登录后参与讨论