![]() |
發布時間: 2023-10-19 20:16
正文摘要:要求:按鍵1啟動秒表,數碼管共陽 按鍵2停止秒表,顯示當前值 再按下按鍵1則從0開始計時,重復上述過程 計時范圍0-59,采用顯示緩沖器的方法 ... |
jhczy 發表于 2023-10-20 10:44 用仿真的軟件調試過了,但還是個十位同時計時,這就是問題 |
jhczy 發表于 2023-10-20 10:40 按照你說的確實是可以從0開始計時,這個主意好棒。 |
錯誤比比皆是,給你改了。
![]()
|
程序中修改的地方較多,可以先用仿真軟件調試,將程序調通。如果有板子,可以調整修改程序,理清程序運行流程 |
程序中當“flags==0”時,“a+1”,所以,顯示不可能有0的,需將“seg_buf[0]=seg[a%10]; //低位 seg_buf[1]=seg[a/10]; //高位”調整到flags==0的外面 |
后來修改成這個樣子,但還是兩個同時計時,而且按下按鍵1不可以從0開始,而是從1開始,而且為什么從一到二需要的時間比二到三時間更多 #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段碼 uchar code seg_scan[]={10,10,10,10};//位選碼 uchar seg_buf[2]={0x01,0x02};//數碼管顯示緩沖區 void t0();//t0初始化 void ex();//外部中斷初始化 void display(uchar date,uchar get);//數碼管顯示函數 void delayme(uint xms);//延時函數 uchar a=0,count=0; uchar flags=0;//定時標志 void main() { t0(); ex(); while(1) {if(flags==0) { flags=1; a++; if(a>=60) { a=0; } seg_buf[0]=seg[a%10]; //低位 seg_buf[1]=seg[a/10]; //高位 } } } void display(uchar date,uchar get) { P2 = (P2&0x1f)|0xc0; P0=0X01<<get; P2 = (P2&0x1f)|0xf9; P0=date; } void t0() { TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; //打開t0中斷開關 PT0=0; EA=1; //打開中斷總開關 } void ex() { IT0=1; EX0=1; PX0=1; IT1=1; EX1=1; PX1=1; EA=1; } void t0_int() interrupt 1 { uchar i=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count>=20) {count=0; flags=0; } P0=0XFF; switch(i) { case 0:i++;display(seg_buf[0],1);break; case 1:i++;display(seg_buf[1],0);break; default:break; } } void key1()interrupt 0 { TR0=1;//啟動t0 a=0x00; IE0=0;//清int0中斷標志位 } void key2()interrupt 2 { TR0=0;//啟動t0 IE1=0;//清int1中斷標志位 } |