⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arraykeyboard.c

📁 经典4x4键盘,可随便修改成其它不同矩阵时的功能,代码非常简洁
💻 C
字号:
 /*******************************************************
前言:
1.此程序非常简洁它不是进行键扫描,而是直接读Pn口,修改很方便,
不受键位置的影响,比如:要改变键号位置只需改变keytable表顺序既可,
且很容易改成双键或多键同时按下键值.
2.还有一种放法是先读行值,再读列值然后行值*4+列值,此种放法也简洁但
可修改性不大好,而且要用乘法运算,代码相对大.
3.可很容易变通应用在多键键盘,比如8*8键盘或更多,代码多不了多少,
只是增大keytable表就可以
***********************************************************/
//---------------------------------
#include <REG51F.H>
const unsigned char keytable[]={0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,
                                0xbb,0x7b,0xe7,0xd7,0xb7,0x77,0,0};
/****************************************************** 
如果无键按下返回0;如同时有两个或以键按下返回0(此情况不大可能出显)
延时程序就自己加上.
******************************************************/ 
unsigned char kdyscan(void)
{
    unsigned char temp1,temp2;              //行扫描值和列扫描值
    unsigned char j=0;                  //键值
    P1=0xf0;                        //P1.0-P1.3发全0,准备读列状态
    if((P1&0xf0)==0xf0)return(0);   //如果P1.4-P1.7不全为1,可能的键按下
    delay(1000);                    //延时10毫秒去抖动
    if((P1&0x0f0)==0xf0)return(0);  //重读高4位,若还是不全为1定有键按理
    temp1=P1&0xf0;                  //读P2高4位状态
    P1=0x0f;                        //P1.4-P1.7发为0,准备读低4位状态
    delay(3);                       //等待P1口电平稳定
    temp2=P1&0x0f;                  //P1.0-P1.3发为0,读P2低4位状态
    while(keytable[j]!=(temp1+temp2))  //高低4位合并,且与键值表比较
    {
           j++;                        //如果相等退出,不等则与下位比较
           if(j>16)return(0);          //如果比较完16位不相等,返回0
           }
    P1=0xf0;                  //恢复P2口   1
    delay(3);                       //等待P1口电平稳定
    while((P1&0xf0)!=0xf0)          //等待键释放
    {
    // WDT_CONTR=0x3c;             //喂狗,此句和所选用的芯片有关,
                                    //如不用WDT可以不加此句
        delay(1000);                //延时10毫秒去抖动
     }
    return(j+0x30);         //返回键值加0x30,防止键值为0时返回0,同时键值刚好是ASCII值"0"
    }                       //如不需要ASCII值,可以随便加个数返回时再减去.
                            //因为返回0表示无键按下
//---------------------------
//主程序
//----------------------------
void main (void)
{
    unsigned KEYS=0;;
    P1=0xf0;
    while(1)
    {
        //WDT_CONTR=0x3c;//喂狗,此句和所选用的芯片有关,如不用WDT可以不加此句
        KEYS=kdyscan();
        if(KEYS!=0)
        {
            //在此加键服务程序
            KEYS=0;
            }
        }     
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -