视频放大后不清晰,可将鼠标放在视频上,右上角出现“去bilibili观看”进行点击,转到B站观看清晰版本

1、实物图

2、原理图

3、基本原理

使用8个I/O口来进行16个按键的控制读取,用4条I/O线作为行线,4条I/O线作为列线组成键盘,当某个按键按下时,进行行列扫描,从而判断是第几行第几列的按键,进而进行整体按键值的确定。

4、优点

使用8个I/O口来进行16个按键的控制读取,可以减小I/O口的使用,有效地提高单片机系统中I/O口的利用率

5、扫描方式——行列扫描

定义一组IO口作为矩阵键盘的引脚,高四位连接列,低四位连接行。先令IO口的高四位(四个列)输出低电平,低四位(四个行)输出高电平,假设有按键按下,从I/O口的低四位读取键盘状态,判断低四位的四行哪一行变成了低电平,就知道是第几行;再令I/O口的高四位(四个列)输出高电平,低四位(四个行)输出低电平,从I/O口的高四位读取键盘状态,判断高四位的四列哪一列变成了低电平,就知道是第几列,将两次读取结果相加组合起来就可以得到当前按键的特征编码,使用上述方法就可以得到16个按键的特征编码,然后再利用特征编码重新给每个按键赋一个对应的键值。

6、程序

/****

*******矩阵键盘扫描函数

*******返回值:键值

*****/

uchar matrix_keyboard_pro(void)  //键盘扫描函数,使用行列反转扫描法

{

uchar cord_h,cord_l;                                                                              //行列值中间变量

MATRIX_KEYBOARD_DATA=0x0f;                //列线输出全为0

cord_h=MATRIX_KEYBOARD_DATA&0x0f;  //读入行线值

 

if(cord_h!=0x0f)                                                                                 //先检测有无按键按下

{

Delay_function(10);                                          //去抖

if((MATRIX_KEYBOARD_DATA&0x0f)!=0x0f)

{

cord_h=MATRIX_KEYBOARD_DATA&0x0f; //读入行线值

MATRIX_KEYBOARD_DATA=cord_h|0xf0; //输出当前列线值

cord_l=MATRIX_KEYBOARD_DATA&0xf0; //读入列线值

while((MATRIX_KEYBOARD_DATA&0xf0)!=0xf0);   //等待松开并输出

return(cord_h+cord_l);                                 //返回组合码值

}

}

return(0xff);                                  //没有按键按下,返回0xff

}

 

/****

*******矩阵键盘键值编码为数值函数

*******返回值:键值数值

*****/

uchar Matrix_Keyboard_Scan(void)

{

switch(matrix_keyboard_pro())

{

case (0xee): return 1;       break;                       //K1按下

case (0xde): return 2;      break;                       //K2按下

case (0xbe): return 3;      break;                       //K3按下

case (0x7e): return ‘A’;    break;                       //K4按下

case (0xed): return 4;      break;                       //K5按下

case (0xdd): return 5;      break;                       //K6按下

case (0xbd): return 6;      break;                       //K7按下

case (0x7d): return ‘B’;    break;                       //K8按下

case (0xeb): return 7;      break;                       //K9按下

case (0xdb): return 8;      break;                       //K10按下

case (0xbb): return 9;      break;                       //K11按下

case (0x7b): return ‘C’;    break;                       //K12按下

case (0xe7): return ‘*’;     break;                       //K13按下

case (0xd7): return 0;      break;                       //K14按下

case (0xb7): return ‘#’;    break;                       //K15按下

case (0x77): return ‘D’;    break;                       //K16按下

default:     return 0xff;  break;                        //没有按键按下

}

}

7、软件流程

定义一组IO口作为矩阵键盘的引脚,高四位连接列,低四位连接行。先令IO口的高四位(四个列)输出低电平,低四位(四个行)输出高电平,判断低四位是否发生改变即是否有按键按下,如果改变,则进行延时消抖,再判断低四位是否发生改变,如果改变,则保存此时行状态值,接下来,令IO口的高四位(四个列)输出高电平,低四位(四个行)输出低电平,保存此时列状态值,等待列状态值恢复,再返回两次读取结果相加组合起来值即当前按键的特征编码,最后再利用特征编码重新给每个按键赋一个对应的键值。

发表评论

后才能评论

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源