#include <at89x51.h>
unsigned char flag,min,sec,led0,led1,led2,led3;
unsigned int times;
bit key1;
unsigned char dispcode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}; //0~9 字位码,0xFF为"灭".
unsigned char act[4]={0x01,0x02,0x03,0x04}; //数码管位选。
void display();
void flashdisp(int n);
void delay(unsigned int count);
// ***主程序***//
void main(void)
{
TMOD=0x01; //定时方式1
IT0=0; //电平触发方式,低电平有效。
min=0; //初始化min,sec ,和标志位。
sec=0;
times=0;
key1=0;
flag=0;
ET0=1;
EX0=1;
EA=1;
TH0=0xFF;
TL0=0xB0;
TR0=1;
while(1)
{
display();
while(flag==1)
{
P1=act[0];
display();
delay(100);
P2=0xFF;
delay(100);
}
while(flag==2)
{
P1=act[1];
display();
delay(100);
P2=0xFF;
delay(100);
}
while(flag==3)
{
P1=act[2];
display();
delay(100);
P2=0xFF;
delay(100);
}
while(flag==4)
{
P1=act[3];
display();
delay(100);
P2=0xFF;
delay(100);
}
}
}
// ***定时中断服务子程序***//
void timer0(void) interrupt 1
{
TH0=0xFF;
TL0=0xB0;
times++;
if(times>=10000)
{
times=0;
sec++;
if(sec>=60) {sec=0;min++;}
if(min>=60) {min=0;}
}
}
// ***外部中断0处理子程序***//
void extern_int1(void) interrupt 0
{
EA=0;
delay(5);
if(P3^7==0)
{
key1=!key1; //停止计时;
if(key1==0){TR0=1;}
if(key1==1){TR0=0;}
}
if((P3^6==0)&&key1==1)
{
flag++;
if(flag>4){flag=0;}
}
if(P3^5==0&&key1)
{
switch(flag)
{
case 1:min=sec+1;break;
case 2:min=sec+10;break;
case 3:min=min+1;break;
case 4:min=min+10;break;
default:break;
}
}
EA=1;
}
//显示//
void display()
{
led0=min/10;
led1=min%10;
led2=sec/10;
led3=sec%10;
P1=act[0];
P2=dispcode[led3];
delay(10); //延迟10ms。
P1=act[1];
P2=dispcode[led2];
delay(10); //延迟10ms。
P1=act[2];
P2=dispcode[led1];
delay(10); //延迟10ms。
P1=act[3];
P2=dispcode[led0];
delay(10); //延迟10ms。
}
// ***延时子程序***//
void delay( unsigned int count)
{
int j;
while(count--!=0)
{
for(j=0;j<121;j++)
{;}
}
}
这是本人的程序,三个按键实现调时开关,选位,加一,分别接p3.7,3.6,3.5.同时三个键通过两个与门接到外部中断p3.2上,由外部中断判断按键是否按下,再读p3.73.63.5判断那个键按下,用protues仿真,能计时显示,调时功能不能实现,请高手指教!!!! |