关于矩阵键盘行列扫描的测试实验

作者: Deng_Wei | 来源:发表于2016-06-30 17:35 被阅读1420次

    我会时常分享一些51的程序编写方法,有一定基础的可以来看看。如有不当之处,欢迎大家指正,一同进步。
    矩阵键盘无非就是两种扫描方式,一为逐行扫描,二为行列一起扫描读取键值。先确定行后确定列的读取方法没有什么可讲的,我针对行列一起扫描来总结一下我常用的一些方法。
    学习嵌入式或者说硬件一定是从硬件原理开始,因为矩阵键盘电路原理简单,网上讲解较多,我只附上原理图,重点跟大家交流一下程序部分。
    下图就是矩阵键盘 由P1口控制,P10~P13为列 P14~P17为行。

    矩阵键盘电路原理图

    高四位输出低电平,低四位输出高电平,检测低四位不全为高可确定列;反过来高四位输出高电平,低四位输出高电平,高四位不全为高确定行,行列交叉即可获得按键键值。废话不多说,直接上程序,我已经详细注解过了,不懂多看看哈。

    /*******************************************************************************
    * 函数名        : KeyDown
    * 函数功能    : 检测有按键按下并读取键值
    * 输入          : 无
    * 输出        : 无
    * 作者    : INK
    * 日期地点    : NANKING
    *******************************************************************************/
    void KeyDown(void)
    {
      char a=0;
      GPIO_KEY=0x0f;      // 位定义的引脚
      if(GPIO_KEY!=0x0f)  //读取按键是否按下
      {
        Delay10ms();      //延时10ms进行消抖
            if(GPIO_KEY!=0x0f) //再次检测键盘是否按下
              {
              //测试列
                GPIO_KEY=0X0F;
    switch(GPIO_KEY)
            {  //此段程序只是为了确定列的值 方便在后面进行测试行的时候加减运算 获得具体案件的行列值 从而转换为按键值
    case(0X07): KeyValue=0;break;//扫描第一列
    case(0X0b): KeyValue=1;break;//按键第二列 是keyValue=1
    case(0X0d): KeyValue=2;break;//按键第三列
    case(0X0e): KeyValue=3;break;//按键第四列
             }
                  //测试行 确定了列以后需要翻转 确定行 交叉确定键值
              GPIO_KEY=0XF0; //屏蔽高四位
    switch(GPIO_KEY)
            {                      //已经进行过
    case(0X70): KeyValue=KeyValue;break;//自己去看为什么是 0X70 列的时候又为什么是0X07 硬件相结合
    case(0Xb0): KeyValue=KeyValue+4;break;  //键值是5  扫描第二行
    case(0Xd0): KeyValue=KeyValue+8;break;  //键值是9  扫描第三行
    case(0Xe0): KeyValue=KeyValue+12;break; //键值13  扫描第四行
            }   //其实最终返回的键值就是进行过加法运算的
    while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 松手 按键就是 f0
            {
              Delay10ms();
              a++;//防止程序死在 while循环里 利用a的值跳出循环,比较不错的双重保险办法 
            }
        }
      }
    }
    

    相关文章

      网友评论

        本文标题:关于矩阵键盘行列扫描的测试实验

        本文链接:https://www.haomeiwen.com/subject/ifhfjttx.html