#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++)
{;}
}
}
額,貌似你的有點復雜!我有個簡單點的給你吧!用的是595控制的
void out595();
void xieru(uchar num);
void timer_init();
void data_change(uchar num);
void time_change();
void display();
void key_scan();
sbit K1=P1^4;
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
uchar code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar temp,temp2,hour,minute,second,gew,shiw;
//uchar code table2[3];
sbit SDA=P2^0;
sbit SCLK=P2^1;
sbit SLCK=P2^2;
void out595();
void xieru(uchar num);
void xieru(uchar num)
{
uchar i;
for(i=0;i<=7;i++)
{
if((num&0x80)==0x80)
SDA=1;
else
SDA=0;
num<<=1;
SCLK=0;
SCLK=1;
}
}
void out595()
{
SLCK=0;
SLCK=1;
}
void delay(uint z) //延時子程序
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void timer_init()
{
TMOD=0X11;
TH1=0X4C;
TL1=0X00;
EA=1;
ET1=1;
TR1=1;
temp=0;temp2=0;
hour=0;minute=0;second=0;
gew=0;shiw=0;
}
void data_change(uchar num)
{
shiw=num/10;
gew=num%10;
}
void time_change()
{
if(temp==20)
{
temp=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void display()
{
data_change(second);
xieru(TAB[gew]);
xieru(table[7]);
out595();
xieru(TAB[shiw]);
xieru(table[6]);
out595();
data_change(minute);
xieru(TAB[gew]);
xieru(table[4]);
out595();
xieru(TAB[shiw]);
xieru(table[3]);
out595();
data_change(hour);
xieru(TAB[gew]);
xieru(table[1]);
out595();
xieru(TAB[shiw]);
xieru(table[0]);
out595();
}
void key_scan()
{
if(K1==0)
{
delay(5);
{
if(K1==0)
{
while(!K1);
second++;
if(second==60)
{
second=0;
}
}
}
}
if(K2==0)
{
delay(5);
{
while(!K2);
minute++;
if(minute==60)
{
minute=0;
}
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
while(!K3);
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
void t1() interrupt 3
{
TH1=0X4C;
TL1=0X00;
temp++;
time_change();
}
main()函數沒寫,你就自己把它加上吧,應該沒問題吧?
先謝了,回去研究研究
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |