![]() |
發布時間: 2020-7-16 11:27
正文摘要:程序要求按 A 鍵再按 B 鍵后,顯示兩鍵按下之間的時間 t(t <60s),單位為 ms。由于程序框圖的規定要求,我在一位大佬的程序基礎上修改了display()顯示函數,可是修改后能正常顯示,但再一次按下A鍵后沒有反應, ... |
把t=0放到cnt[1]=table[count%10]; m=0; 后面,并使EA=0,在if(A1==0 && flag==0) //按鍵掃描里面添加EA=1; |
剛寫錯了是 if(init==1&&flag==0) |
本帖最后由 1692483014 于 2020-7-16 12:31 編輯 display函數一行改為 if(init==1&&flag==0) 就好了 |
//----------------試試以下代碼 #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit A1=P3^4; sbit A2=P3^5; uint m=0; //uint t,d,e,f; uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12}; uchar cnt[6]={0};//小數緩存 bit flag=0; bit init=0; unsigned long SysTick,count,t; //new add void delay(void) //誤差 0us { unsigned char a,b,c; for(c=67;c>0;c--) for(b=124;b>0;b--) for(a=167;a>0;a--); } void start() { TMOD=0x01; //T0 使用工作方式 1 TH0=(65536-1000)/256; //1ms 定時 TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; } void display() //顯示子程序,從第一位開始逐位顯示't 00秒 000毫秒' { static uint j; if(flag) P0=0xbf;//等待計數時顯示'-' else { if(init==1) for(j=6;j>0;j--) {P0=cnt[j]; delay(); } } } void main(void) { start(); P0=0xb7;//上電提示符 while(1) { if(A1==0) //按鍵掃描 { flag=1; //count=0; //t=0; //init=1; } if(A2==0 && flag==1) { while(!A2); flag=0; cnt[6]=0xbf; cnt[5]=table[t/10000]; cnt[4]=table[t/1000%10];//加秒點 cnt[3]=table[t/100%10]; cnt[2]=table[t/10%10]; cnt[1]=table[t%10]; //m=0; } display(); } } void time0(void) interrupt 1 //T0 中斷服務子程序 { TH0=(65536-1000)/256; TL0=(65536-1000)%256; SysTick++; if(A1==0) { count = SysTick; } if(A2==0 && flag==1) { t = SysTick - count; flag = 0; } } |