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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

在書(shū)上看到的程序,總感覺(jué)它中斷里面的掃描緩存有問(wèn)題,有興趣的可以看一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:204609 發(fā)表于 2017-7-14 15:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>

sbit KEY_IN_1  = P2^4;  //矩陣按鍵的掃描輸入引腳1
sbit KEY_IN_2  = P2^5;  //矩陣按鍵的掃描輸入引腳2
sbit KEY_IN_3  = P2^6;  //矩陣按鍵的掃描輸入引腳3
sbit KEY_IN_4  = P2^7;  //矩陣按鍵的掃描輸入引腳4
sbit KEY_OUT_1 = P2^3;  //矩陣按鍵的掃描輸出引腳1
sbit KEY_OUT_2 = P2^2;  //矩陣按鍵的掃描輸出引腳2
sbit KEY_OUT_3 = P2^1;  //矩陣按鍵的掃描輸出引腳3
sbit KEY_OUT_4 = P2^0;  //矩陣按鍵的掃描輸出引腳4
sbit  ADDR0 = P1^0;
sbit  ADDR1 = P1^1;
sbit  ADDR2 = P1^2;
sbit  ADDR3 = P1^3;
sbit  ENLED = P1^4;

unsigned char code LedChar[] = {
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e
};  //數(shù)碼管真值表

unsigned char KeySta[4][4] = {  //全部矩陣按鍵的當(dāng)前狀態(tài),默認(rèn)都未按下
    {1, 1, 1, 1},      //bit類(lèi)型不能定義數(shù)組,因此定義成unsigned char
    {1, 1, 1, 1},
    {1, 1, 1, 1},
    {1, 1, 1, 1}
};

void main(void)
{
    unsigned char i, j;
    unsigned char backup[4][4] = {  //按鍵值備份,保存前一次的值
        {1, 1, 1, 1},
        {1, 1, 1, 1},
        {1, 1, 1, 1},
        {1, 1, 1, 1}
    };

    //選擇最右邊的數(shù)碼管進(jìn)行顯示
    P0 = 0xFF;
    ADDR0 = 0;
    ADDR1 = 0;
    ADDR2 = 0;
    ADDR3 = 1;
    ENLED = 0;

    //配置T0工作在模式1,定時(shí)1ms
    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x67;
    TR0 = 1;
    ET0 = 1;
    EA = 1;

    while(1)
    {
        //檢索按鍵狀態(tài)的變化
        for (i=0; i<4; i++) //i作為行循環(huán)變量
        {
            for (j=0; j<4; j++) //j作為列循環(huán)變量
            {
                if (backup[j] != KeySta[j]) //判斷按鍵動(dòng)作
                {
                    if (backup[j] == 0)   //判斷按鍵彈起
                    {
                        P0 = LedChar[i*4+j]; //執(zhí)行按鍵動(dòng)作
                    }
                    backup[j] = KeySta[j]; //更新前一次的值
                }
            }
        }
    }
}

void InterruptTimer0() interrupt 1
{
    unsigned char i;
    static unsigned char keyout = 0;  //矩陣按鍵掃描輸出計(jì)數(shù)器
    static unsigned char keybuf[4][4] = {  //按鍵掃描緩沖區(qū),保存一段時(shí)間內(nèi)的掃描值
        {0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF}
    };

    TH0 = 0xFC;  //溢出后進(jìn)入中斷重新賦值
    TL0 = 0x67;                                                                                                   按照我們的鍵盤(pán)掃描程序應(yīng)該是中斷1ms鍵值賦值一次并賦值
                                         左移4次則keyout加1轉(zhuǎn)下一列重新掃描16ms掃描完成。而此
                                         程序我發(fā)現(xiàn)中斷1ms雖然會(huì)有鍵值輸入緩存但他會(huì)輸入一次
                                      keyout就增加一次達(dá)不到我們所涉及的效果嗎。或許我分析的
                                        不對(duì),就請(qǐng)各位看一下

    //將一行的4個(gè)按鍵值移入緩沖區(qū)
    keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
    keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
    keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
    keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;

    //消抖后更新按鍵狀態(tài)
    for (i=0; i<4; i++)  //每行4個(gè)按鍵,所以循環(huán)4
    {
        if ((keybuf[keyout] & 0x0F) == 0x00)
        {   //連續(xù)4次掃描值為0,即16ms(4*4ms)內(nèi)都只檢測(cè)到按下?tīng)顟B(tài)時(shí),可認(rèn)為按鍵已按下
            KeySta[keyout] = 0;
        }
        else if ((keybuf[keyout] & 0x0F) == 0x0F)
        {   //連續(xù)4次掃描值為1,即16ms(4*4ms)內(nèi)都只檢測(cè)到彈起狀態(tài)時(shí),可認(rèn)為按鍵已彈起
            KeySta[keyout] = 1;
        }
    }

    //執(zhí)行下一次的掃描輸出
    keyout++;
    keyout &= 0x03;  //用跟0x03做“與”的方式,實(shí)現(xiàn)加到4即歸零,是不是很巧妙,學(xué)會(huì)它吧
    switch (keyout)
    {
        case 0:
            KEY_OUT_4 = 1;
            KEY_OUT_1 = 0;
            break;
        case 1:
            KEY_OUT_1 = 1;
            KEY_OUT_2 = 0;
            break;
        case 2:
            KEY_OUT_2 = 1;
            KEY_OUT_3 = 0;
            break;
        case 3:
            KEY_OUT_3 = 1;
            KEY_OUT_4 = 0;
            break;
        default:
            break;
    }
}


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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2017-7-14 17:08 | 只看該作者
這是哪本誤人子弟的書(shū),這個(gè)例程不值得研究,給你推薦一個(gè)例程,程序很簡(jiǎn)單,一眼看明白:
#include <reg52.h>                                                 //頭文件
#define uchar unsigned char                         //宏定義
#define uint unsigned int                                 //宏定義
uchar key=0;                                                        //鍵值變量

