找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3965|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

按鍵延程序能否改進?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140568 發(fā)表于 2016-10-3 13:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//êyÂë1üÏÔê¾·û
sbit k1=P3^2;
sbit k2=P3^6;
bit keysta=1;/
void main(){
                bit backup=1;/
                unsigned char cnt=0;//°′¼üμļÆêyμÄ′Îêy
                TMOD=0X01;
                TH0=0XF8;
                TL0=0XCD;
                ET0=1;
                TR0=1;
                EA=1;
                P2=seg[cnt];
                while(1){
                                if(keysta!=backup){
                                        if(backup==0){
                                                cnt++;
                                                if(cnt>=10){
                                                        cnt=0;
                                                }
                                                P2=seg[cnt];
                                        }
                                        backup=keysta;
                        }
        }
}
void tm()interrupt 1
{
        static unsigned char keybuf=0xff;
        TH0=0XF8;
        TL0=0XCD;
        keybuf=(keybuf<<1)| k1;
        if(keybuf==0xfe){
                keysta=0;
        }
        else if(keybuf==0xff){
                keysta=1;
        }
}
               
如果我是二個按鍵是不是要:
1.增加backup的數(shù)量;
2.增加keybuf=(keybuf<<1)| k2;
這樣覺得很不智能。并且也繁瑣。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2016-10-3 15:55 | 只看該作者
程序不加注釋,不是好習(xí)慣,別人不好讀。
回復(fù)

使用道具 舉報

板凳
ID:140568 發(fā)表于 2016-10-3 18:16 | 只看該作者
yzwzfyz 發(fā)表于 2016-10-3 15:55
程序不加注釋,不是好習(xí)慣,別人不好讀。

我本來加注釋的,可是一復(fù)制來這里就是亂碼!可惡啊~
回復(fù)

使用道具 舉報

地板
ID:140568 發(fā)表于 2016-10-3 18:17 | 只看該作者
yzwzfyz 發(fā)表于 2016-10-3 15:55
程序不加注釋,不是好習(xí)慣,別人不好讀。

#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;

unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void delay();
void main(){
    bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值
    bit backup = 1; //按鍵值備份,保存前一次的掃描值
    unsigned char cnt = 0; //按鍵計數(shù),記錄按鍵按下的次數(shù)
   
    ENLED = 0;  //選擇數(shù)碼管 DS1 進行顯示
    ADDR3 = 1;
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0;
    P2 = 0xF7;  //P2.3 置 0,即 KeyOut1 輸出低電平
    P0 = LedChar[cnt];  //顯示按鍵次數(shù)初值

    while (1){
        keybuf = KEY4;  //把當(dāng)前掃描值暫存
        if (keybuf != backup){  //當(dāng)前值與前次值不相等說明此時按鍵有動作
            delay();  //延時大約 10ms
            if (keybuf == KEY4){  //判斷掃描值有沒有發(fā)生改變,即按鍵抖動
                if (backup == 0){  //如果前次值為 0,則說明當(dāng)前是彈起動作
                    cnt++;  //按鍵次數(shù)+1
                    //只用 1 個數(shù)碼管顯示,所以加到 10 就清零重新開始
                    if (cnt >= 10){
                       cnt = 0;
                    }
                    P0 = LedChar[cnt]; //計數(shù)值顯示到數(shù)碼管上
                }
                backup = keybuf; //更新備份為當(dāng)前值,以備進行下次比較
            }
        }
    }
}
/* 軟件延時函數(shù),延時約 10ms */
void delay(){
    unsigned int i = 1000;
    while (i--);
}
回復(fù)

使用道具 舉報

5#
ID:140568 發(fā)表于 2016-10-3 18:19 | 只看該作者
yzwzfyz 發(fā)表于 2016-10-3 15:55
程序不加注釋,不是好習(xí)慣,別人不好讀。

我想要添加為二個按鍵我的思路就是上面的這樣!對比就采用數(shù)組的形式。unsigned char keysta[2]={1,1};可以不?
回復(fù)

使用道具 舉報

6#
ID:123289 發(fā)表于 2016-10-8 01:35 | 只看該作者
基本思路正確。有改進的地方。
回復(fù)

使用道具 舉報

7#
ID:123289 發(fā)表于 2016-10-8 01:38 | 只看該作者
先說不好的地方:
1、硬件延時防彈動,浪費CPU資源,延時時間也不機動。可以用中斷處理。
2、單鍵處理,不“經(jīng)濟”,可以一次性全部處理。
回復(fù)

使用道具 舉報

8#
ID:123289 發(fā)表于 2016-10-8 02:38 | 只看該作者
鍵有效判定原則:
方法:有效時,置鍵有效B_INPUT=1標(biāo)記,表求按鍵有效;再置B_KEYPUSHED=1,表示有鍵已按下。
下列狀況無效:
1、本次采樣值與上次鍵值不同。
2、本次采樣值與上次鍵值相同,但相同的時間不足(如30ms)。
3、無按鍵(雖然永遠相同)
4、按下未松開B_KEYPUSHED=1。
回復(fù)

使用道具 舉報

9#
ID:123289 發(fā)表于 2016-10-8 02:39 | 只看該作者
技巧:
1、將各鍵放于同一個口,如P1(不要P1放一個鍵,P2放一個鍵),這樣可以一次采樣8個鍵,而無需一一采樣、識別、處理。
2、采樣是鍵值存入20H-2FH單元中(51系列,比如22H,22H.0至22H.7共對應(yīng)8個鍵,這樣各鍵可直接尋址),且以BYTE存入,這樣,一次性可以處理8個鍵值。不要分放在不同的BYTE中!
3、上次的采樣鍵值,也用BYTE對應(yīng)保存(位對位對齊,比如32H,每位對應(yīng)一個鍵)。
4、本次采樣與上次采樣是否相同,只要22H XOR 32H 即可判定出來(所有8個鍵),=0同,<>0至少有一個不同(作彈動處理)。
5、用中斷防止彈動,如5ms中斷一次,每次中斷就采樣一次,計時彈動一次。
6、彈動用計次的方式,例如,對“本次采樣與上次采樣相同”計次,不同就清0(彈動中),相同+1(計時5ms),計滿6次(即30ms無彈動)可認為按鍵已穩(wěn)定OK。
7、用一個BITE(如:B_KEYOK),統(tǒng)一表示所有的按鍵OK。
8、當(dāng)按鍵已穩(wěn)定OK后,置B_KEYOK=1,表示有鍵成功。而鍵值必定在22H中,檢查22H中各個位的0或1,即可知道是哪個鍵按下了,甚至可以判定多鍵齊按。
9、主程序中(使用鍵值的程序)只在B_KEYOK=1處理鍵值(B_KEYOK=0,則鍵無效,無需一一檢查各個鍵),在完成鍵處理程序后,清B_KEYOK=0,即可。
10、當(dāng)然無按鍵情況下的穩(wěn)定,需要排除(這也是個穩(wěn)定狀態(tài))。
11、更高級技巧:
    增加長按計數(shù)器,通過計數(shù)值的多少,可以區(qū)分出長按的鍵(并可機動地改變長按判定時間);用于做長按連+/-加、快速+/-。
    增加已按標(biāo)記,可處理按住不放,防止按長了,被誤處理多次;
    ……
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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