单片机C语言程序设计 教学课件 作者 侯殿有4.12.ppt

单片机C语言程序设计 教学课件 作者 侯殿有4.12.ppt

  1. 1、本文档共87页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十二章 MCS-51与键盘、显示器的接口 12.1 MCS-51单片机与键盘接口 12.1.1 独立式键盘 键盘实际上是一组开关的集合,平时开关总是处于断开(称常开键)或闭合(称常闭键)状态,当按下键时它才闭合(对常开键)或断开(对常闭键)。在计算机接口电路中常用的开关如图12.1所示。 图中a、b常用来表示继电器接点或手动钮子开关,上表示常开(a),下表示常闭(b);c、d常用来表示继电器接点,左表示常开(c),右表示常闭(d);e表示常开点动按钮,按下接通,松开恢复断开;f表示常开点动按钮,按下接通,并自锁,再次按恢复断开。在计算机键盘接口电路中,e使用最多。 键盘或键是人机交流的输入设备,嵌入式控制系统大多具有小、巧、轻、灵、薄的特点,键用的很少,此时可以采用所谓“独立式”键盘,个别系统使用键盘较多可以采用专用键盘/显示接口芯片8279或HD7279。 独立式键盘如图12.2所示,由于占用口线较多,采用I/O扩展口来连接。如果键数较少,可每个键占用一条口线,通过查询或中断方式判断哪个键按下,程序简单,见图12.3。 图中,每个口线的上拉电阻是必需要加的,在没有键按下时,口线通过上拉电阻被嵌位到+5V,有键按下时口线接地,使信号电平明确,增加系统抗干扰能力。图中74LS30是8输入与非门,它的原理图见图12.4。 12.1.2 行列式式键盘 行列式键盘也叫矩阵式键盘。用I/O口线组成行、列结构,键位设置在行列的交点上。 矩阵键盘的连接方法有多种,可直接连接于单片机的I/O口线;可利用扩展的并行I/O口连接;也可利用可编程的键盘、显示接口芯片(如8279、HD7279)进行连接。在图12.5中,通过8255扩展芯片接4×8行列式键盘。 1.行列式键盘的工作过程 行列式键盘的工作过程可分两步:第一步是CPU首先检测键盘上是否有键按下;第二步再识别是哪一个键按下。 检测键盘上是否有键按下处理方法是:以图12.5为例,首先将列线送入全扫描字,读入行线的状态来判别。其具体做法是:PA口输出0x00,即所有列线置成低电平,然后将行线PC0~PC3电平状态读CPU中。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为“1”。 2.识别键盘中哪一个键按下处理方法是:将列线逐列置低电平,检查行输入状态,称为逐列扫描。其具体做法是:从PA0开始,依次输出“0”,置对应的列线为低电平,然后从PC口读入行线状态,如果全为“1”,则按下的键不在此列;如果不全为“1”,则按下的键必在此列,而且是该列与“0”电平行线相交的交点上的那个键。键盘编码方法很多,在逐列扫描时,记录下当前扫描列的列号,检测到第几行有键按下,利用行列号得到当前按键的编码。 3.行列式键盘的软件编程 (1)查询工作方式 这种方式是直接在主程序中插入键盘检测子程序,主程序每执行一次键盘检测子程序被执行一次,如果把没有键按下,则跳过键识别,直接执行主程序;如果有键按下,则通过键盘扫描子程序识别按键,得到按键的编码值,然后根据编码值进行相应的处理,处理完后再回到主程序执行。 例12-1键盘检测子程序 图12.5中,8255A的A口、B口、C口和控制口地址分别为0x7f00、0x7f01、0x7f02 、0x7f03,设8255A在主程序中初始化。已设定为A口方式0输出,C口的低4为方式0输入。 #include reg51.h #include absacc,h //定义绝对地址访问 #define uchar unsigned char #deffine uint unsigned int #deffine PA_port XBYTE[0x7f00] #deffine PB_port XBYTE[0x7f01] #deffine PC_port XBYTE[0x7f02] #deffine Ctrl_port XBYTE[0x7f03] uchar scankey(void) uchar keyscan(void) void main(void) { uchar key; Ctrl_port=0x81;// A口方式0输出,C口的低4为方式0输入。 while(1) {key=keyscan(); delay(2000); } } uchar checkkey() //检测有无键按下函数,有返回0xff,无返回0 { uchar i; PA_port =0x00; i= PC_port; i=0x0f;//去掉高4位 if (i= =0x0f) return(0); else return(0xff); } uchar keyscab() //键盘扫描函数,如果有键按下,则返回编

您可能关注的文档

文档评论(0)

带头大哥 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档