請教高人,我這程序有何問題
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);
}
[此貼子已經被作者于2012-11-30 12:05:14編輯過]
|