找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 701|回复: 0
收起左侧

单片机键盘输入接口

[复制链接]
ID:1056023 发表于 2022-12-6 15:13 | 显示全部楼层 |阅读模式
键盘是单片机最常见的人机接口设备,通过键盘人们可以向单片机输入各种操作命令和数据。单片机识别这些按键信息后,由单片机进行相应的处理。键盘从结构上分为两类:独立式键盘和矩阵式键盘。(1)独立式键盘是指键盘中的各个按键的输入相互独立,每一个按键都单独连接1 根 I/O 口线。按键判别容易,适合键少的场合使用。(2)矩阵式键盘是将键盘的输入分为行和列,各键处于矩阵行/列的结点处,从而形成一个具有按键个数为“行×列”的矩阵。图 6.1 是 4×4 的具有 16 个按键的矩阵式键盘结构原理图。当没有按键按下时,矩阵的行线、列线不连通;只有当有键按下时,对应按键的行线、列线连通。矩阵键盘占用 I/O 口线少,但判键速度慢,多用于设置数字键,常用于按键数目较多的系统设计中.、矩阵键盘的扫描方法 判别矩阵键盘的按键是否被按下,主要有两种方法:行扫描法和线反转法。(1)行扫描法:又称逐行扫描查询法,是一种最常用的按键识别方法。即逐行查看是否有按键被按下,如果某行有按键被按下,则获得相应的按键值给单片机的 CPU进行处理。以图 6.1 中 4×4 矩阵键盘为例,介绍具体的实现过程。192○1 判断键盘中有无键按下将全部行线 KeyOut1- KeyOut4 输出低电平,读取列线 KeyIn1- KeyInt4 的状态。只要有一列的电平为低,则表示键盘中有键被按下。若所有列线均为高电平,则键盘中无键按下。○2 判断闭合键所在的位置在确认有键按下后,逐行扫描键盘的每一行,确定闭合键的位置。其方法是:依次将每一条行线输出为低电平,其它行线输出为高电平,再去读取列线的状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。例如:扫描 KeyOut1行,行输出数据置为(0111)B,假如读取列线的数据 KeyIn1- KeyInt4 为(1101)B,则说明K3 键被按下。如果读取列线的数据 KeyIn1- KeyInt4 为(1111)B,则说明 KeyOut1 行没有按键按下,将继续扫描其他行直到检测到按键为止。○3 得到按键的键值(2)线反转法线反转法适合于 4×4 矩阵键盘的扫描,算法简单,识别速度更快。具体方法如下:○1 将列线编程为输入线,行线为输出线,并将输出线输出为全零,读列线状态,列线中电平为低的是按键所在列。○2 将行线编程为输入线,列线为输出线,并将输出线输出为全零,读行线状态,行线中电平为低的是按键所在行。○3 按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高 4 位是行号,低 4 位是列号。3、按键消抖通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,开关状态不会立马稳定,而是伴随一连串的抖动。抖动时间由按键的机械特性决定,一般在 10ms 以内。如果不及时去除抖动,在一次按键过程中,容易误判为多次按键操作。通常可采用软件延时的方法消除抖动,一次按键过程至少持续 100ms,而抖动时间在 10ms 以内,当判别有键按下时,先不做任何处理,而是延时 10ms 左右时间,让抖动消失后再次确认按键.
、绘制实验电路图打开 ISIS 7 Profession,参照“四、实验电路”设计仿真电路图;2、编写程序打开 Keil μVision4,采用 C51 语言编写程序。参考程序如下:

/***************************************程序功能:单个数码管显示按键数字 0——F) 键盘识别:行扫描法************************************/#include //51 头文件#define uchar unsigned char#define uint unsigned intuchar KEY_SACN(); //键盘扫描函数声明 void delay( uint t ); //延时函数声明uchar code a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,P3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7P3.0P3.1P3.2P3.3P3.5P3.4P3.6P3.7XTAL2 18XTAL1 19ALE 30EA 31PSEN 29RST 9P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32P2.7/A15 28P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27P1.0 1P1.1 2P1.2 3P1.3 4P1.4 5P1.5 6P1.6 7P1.7 8P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17 P3.6/WR 16 P3.5/T1 15U180C51X1CRYSTALC120pFC220pFC310uFR110kF E D CB A 9 87 6 5 43 2 1 0123456789RP13001940x7c,0x39,0x5e,0x79,0x71}; //共阴数码管 0—F(黑屏)段码void main( ) //主函数{uchar key;P0=0x00; //数码管初始状态,全灭while(1){key=KEY_SACN(); //获取按键值,没有按键返回-1if(key!=-1) { P0=a[key]; //显示按键值} }}uchar KEY_SACN() //键盘扫描程序,返回键值{ uchar num=0,col,temp,temp1; P3=0xF0; //P3.0—P3.3 输出,P3.4—P3.7 输入,设行输出全 0temp=P3&0xF0; //读列线状态if(temp!=0xF0) //判断有无按键,{ delay(1000); //延时消抖temp=P3&0xF0; //读列线状态if(temp!=0xF0) //再次判断有无按键{ temp1=0x08;for(col = 0;col < 4;col++) //行扫描{ P3=0xFF-temp1; //P3.3,P3.2,P3.1,P3.0 依次输出为 0temp1>>=1; temp=P3&0xF0; //读列线状态 if(temp!=0xF0){ switch(temp) //判断具体按键 { case 0x70: num=0+4*col;break;case 0xB0: num=1+4*col;break;case 0xD0: num=2+4*col;break;case 0xE0: num=3+4*col;break; }  return num; //返回键值}}}195} return -1; //没有按键返回-1}void delay(uint t ) //延时函数{  uint data i; //整型变量 i for(i=t;i>0;i--); //循环延时}/*--------------程序结束-----------------*/




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表