![]() |
發(fā)布時間: 2017-3-13 01:50
正文摘要:實(shí)現(xiàn)矩陣鍵盤掃描的三種方法(代碼見附件): 1.行列掃描法 2.反轉(zhuǎn)法 3.狀態(tài)機(jī)法(結(jié)合定時器中斷) 第一種和第二種方法的本質(zhì)都是進(jìn)行循環(huán)查詢,大量占用MCU的時間,效率比較低。初學(xué)者一般會學(xué)這兩種 第三種 ... |
感謝分享 |
哇,感謝樓主的分享,給我們這些小白提供了學(xué)習(xí)的資料 |
寫得挺好的,點(diǎn)贊,,我下載了你的狀態(tài)機(jī)程序,,為了省點(diǎn)黑幣,其他兩個我就沒下載了,,我看了后自己有些看法,,如果我同一行一個按鍵壓死,,然后我在同一行按下另一個按鍵呢????還有主函數(shù)10Ms檢測一次,,為什么數(shù)碼管顯示也放在這個里面???上電數(shù)碼管亮我覺得不是上面6#說的, readkey=Keyscan(); Display(readkey); 上電按鍵沒按的換Keyscan()返回的應(yīng)該是0吧,,display(0)對應(yīng)你的數(shù)組不就是全亮???,我覺得應(yīng)該是這樣,試試把數(shù)組的全滅數(shù)據(jù)也就是0x00,放在第一個,,剩下的就按你的按鍵去排顯示的數(shù)據(jù)就好了 |
感謝樓主 |
多謝樓主了 |
感謝樓主分享,學(xué)習(xí)一下 |
學(xué)習(xí)一下 |
很有用。非常感謝分享 |
感謝樓主分享![]() |
之前都是用反轉(zhuǎn)法,現(xiàn)在試試狀態(tài)機(jī) |
目前用的反轉(zhuǎn),出了些問題,剛好學(xué)習(xí)學(xué)習(xí) 多謝樓主了 |
下載看了狀態(tài)機(jī),覺得上電數(shù)碼管亮,好像是初始化顯示函數(shù)Display_init();那里一開始就把位選全打開了,而每10Ms產(chǎn)生一次中斷,主函數(shù)中一開始readkey=0xff;然后if(flag){flag=0;readkey=Keyscan();Display(readkey);一開始10ms就顯示0XFF,覺得這個位選應(yīng)該在按鍵松手才打開,修改如下 void Display_init() { P1=0xFF; //將所有的位選關(guān)閉,所有數(shù)碼管不亮, wela=1; wela=0; P1=0x00; //將段選關(guān)閉,也就是剛開始的時候數(shù)碼管都不亮 dula=1; dula=0; } void Display(uchar num1) { wela=1; P1=0x00; //將所有的位選打開,所有數(shù)碼管同時亮, wela=0; dula=1; P1=smg_duan[num1]; dula=0; } |
參與人數(shù) 1 | 黑幣 +100 | 收起 理由 |
---|---|---|
![]() | + 100 | 回帖助人的獎勵! |
哦,我看的是狀態(tài)機(jī)那個。 下載看了,覺得上電數(shù)碼管亮,好像是初始化顯示函數(shù)Display_init();那里一開始就把位選全打開了,而每10Ms產(chǎn)生一次中斷,主函數(shù)中一開始readkey=0xff;然后if(flag){flag=0;readkey=Keyscan();Display(readkey);一開始10ms就顯示0XFF,覺得這個位選應(yīng)該在按鍵松手才打開,修改如下 void Display_init() { P1=0xFF; //將所有的位選關(guān)閉,所有數(shù)碼管不亮, wela=1; wela=0; P1=0x00; //將段選關(guān)閉,也就是剛開始的時候數(shù)碼管都不亮 dula=1; dula=0; } void Display(uchar num1) { wela=1; P1=0x00; //將所有的位選打開,所有數(shù)碼管同時亮, wela=0; dula=1; P1=smg_duan[num1]; dula=0; } |
下載看了,覺得上電數(shù)碼管亮,好像是初始化顯示函數(shù)Display_init();那里一開始就把位選全打開了,而每10Ms產(chǎn)生一次中斷,主函數(shù)中一開始readkey=0xff;然后if(flag){flag=0;readkey=Keyscan();Display(readkey);一開始10ms就顯示0XFF,覺得這個位選應(yīng)該在按鍵松手才打開,修改如下 void Display_init() { P1=0xFF; //將所有的位選關(guān)閉,所有數(shù)碼管不亮, wela=1; wela=0; P1=0x00; //將段選關(guān)閉,也就是剛開始的時候數(shù)碼管都不亮 dula=1; dula=0; } void Display(uchar num1) { wela=1; P1=0x00; //將所有的位選打開,所有數(shù)碼管同時亮, wela=0; dula=1; P1=smg_duan[num1]; dula=0; } |
![]() |
在劉平老師的《深入淺出玩轉(zhuǎn)51單片機(jī)》里學(xué)習(xí)過狀態(tài)機(jī)法,看得不是太懂。謝樓主分享了。 |
Powered by 單片機(jī)教程網(wǎng)