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