請教高人,我這程序有何問題QQ:619493038,用89C2051,P1口輸出外接反相器,作為SEG驅動口,P3口為掃描信號,其它,按鍵
#include <reg51.h>
unsigned char code seg_code[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
//unsigned char code seg_code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,};
unsigned char set=0;
unsigned char hour=0,min=0,sec=0;
unsigned char base5ms=0;
unsigned char alarm_h=0,alarm_m=0;
bit flash05s=0;
bit Alarm=0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_7=P3^7;
void init_t0();
void scan_key();
void count_time();
void disp_time();
void check_alarm();
void clock();
void delay(unsigned int k);
void alarm_on_off();
void adj_time();
void adj_alarm();
void disp_alarm();
void timer0 (void) interrupt 1
{
TH0=60736/256; // 重新裝初值
TL0=60736%256;
base5ms++; //全局變量+1,代表一個5ms
}
void main()
{
init_t0();
while(1)
{
if(P3_4==0)
scan_key();
switch(set)
{
case 0: clock(); break;
case 1: adj_time();break;
case 2: adj_alarm();break;
case 3: alarm_on_off(); break;
default:break;
}
}
}
void init_t0()
{
TMOD=0x01; // 定時器T0,方式一,16位定時器
TH0=60736/256; //裝初值 12M晶振 4.8ms溢出一次,加上裝初值的時間,中斷保存現場的時間,
TL0=60736%256; //應該大約是5ms
IE=0x82; //開總中斷,開定時器T0中斷
TR0=1; //啟動定時器
}
void scan_key()
{
delay(1); //延時1ms,軟件去除按鍵抖動 (注:1ms是不是有點短啊,實際測試為準吧)
if(P3_4==0)
set++;
if(set>=4)
set=0;
while(P3_4==0){;}
}
void clock()
{
count_time();
disp_time();
check_alarm();
}
void count_time()
{
if(base5ms<=100)
flash05s=0;
else
flash05s=1;
if(base5ms>=200)
{
sec++;
base5ms=0;
}
if(sec==60)
{
min++;
sec=0;
}
if(min==60)
{
hour++;
min=0;
}
if(hour==24)
{
hour=0;
}
}
void disp_time()
{
P1=seg_code[hour/10];
P3&=0xf7; //P3.3=0;
delay(1);
P1=seg_code[hour%10];
P3&=0xfb; //p3.2=0;
delay(1);
if(flash05s==1) //沒間隔0.5S,小數點閃爍一次
{
if(P3_2==0)
P1_7=0;
else
P1_7=1;
}
delay(1);
P1=seg_code[min/10];
P3&=0xfd; //p3.1=0;
delay(1);
if(Alarm==1)
{
if(P3_1==0)
P1_7=0;
else
P1_7=1;
delay(1);
}
P1=seg_code[min%10];
P3&=0xfe; //p3.0=0;
delay(1);
}
void check_alarm()
{
if(Alarm==1)
{
if(hour==alarm_h)
{
if(min==alarm_m)
if(P3_0==0)
{
P1_7=0;
delay(1);
}
else
P1_7=1;
}
if(P3_5==0||P3_7==0)
{
delay(1);
if(P3_5==0||P3_7==0)
Alarm=0;
}
}
}
void alarm_on_off()
{
unsigned char i;
if(P3_5==0)
Alarm=1;
for(i=0; i<30; i++)
{
disp_alarm();
P1=seg_code[alarm_m/10];
P3=0xfd;
delay(1);
if(P3_1==0)
{
if(Alarm==1)
P1_7=0;
}
else
P1_7=1;
delay(1);
}
if(P3_7==0){
delay(1);
if(P3-7==0)
Alarm=0;
for(i=0;i<30;i++)
{
disp_alarm();
P1=seg_code[alarm_m/10];
P3=0xfd;
delay(1);
if(P3_1==0)
{
if(Alarm==1)
P1_7=0;
else P1_7=1;
}
delay(1);
}
}
}
void delay(unsigned int k) //延時k ms
{
unsigned int i,j;
for(i=0; i<k; i++)
for(j=0; j<300; j++);
}
void adj_time()
{
unsigned char i;
if(P3_5==0)
{
delay(1);
if(P3_5==0)
hour++;
if(hour==24)
hour=0;
for(i=0; i<30; i++)
{
disp_time();
if(P3_2==0)
P1_7=0;
else
P1_7=1;
delay(1);
}
}
if(P3_7==0)
{
delay(1);
if(P3_7==0)
min++;
if(min==60)
min=0;
for(i=0; i<30; i++)
{
disp_time();
if(P3_2==0)
P1_7=0;
else
P1_7=1;
delay(1);
}
}
}
void adj_alarm()
{
unsigned char i;
if(P3_5==0)
{
delay(1);
if(P3_5==0)
alarm_h++;
if(alarm_h==24)
alarm_h=0;
for(i=0;i<30;i++)
{
disp_alarm();
}
}
if(P3_7==0)
{
delay(1);
if(P3_7==0)
alarm_m++;
if(alarm_m==60)
alarm_m=0;
for(i=0;i<30;i++)
{
disp_alarm();
}
}
}
void disp_alarm()
{
P1=seg_code[alarm_h/10];
P3=0xf7;
delay(1);
if(P3_3==0)
P1_7=0;
else
P1_7=1;
delay(1);
P1=seg_code[alarm_h%10];
P3=0xfd;
delay(1);
P1=seg_code[alarm_m/10];
P3=0xfd;
delay(1);
|
|