標(biāo)題: 單片機(jī)矩陣鍵盤掃描誤觸發(fā)的問(wèn)題 [打印本頁(yè)]

作者: simonYlc    時(shí)間: 2017-7-13 00:12
標(biāo)題: 單片機(jī)矩陣鍵盤掃描誤觸發(fā)的問(wèn)題
本人新手
請(qǐng) 大家?guī)托〉芸匆幌?為什么我寫的這個(gè)矩陣鍵盤掃描函數(shù) 會(huì)誤觸發(fā) 像是沒(méi)有消抖功能 小弟百思不得其解 請(qǐng)大家?guī)蛶?謝謝了#define KeyPort P3

unsigned char KeyScan()                        //矩陣掃描,使用行列逐級(jí)掃描法
{
   unsigned char VAL;
   KeyPort=0xf0;//高四位置高,低四位拉低
   if(KeyPort!=0xf0)//表示有按鍵按下
   {
        Delay(10);  //去抖
        if(KeyPort!=0xf0)   //表示有按鍵按下
          {           
                Delay(5);
                if(KeyPort!=0xf0)
                {
                         KeyPort=0xfe; //檢測(cè)第一行
                     if(KeyPort!=0xfe)
                          {
                          VAL=KeyPort&0xf0;
                            VAL+=0x0e;
                        while(KeyPort!=0xfe);
                        Delay(10);
                        while(KeyPort!=0xfe);
                               return VAL;
                         }
                }
        }


        return 0xff;
}


只檢測(cè)了第一行,發(fā)現(xiàn)按鍵的時(shí)候,會(huì)有誤觸發(fā)
我想知道我這個(gè)邏輯哪里有問(wèn)題

作者: 不倒翁.WZT    時(shí)間: 2017-7-13 07:03
標(biāo)題: RE: 單片機(jī)矩陣鍵盤掃描誤觸發(fā)的問(wèn)題
開(kāi)發(fā)板配的矩陣鍵盤程序都非常好,講解的都很詳細(xì),網(wǎng)上也有很多矩陣鍵盤的例子。拿過(guò)來(lái)仔細(xì)分析一下,真正弄懂其原理,再自我發(fā)揮,寫出自己需要的矩陣鍵盤程序。你寫的這段矩陣鍵盤程序,有點(diǎn)看不懂。開(kāi)始鍵值KeyPort賦值0xf0,去抖、延時(shí)后KeyPort又賦值0xfe(KeyPort=0xfe; //檢測(cè)第一行),如果一直有鍵按下KeyPort肯定不等于0xfe,但究竟是哪個(gè)鍵還是不清楚。經(jīng)過(guò)VAL=KeyPort&0xf0; VAL+=0x0e;運(yùn)算后,VAL=0xfe。這個(gè)VAL=0xfe是人為的,不是程序判斷出來(lái)的。只要有鍵一直按下,KeyPort不會(huì)等于0xfe。 while(KeyPort!=0xfe);是成立的,僅此而已。
作者: wulin    時(shí)間: 2017-7-13 07:32
程序修改如下:
#define KeyPort P3
unsigned char keyscan()                                        //矩陣鍵盤掃描函數(shù)
{
        unsigned char temp1,temp2,VAL;                //臨時(shí)變量
        static bit sign=0;                                        //按鍵自鎖標(biāo)志
        static unsigned char count=0;                //消抖計(jì)數(shù)變量
        KeyPort=0xf0;                                                //先給P3賦一個(gè)初值
        if(KeyPort!=0xf0)                                         //判斷P3不等于所賦初值,說(shuō)明有健按下
        {
                if(sign==0)                                                //如果按鍵自鎖標(biāo)志為0
                {
                        count++;                                        //消抖計(jì)數(shù)
                        if(count>=100)                                //消抖計(jì)數(shù)自>=100,估算主循環(huán)周期調(diào)整
                        {                                                        //摒棄Delay延時(shí)方式,提高運(yùn)行效率
                                count=100;                                //防止溢出
                                sign=1;                                        //按鍵自鎖標(biāo)志置1,鍵不抬起,按其他鍵無(wú)效
                                temp1=KeyPort;                        //temp1保存高4位變化
                                KeyPort=0x0f;                        //再給P3賦值0x0f
                                temp2=KeyPort;                        //temp2保存低4位變化
                                VAL=temp2|temp1;                //VAL=高4位+低4位
                                return VAL;                                //返回VAL值
                        }
                }
        }
        else                                                                 //按鍵抬起
        {
                sign=0;                                                        //按鍵自鎖標(biāo)志清0
                count=0;                                                //消抖計(jì)數(shù)清0
        }
}

作者: HC6800-ES-V2.0    時(shí)間: 2017-7-13 08:30
程序問(wèn)題吧。
我這里有一個(gè)例程,你看看。
/*******************************************************************************
* 函 數(shù) 名         : KeyDown
* 函數(shù)功能                   : 檢測(cè)有按鍵按下并讀取鍵值
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                Delay10ms();//延時(shí)10ms進(jìn)行消抖
                if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤是否按下
                {
                       
                        //測(cè)試列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //測(cè)試行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //檢測(cè)按鍵松手檢測(cè)
                        {
                                Delay10ms();
                                a++;
                        }
                }
        }
}
對(duì)應(yīng)電路如圖,看看你的電路和它怎么樣,才能移植。

1.jpg (25.29 KB, 下載次數(shù): 40)

1.jpg





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1