void key_scan()                                                        //矩陣鍵盤(pán)掃描函數(shù)
{
        uchar temp1,temp2,temp3;                        //臨時(shí)變量
        static bit sign=0;                                        //按鍵自鎖標(biāo)志
        static uchar count=0;                                //消抖計(jì)數(shù)變量
        P3=0xf0;                                                        //先給P3賦一個(gè)初值
        if(P3!=0xf0)                                                 //判斷P3不等于所賦初值,說(shuō)明有健按下
        {
                if(sign==0)                                                //如果按鍵自鎖標(biāo)志為0
                {
                        count++;                                        //消抖計(jì)數(shù)
                        if(count>=100)                                //消抖計(jì)數(shù)自>=100,估算主循環(huán)周期調(diào)整
                        {                                                        //摒棄Delay延時(shí)方式,
                                count=100;                                //防止溢出
                                sign=1;                                        //按鍵自鎖標(biāo)志置1,鍵不抬起,按其他鍵無(wú)效
                                temp1=P3;                                //temp1保存高4位變化
                                P3=0x0f;                                //再給P3賦值0x0f
                                temp2=P3;                                //temp2保存低4位變化
                                temp3=temp2|temp1;                //temp3=高4位+低4位
                                key=temp3;                                //保存鍵值
                        }
                }
        }
        else                                                                 //按鍵抬起
        {
                sign=0;                                                        //按鍵自鎖標(biāo)志清0
                count=0;                                                //消抖計(jì)數(shù)清0
        }
}

void main()
{
        while(1)
        {
                key_scan();                                                //鍵盤(pán)掃描
                P1=key;                                                        //LED低電平亮顯示鍵值
        }                                                                               
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:471066 發(fā)表于 2019-2-7 15:21 | 只看該作者
同感,最不喜歡將那些變量名定的又臭又長(zhǎng)的

評(píng)分

參與人數(shù) 7黑幣 +182 收起 理由
jinsheng7533967 + 35
zhengchong60 + 15
站著說(shuō)話不腰疼 + 12
sheng7533967 + 15
shuisheng60 + 35
刀刀見(jiàn)紅 + 35
yoxi + 35

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品99视频 | 91在线一区 | 国产日韩亚洲欧美 | 一区二区三区国产精品 | 亚洲国产激情 | 91精品国产自产在线老师啪 | 色综合久久天天综合网 | 黄色大片观看 | h片在线播放 | 你懂的av | 国产精品成人一区二区 | 欧美久久国产 | a a毛片| 91 视频网站 | 亚洲福利在线视频 | 中文字幕一区二区三区精彩视频 | 亚洲午夜av久久乱码 | 日韩久久久久久 | 午夜精品一区二区三区在线观看 | 亚洲97| 亚洲激情在线观看 | 性一交一乱一透一a级 | 亚洲成人一区二区 | 亚洲高清视频一区二区 | 国产一区二区三区www | 一区二区三区精品视频 | 国产精品久久久久久久久免费桃花 | 国产欧美日韩综合精品一区二区 | 激情一区二区三区 | 欧美一区二区三区四区视频 | 水蜜桃亚洲一二三四在线 | 欧美精品一区二区三区在线 | 久久这里只有 | 欧美在线观看一区 | 欧美日韩亚洲系列 | 亚洲影音 | 91精品在线看 | www国产亚洲精品久久网站 | 91在线视频播放 | 国产乱码精品一区二三赶尸艳谈 | 国产激情精品视频 |