欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2587|回復: 2
打印 上一主題 下一主題
收起左側

單片機矩陣按鍵掃描

[復制鏈接]
跳轉到指定樓層
樓主
#ifndef  __KEY_H
#define __KEY_H
#include "stc8.h"
#define GPIO_KEY P0              // 定義按鍵I/O口

/*
*函數名:delay_ms
*描述    :延時函數(ms級)
*/
void delay_ms(unsigned int xms)
{
      unsigned int i,j;
      for(i=xms;i>0;i--)
           for(j=110;j>0;j--);
}
/*
*函數名:key_scan
*描述   :獲取按下的鍵值。
*返回值:鍵值
*/
unsigned char key_scan(void)
{
        unsigned char keyvalue1='#',keyvalue2='#';
        GPIO_KEY = 0xf0;
        if(GPIO_KEY != 0xf0)
        {
                delay_ms(10);
                if(GPIO_KEY != 0xf0)
                {
                       //確定按下按鍵所在列數:(或0或1或2或3),并賦值給keyvalue1
                        GPIO_KEY=0xf0;                     
                        switch(GPIO_KEY)
                        {
                        case 0xe0: keyvalue1 = 3;break;
                        case 0xd0: keyvalue1 = 2;break;
                        case 0xb0: keyvalue1 = 1;break;
                        case 0x70: keyvalue1 = 0;break;
                        default:keyvalue='#';break;
                        }
                        //確定按下按鍵所在行數:keyvalue1(或+0或+4或+8或+12),并賦值給keyvalue2
                        GPIO_KEY=0x0f;
                        if((GPIO_KEY != 0x0d)||(GPIO_KEY != 0x0b)||(GPIO_KEY != 0x07))
                                keyvalue2 = keyvalue1;
                        if(GPIO_KEY == 0x0d)
                                keyvalue2 = keyvalue1+4;
                        if(GPIO_KEY == 0x0b)
                                keyvalue2 = keyvalue1+8;
                        if(GPIO_KEY == 0x07)
                                keyvalue2 = keyvalue1+12;
                        while(GPIO_KEY!=0x0f);
                }
        }
        return keyvalue2;
}
#endif


矩陣鍵盤引腳圖.PNG (51.74 KB, 下載次數: 45)

矩陣按鍵引腳圖

矩陣按鍵引腳圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:427492 發表于 2019-6-27 10:41 | 只看該作者
本帖最后由 楓樹566 于 2019-6-27 18:29 編輯

矩陣按鍵修改版:(說明:只有按下的瞬間返回值為鍵值,其他時間鍵值為16)
#include "key.h"

#define GPIO_KEY P0         // 重定義I/O口0

/*************************************************
* 函數名:delay_ms
* 描述  :延時函數
* 參數  :xms  , xms是幾延時幾毫秒
* 返回值:無
* 調用  :內部調用
*************************************************/
void delay_ms(u16 xms)
{
        unsigned char i, j;
        unsigned int x;
        for(x=xms;x>0;x--)
        {
                i = 16;
                j = 147;
                do
                {
                        while (--j);
                } while (--i);
        }
}
/*************************************************
* 函數名:key_scan
* 描述  :把按下的矩陣按鍵的鍵值返回
* 參數  :無
* 返回值:按下的鍵值
* 調用  :外部調用
*************************************************/
u8 key_scan()
{
        u8 keyvalue1,keyvalue2,a=0;
        GPIO_KEY = 0xf0;              // 高四位為1,低四位為0
        if(GPIO_KEY != 0xf0)
        {
                delay_ms(10);             // 延時消抖
                if(GPIO_KEY != 0xf0)
                {
                        GPIO_KEY=0xf0;
                        switch(GPIO_KEY)
                        {
                        case 0xe0: keyvalue1 = 3;break;     // 確定矩陣按鍵被按下的位置是第幾列
                        case 0xd0: keyvalue1 = 2;break;     // 0、1、2、3
                        case 0xb0: keyvalue1 = 1;break;
                        case 0x70: keyvalue1 = 0;break;
                        }
                        GPIO_KEY=0x0f;        
                        // 確定矩陣按鍵被按下位置的鍵值:列(或0或1或2或3) + 行(或0或4或8或12)
                        if((GPIO_KEY != 0x0d)||(GPIO_KEY != 0x0b)||(GPIO_KEY != 0x07))
                                keyvalue2 = keyvalue1;
                        if(GPIO_KEY == 0x0d)
                                keyvalue2 = keyvalue1+4;
                        if(GPIO_KEY == 0x0b)
                                keyvalue2 = keyvalue1+8;
                        if(GPIO_KEY == 0x07)
                                keyvalue2 = keyvalue1+12;
                        while((a<50)&&(GPIO_KEY!=0x0f))
                        {
                                delay_ms(10);
                                a++;
                        }
                }                        
        }
        if(GPIO_KEY==0xF0)
                keyvalue2 = 16;
        return keyvalue2;
}
這個方法可以實現按一次按鍵,變量值加1,長按可以連續增加。

回復

使用道具 舉報

板凳
ID:427492 發表于 2019-6-27 16:51 | 只看該作者
經典矩陣按鍵掃描:
unsigned char Check_key(void)
{
        unsigned char row,col,temp1,temp2,keyvalue;
        temp1 = 0x01;
        for(row=0;row<4;row++)                // 行掃
        {
                P0 = 0xF0;                        // 先將P0.4~P0.7置高
                P0 = ~temp1;                      // 使P0.1~P0.3中有一位為0
                temp1 *= 2;                       // temp1左移一位
                if((P0 & 0xF0) < 0xF0)            // 當按鍵按下時,(P0 & 0xF0) 高四位不在是F,可能為7或B或D或E。
                {                                    // 這時可以確定按下的是(row+1)行
                        temp2 = 0x80;
                        for(col=0;col<4;col++)        // 列掃
                        {
                                if((P0 & temp2)==0x00)    // 當(P0 & temp2)等于0x00時,可以確定按下的位置是(col+1)列
                                {
                                        keyvalue = row*4+col; // 得到所按下按鍵的鍵值
                                        return keyvalue;      // 把得到的鍵值作為返回值
                                }
                                temp2 /= 2;               // temp2右移一位
                        }
                }
        }
        return 16;  // 因為定義數碼管段選表中,16對應的是全滅,故無按鍵按下時返回16
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表