网站大量收购闲置独家精品文档,联系QQ:2885784924

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

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

第8讲 输入 -----键盘 本章重点 一般键盘消抖方法 状态机的概念 键盘状态机 键盘矩阵 材料清单 +5V电源 最小系统板 液晶显示板 小按键17个(用作键盘),万能版1块 圆孔插座(2.54)若干,排线若干,焊锡若干,面包板跳线若干。 键盘连接电路 当按键少,I/O口资源不紧张时,可采用一个按键占用一个I/O口的连接方式。如图,此时只要将该口设为输入,内部上拉电阻使能(DDRXn,PORTXn)=(0,1)即可。一旦按键按下,电平被拉到低电平,按键松开的时候,引脚电平为高。所以只需读寄存器PINXn的电平可判断按键是否按下。 当按键多,例如16个按键,此时采用上述连接方式会占用16个I/O口资源。可采用矩阵方式。如图,这样只占用8个I/O口。 (2)行扫描法确定哪一个键闭合: 扫描第1行:PX7-PX4送出0b1110,拉低第一行电平,其它三行电平为高,读PX3-PX0。若第1行若无键闭合,读出的数据为0b1111。有键闭合,例如第1列闭合,读出的数据为0b1110;同样第2列有键闭合,读出的数据为0b1101;若读出的数据为0b1011;表示第三列有键闭合;0b0111表示第4列有键闭合 若要扫描第2行,PX7-PX4送出0b1101,拉低第2行电平;同样,送出0b1011和0b0111可扫描第3行和第4行。 (3)value_row高4位存储行扫描码,value_col低4位存储读取码,做运算 value_key = ~((value_row 0xF0) + (value_col 0x0F)); 在只有单键闭合的情况下, value_key的取值与键闭合 对应如图所示 扫描代码可以这样写: unsigned char key_scan() { int i; unsigned char value_key, value_row, value_col; value_key = 0x00; //缺省无键闭合 key_DDR = 0xF0; //高四位输出,低四位输入。 key_PORT = 0x0F; //高四位输出低电平,低四位上拉电阻能 _NOP(); value_col = key_PIN 0x0F; //读列 if(value_col != 0x0F) //有按键闭合 { value_row = 0xEF; for(i=0;i4;i++) { //扫描第i行 key_PORT = value_row 0xF0;//第i行电平拉低 _NOP(); value_col = key_PIN 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); } 键盘电路的焊接 按键消抖 为什么要消抖:通常键盘所用为机械弹性开关,在按下和弹起的瞬间伴随一系列抖动。为确保CPU对一次闭合仅做一次处理,必须对键盘的抖动进行消抖处理。一般来说,前沿和后沿抖动时间大约在5-10ms。 一般键盘消抖的思路:一旦检测到有键按下时,延时10ms,跳过前沿抖动,再次检测,仍然检测到该键按下,则认为是有效按键;检测到该键释放后,延时10ms,再检测,该键仍在释放状态;则认为完成了一次完整的按键。 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 =

文档评论(0)

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

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

1亿VIP精品文档

相关文档