![]() |
發(fā)布時間: 2017-7-26 21:43
正文摘要:我想寫個秒表, 第一個圖是按下第一個按鍵的時候啟動定時器,讓秒表開始走,但是按下后要等1秒左右吧才會開始走。 第二個圖是想把這時候數(shù)碼管顯示的值儲存到AT24C02中,但是按下那個鍵后又停頓了。 那個fl ... |
加個松手檢測 |
wulin 發(fā)表于 2017-7-27 09:32 不知道是不是delay的關(guān)系,我之前計時的開關(guān)是直接控制定時器的開關(guān),大概因為這樣所以有延遲吧,用了你的那種暫停標(biāo)志的寫法就解決了,順帶連記錄數(shù)據(jù)時的延遲也解決了。謝謝啊 |
動態(tài)數(shù)碼管顯示+按鍵操作切不可用delay軟件延時,否則互相干擾,給你一個6位數(shù)碼管99分鐘百分秒表程序參考。 #include <AT89X52.H> #define uint unsigned int //宏定義無符號整型數(shù)據(jù) #define uchar unsigned char //宏定義無符號字符型數(shù)據(jù) sbit key1=P3^6; sbit dula=P2^6; //段 sbit wela=P2^7; //位 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar swan,wan,qian,bai,shi,ge; uchar Cnt1ms=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0; //中斷計時變量 bit zantin=0; //暫停標(biāo)志 //unsigned long Cnt1s=0; //秒變量 void display(); void conversion(); void keyscan(); /***********按鍵掃描程序****************/ void keyscan() { static uchar count2=0,count1=0; //計數(shù)變量 static bit key_sign=0; //按鍵狀態(tài)標(biāo)志 if(key1==0) //檢測輸入如果為0 { count1++; //計數(shù)延時消抖 if(count1>=20) //20次檢測按鍵如果為0 { count1=20; //防止溢出 if(key_sign==0) //按鍵狀態(tài)標(biāo)志為0 { key_sign=1; //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng) count2++; if(count2>=3) count2=0; switch(count2) { case 0: Cnt1ms=0; Cnt10ms=0; Cnt1s=0; Cnt1min=0; break;//清0 case 1: zantin=1; break;//計時 case 2: zantin=0; break;//暫停 } } } } else { count1=0; //計數(shù)變量清0 key_sign=0; //按鍵狀態(tài)標(biāo)志清0 } } /***********定時器初始化程序****************/ void Timer0Init() //1毫秒@11.0592MHz { TMOD = 0x01; //設(shè)置定時器模式 TL0 = 0x66; //設(shè)置定時初值 TH0 = 0xFC; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 EA=1; //開總中斷 ET0=1; //開定時器0中斷 } /***************主程序****************/ void main() { Timer0Init(); //定時器初始化 while(1) { keyscan(); //按鍵掃描 conversion(); //數(shù)字分解 } } /**************中斷服務(wù)程序*****************/ void timer0() interrupt 1 { TL0 = 0x66; //設(shè)置定時初值 TH0 = 0xFC; //設(shè)置定時初值 Cnt1ms++; //中斷變量Cnt1ms自+1 if(Cnt1ms>=10) //10ms { Cnt1ms=0; //清0 if(zantin==1) //暫停/啟動 Cnt10ms++; //毫秒計數(shù) if(Cnt10ms>=100) { Cnt10ms=0; Cnt1s++; //秒計數(shù) if(Cnt1s>=60) { Cnt1s=0; Cnt1min++; //分計數(shù) if(Cnt1min>=100) Cnt1min=0; } } } display(); //顯示程序 } void display()//顯示程序 { static uchar count=0; //計數(shù)變量 switch(count) { case 0: dula=0; P0=table[swan]; //顯示十萬位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; count=1; break; case 1: dula=0; P0=table[wan]; //顯示萬位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; count=2; break; case 2: P0=table[qian]; //顯示千位 dula=1; dula=0; P0=0x7b; wela=1; wela=0; count=3; break; case 3: P0=table[bai]; //顯示百位 dula=1; dula=0; P0=0x77; wela=1; wela=0; count=4; break; case 4: P0=table[shi]; //顯示十位 dula=1; dula=0; P0=0xef; wela=1; wela=0; count=5; break; case 5: P0=table[ge]; //顯示個位 dula=1; dula=0; P0=0xdf; wela=1; wela=0; count=0; break; } } void conversion() { swan = Cnt1min/10; // 十萬位 wan = Cnt1min%10; // 萬位 qian = Cnt1s/10; // 千位 bai = Cnt1s%10; // 百位 shi = Cnt10ms/10; // 十位 ge = Cnt10ms%10; // 個位 } |
參與人數(shù) 1 | 黑幣 +2 | 收起 理由 |
---|---|---|
![]() | + 2 | 很給力! |
Powered by 單片機教程網(wǎng)