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

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

关于矩阵键盘行列扫描的测试实验_第1张图片
矩阵键盘电路原理图

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

/*******************************************************************************
* 函数名        : 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的值跳出循环,比较不错的双重保险办法 
        }
    }
  }
}

你可能感兴趣的:(关于矩阵键盘行列扫描的测试实验)