久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3957|回復: 8
收起左側

按鍵延程序能否改進?

[復制鏈接]
ID:140568 發表于 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的數量;
2.增加keybuf=(keybuf<<1)| k2;
這樣覺得很不智能。并且也繁瑣。

回復

使用道具 舉報

ID:123289 發表于 2016-10-3 15:55 | 顯示全部樓層
程序不加注釋,不是好習慣,別人不好讀。
回復

使用道具 舉報

ID:140568 發表于 2016-10-3 18:16 | 顯示全部樓層
yzwzfyz 發表于 2016-10-3 15:55
程序不加注釋,不是好習慣,別人不好讀。

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

使用道具 舉報

ID:140568 發表于 2016-10-3 18:17 | 顯示全部樓層
yzwzfyz 發表于 2016-10-3 15:55
程序不加注釋,不是好習慣,別人不好讀。

#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[] = { //數碼管顯示字符轉換表
    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; //按鍵計數,記錄按鍵按下的次數
   
    ENLED = 0;  //選擇數碼管 DS1 進行顯示
    ADDR3 = 1;
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0;
    P2 = 0xF7;  //P2.3 置 0,即 KeyOut1 輸出低電平
    P0 = LedChar[cnt];  //顯示按鍵次數初值

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

使用道具 舉報

ID:140568 發表于 2016-10-3 18:19 | 顯示全部樓層
yzwzfyz 發表于 2016-10-3 15:55
程序不加注釋,不是好習慣,別人不好讀。

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

使用道具 舉報

ID:123289 發表于 2016-10-8 01:35 | 顯示全部樓層
基本思路正確。有改進的地方。
回復

使用道具 舉報

ID:123289 發表于 2016-10-8 01:38 | 顯示全部樓層
先說不好的地方:
1、硬件延時防彈動,浪費CPU資源,延時時間也不機動。可以用中斷處理。
2、單鍵處理,不“經濟”,可以一次性全部處理。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美国产精品 | 欧美亚洲网站 | 天堂中文在线观看 | 国产成人99久久亚洲综合精品 | 99久久久国产精品 | www.99热| 一区二区三区在线播放视频 | 91视频在线观看 | 午夜影院在线 | 黄免费观看视频 | 成人国产精品免费观看 | 91久久 | 亚洲国产欧美国产综合一区 | 国产91九色 | 精品国产一区二区三区免费 | 日韩成人在线免费视频 | 亚洲视频 欧美视频 | 国产午夜精品一区二区三区四区 | www.4hu影院 | 欧美1区 | 国产精品91久久久久久 | 国产精品久久久久久久久久免费看 | 日韩精品成人av | 日韩在线| 国产成人免费视频网站视频社区 | 欧美美女被c | 中文字幕欧美日韩 | 高清av在线 | 国产亚韩 | 91久久久久久久久久久 | 久久久久久久久精 | 免费毛片网站 | 久久免费视频2 | 欧美一区二区三区视频在线 | 久久久久久91 | www.亚洲一区二区三区 | 国产精品一区二区三区在线 | 97超在线视频 | 日韩成人免费中文字幕 | www.成人久久 | 日本在线综合 |