找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

行列掃描法,反轉(zhuǎn)法,狀態(tài)機(jī)法三種矩陣鍵盤掃描方法詳解 帶程序

查看數(shù): 31576 | 評論數(shù): 16 | 收藏 16
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(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é)這兩種 第三種 ...

回復(fù)

ID:658887 發(fā)表于 2019-12-8 15:50
感謝分享
ID:644656 發(fā)表于 2019-11-18 21:52
哇,感謝樓主的分享,給我們這些小白提供了學(xué)習(xí)的資料
ID:207882 發(fā)表于 2019-7-14 17:20
寫得挺好的,點(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ù)就好了
ID:558624 發(fā)表于 2019-7-13 22:00
感謝樓主
ID:413383 發(fā)表于 2019-6-10 00:03
多謝樓主了
ID:380988 發(fā)表于 2018-12-2 14:45
感謝樓主分享,學(xué)習(xí)一下
ID:430148 發(fā)表于 2018-11-20 20:07
學(xué)習(xí)一下
ID:286251 發(fā)表于 2018-5-26 15:32
很有用。非常感謝分享
ID:203654 發(fā)表于 2018-5-24 10:46
感謝樓主分享,學(xué)習(xí)一下
ID:168002 發(fā)表于 2018-3-7 13:33
之前都是用反轉(zhuǎn)法,現(xiàn)在試試狀態(tài)機(jī)
ID:213328 發(fā)表于 2017-7-24 14:24
目前用的反轉(zhuǎn),出了些問題,剛好學(xué)習(xí)學(xué)習(xí)
多謝樓主了
ID:184846 發(fā)表于 2017-4-19 09:11
下載看了狀態(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 收起 理由
admin + 100 回帖助人的獎勵!

查看全部評分

ID:184846 發(fā)表于 2017-4-19 08:31
哦,我看的是狀態(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;       
}
ID:184846 發(fā)表于 2017-4-19 08:30
下載看了,覺得上電數(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;       
}
ID:184846 發(fā)表于 2017-4-15 17:14
就是沒有金幣了
ID:135835 發(fā)表于 2017-3-13 16:45
在劉平老師的《深入淺出玩轉(zhuǎn)51單片機(jī)》里學(xué)習(xí)過狀態(tài)機(jī)法,看得不是太懂。謝樓主分享了。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表