第8讲自己动手学习单片机系列键盘课件.ppt

第8讲自己动手学习单片机系列键盘课件.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8讲自己动手学习单片机系列键盘课件.ppt

* * 第8讲 输入 -----键盘 主讲:王泽华 电话青岛科技大学 这一章刚做好,为了做出一个不管单键还是矩阵键盘都能用的状态机消抖,费了点功夫。同时对第6讲的LCD添加了一个显示单字符的函数。 2013.1.31 本章重点 一般键盘消抖方法 状态机的概念 键盘状态机 键盘矩阵 材料清单 +5V电源 最小系统板 液晶显示板 小按键17个(用作键盘),万能版1块 圆孔插座(2.54)若干,排线若干,焊锡若干,面包板跳线若干。 键盘连接电路 当按键少,I/O口资源不紧张时,可采用一个按键占用一个I/O口的连接方式。如图,此时只要将该口设为输入,内部上拉电阻使能(DDRXn,PORTXn)=(0,1)即可。一旦按键按下,电平被拉到低电平,按键松开的时候,引脚电平为高。所以只需读寄存器PINXn的电平可判断按键是否按下。 扫描端口引脚电平的函数中代码可以这样写: unsigned char key_scan() { DDRX = 0xFE; //PX0输入 PORTX |= 0x01; //上拉电阻使能 if(PINX 0x01) //若为真,无键闭合 return(0); else //有键闭合 return(1); } 当按键多,例如16个按键,此时采用上述连接方式会占用16个I/O口资源。可采用矩阵方式。如图,这样只占用8个I/O口。 键盘扫描方法: 和单键扫描一致,有键闭合返回非零;无键闭合返回0。 (1)初步确定有无按键: PX0-PX3输入,上拉电阻使能,这样这4个脚是高电平(0x0F);PX4-PX7输出低电平。读PX0- PX3口引脚电平,一旦有键闭合,引脚电平不再是0x0F。 if((value_col) != 0x0F)//第一行各列有键按下 { ` switch(value_col) { case 0 //第一列按键 case 0 //第二列按键 case 0 //第三列按键 case 0 //第四列按键 value_key = ~((value_row 0xF0) + value_col); break; default value_key = 0; break; } } value_row = 1; //移位,扫描其余各行 } } return(value_key); } 键盘电路的焊接 本章现在1只独立按键实现所有程序,然后由浅如深的拓展到键盘矩阵。所用到的键盘焊接如图,左面是焊接正面图,右面是焊接反面图。 按键消抖 为什么要消抖:通常键盘所用为机械弹性开关,在按下和弹起的瞬间伴随一系列抖动。为确保CPU对一次闭合仅做一次处理,必须对键盘的抖动进行消抖处理。一般来说,前沿和后沿抖动时间大约在5-10ms。 一般键盘消抖的思路:一旦检测到有键按下时,延时10ms,跳过前沿抖动,再次检测,仍然检测到该键按下,则认为是有效按键;检测到该键释放后,延时10ms,再检测,该键仍在释放状态;则认为完成了一次完整的按键。 假定键盘扫描程序为key_scan(),有键按下返回键值;无键按下返回0。定义一个键盘消息结构 struct sMsg_Key { int value ;//有键,存储键值 int state;//存储当前键状态,按 //下为1弹起为0 }; struct sMsg_Key msg_key; int keyDelay_Dither(const int key_value) //key_value为key_scan() 返回值 { int tmp; if(key_value) //key_value!=0,有键按下执行以下程序; 前沿消抖 { _delay_ms(10);//延时10ms去掉抖动前沿 if(key_value == key_scan())//若两次按键相等 { msg_key.value = key_value;//返回键值 msg_key.state = 1; //标记键盘在按下状态 } return(0); } else if(msg_key.state == 1) //键没有释放,检测到释放;后沿消抖 { _delay_ms(10);//延时10ms去掉抖动后沿 tmp = msg_key.value; PA0接一只小按键

您可能关注的文档

文档评论(0)

danli208 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档