扫描键盘(第九章).doc_第1页
扫描键盘(第九章).doc_第2页
扫描键盘(第九章).doc_第3页
扫描键盘(第九章).doc_第4页
扫描键盘(第九章).doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章 MCS51单片机与键盘、显示器(LED)的接口9.1 MCS51单片机与键盘的接口9.1.1 键盘的工作原理及消抖方法按纽在按下和松开的瞬间(10ms内),都会产生电平的快速波动(抖动)。见P212的图9-1。1. 硬件消抖:添加电路。 采用双稳态的RS触发器(见P213的图9-2),但需使用三个接点的按键。 采用RC积分电路(见P213的图9-3)。 2. 软件消抖:当检测到有电平变化时,延时一段时间(10ms),跳过电平的抖动,再进行识别处理。在单片机的应用中都是使用软件消抖的方法,不添加电路。扳键式开关 9.1.2 扳键开关、拨盘开关与单片机的接口 扳键开关和拨盘开关一般用在不太需变换状态的输入位识别中,最终变为另一稳定状态,一般不需消抖。常见的接口电路有:1. 直接P口输入单个扳键开关例:针对下图电路编程实现:当K闭合,LED持续闪动(每200ms一次);当K断开则关闭LED。设:Delay300为延时300ms的子程序。KEQUP1.1Main: SETB K ;P口作为输入的位,在测试前必须先置为“1”。JB K,LB ;测试开关的电平,为“1”则转移到LB。LA: SETB P1.0 ;输出高电平,闪亮 LEDLCALL Delay200 ;延时200ms P1.0CLR P1.0 ;输出低电平,闪灭 +5V LCALL Delay200 ; 延时200ms 8051LJMP Main ;循环测试开关 RLB: CLR P1.0 ;输出低电平,熄灭 K SJMP Main ;循环测试开关 P1.1 多个拨盘开关(排键) +5V多个拨盘开关一般用于静态的状态位输入,在程序的初始 8051段中识别。 P1.0 对应的控制程序: P1.1 MOVP1,#0FFH P1.2 MOVA,P1 P1.3 P1.4 P1.5 P1.6 P1.7 2. 扩展I/O口输入 +5V 8051P0.0 1Y1 1A1 P0.1 1Y2 1A2 P0.2 1Y3 1A3 P0.3 1Y4 1A4 P0.4 2Y1 2A1 P0.5 2Y2 2A2 P0.6 2Y3 2A3 P0.7 2Y4 2A4 ALE 1EN P2.7 2EN RD OR 74LS244 对应的控制程序:MOVDPTR,#7FFFHMOVXA,DPTR按纽式按键按钮式按键在按下和松开的瞬间会产生电位的抖动,识别的软件需加以处理,运行的结果才不会异常。9.1.3 独立式键盘接口设计 +5V 8051 P2.0 P2.1 P2.2 K2 K1 K0 按纽式按键的识别(程序段):按下后还得有键释放的处理。K0EQUP2.0K1EQUP2.1K2EQUP2.2Main: AN0:SETBK0JBK0, AN1 ; P1.0=1表示按键K0没按下,转处理其他按键。 LCALLDelay10; P1.0=0表示按键按下,延时10ms(消除抖动)SETBK0 JBK0, AN1 ; 再测,P1.0=1是按键抖动,转处理其他按键。LCALLFUN_K0 ; K0键的处理子程序LA:SETBK0; 键释放处理。JNBK0, LA ; P1.0=0表示按键K0没松开,转键释放处理。 LCALLDelay10; P1.0=1表示按键松开,延时10ms(消除抖动)SETBK0 JNBK0, LA ; 再测,P1.0=0是按键抖动,转键释放处理。LJMPMainAN1:SETBK1JBK1, AN2 ; P1.1=1表示按键K1没按下,转处理其他按键 例1:按一下按钮K,LED灯点亮;再按一下K则关闭LED灯。设:Delay10为延时10ms的子程序。程序段1:(会异常)K BIT P1.1LED BIT P1.0L1: SETBK LEDJBK,L1 ; 判键按下 P1.0 CPLLED ; 对应S键按下的处理 SJMPL1 +5V程序段2:(正确) 8051L1: SETB K JB K,L1 ; 判键按下 K LCALL Delay10 ; 消除抖动 P1.1 JB K,L1 CPL LED ; 对应S键按下的处理L2: SETB KJNB K,L2 ; 判别键释放 LCALL Delay10 ; 消除抖动 JNB K,L2 SJMP L1例2:按一下按钮S,LED持续闪动(每200ms一次);再按一下S则关闭LED。设:Delay200为延时200ms的子程序。解:需设置一状态位来表示当前是闪动或是关闭。K BIT P1.1LEDBITP1.0TTBIT 0DH ;内存地址21H的第6位;TT=0表示LED关闭,TT=1表示LED闪动。 Main:JBTT,Main1 CLRLED ; 关闭LEDSJMPMain2Main1: CPL LED ;闪动LEDLCALLDelay200Main2:SETBK ; JBK,Main ; 判键按下 LCALLDelay10 ;消除抖动 JBK,Main ; CPLTT ; 这里仅对TT取反,具体的键处理在主程序中依TT的值进行处理。Main3:SETBKJNBK,Main3 ;判别键释放LCALLDelay10 ; 消除抖动 JNBK,Main3 ;SJMPMain例3:单个7段码LED显示器倒计数程序。(此例不处理按键消抖刚巧无碍)KBIT P3.2 SEQU20H P0ORG0000HMain:MOVS, #09H KMOVP0, #0FFH ; 显示空 P3.2 +5VL1:SETBK JBK, L1 ; K=1, 无键入MOVA, S ; K键按下的处理:显示数值S(90) ,SS-1MOVDPTR, #TAB MOVCA, A+DPTR ; 取出数值S对应的LED显示段码MOVP0, A ; 显示数值S(09)LCALDelay ; 延时1sMOVA, SJZMainDECSSJMPL1TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0HDelay:MOVR3, #5 ; 5*200ms=1000ms=1sDe0:MOVR4, #200 ; 200*1ms=200msDe1:MOVR5, #250 ; 250*4us=1msDe2:DJNZR5, De2 ; 4us,设 f = 6MHzDJNZR4, De1DJNZR3, De0RETEND例4:按键计数程序。(有异常的程序,按键没有消抖处理)KBIT P3.2SEQU20HORG0000HMain:MOVS, #00H ; S置初值0MOVP0, #0C0H ; 显示空L1:SETBKJBK, L1 ; K=1, 无键入INCS ; K键按下的处理:SS+1, 显示数值S(09)MOVA, SMOVDPTR, #TAB MOVCA, A+DPTR ; 取出数值S对应的LED显示段码MOVP0, A ; 显示数值S(09)MOVA, SCJNEA, #10, L1SJMPMainTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0HEND(正确的程序,按键进行消抖处理)KBIT P3.2SEQU20HORG0000HMain:MOVS, #00H ; S置初值0MOVP0, #0C0H ; 显示空L1:SETBKJBK, L1 ; K=1, 无键入LCALL Delay10 ; 消抖处理JBK, L1 ; K=1, 是抖动INCS ; K键按下的处理:SS+1, 显示数值S(09)MOVA, SMOVDPTR, #TAB MOVCA, A+DPTR ; 取出数值S对应的LED显示段码MOVP0, A ; 显示数值S(09)L2:SETBK JNBK, L2 ; K=0, 键没有松开LCALL Delay10 ; 消抖处理JNBK, L2 ; K=0, 是抖动MOVA, SCJNEA, #10, L1SJMPMainTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0HDelay10:MOVR4, #10 ; 10*1ms=10msDe1:MOVR5, #250 ; 250*4us=1msDe2:DJNZR5, De2 ; 4us,设 f = 6MHzDJNZR4, De1RETEND9.1.4 矩阵式键盘接口设计1. 矩阵式键盘的结构 8051 P2.0 P2.1 P2.2 +5V P2.3 P2.4 0 1 2 3 P2.5 4 5 6 7 P2.6 8 9 A B P2.7 C D E F 2. 按键的识别:上拉的口位P2.4P2.7作为输入(行线),悬空的口位P2.0P2.3作为输出(列线)。列线逐次输出1110,1101,1011,0111,行线相应逐次输入并判别,当P2.4P2.7不为1111时,有键按下。 由列线(输出)的值和行线(输入)的值既可得知是哪一个键按下。P2.0P2.3作为输出,P2.4P2.7作为输入,用内存30H来保存键值。(1)键盘扫描子程序:返回值为0表示没有键按下,非0表示有键按下且为健值。START: MOV30H, #00H ; 初始键值为#00H MOVP2, #0F0H ; 列置 0,P2.0P2.3输出全 0 MOVA, P2 ; 读取行值,P2.4P2.7输入到A中 ANLA, #0F0H ; 截取P2.4P2.7 CJNEA, #0F0H, KEY1 ; 若P2.4P2.7不全 为1 则有键按下,转KEY1确认。 RET ; 若P2.4P2.7全 1 则表示没有键按下,返回。30H=0KEY1: LCALL Delay10 ; 有键按下,延时10ms,消抖 MOVA, P2 ; 确认有键按下? ANLA, #0F0H ; 截取P1.4P1.7 CJNEA, #0F0H, KEY2 ; 确实有键按下,转KEY2识别。 RET ; 是抖动,返回,30H=0KEY2:MOV R2, #4 ; 列循环记数,有键按下开始扫描键盘。 MOVR3, #01H ; 逐列扫描初值,R3中保存列号SCAN:MOV A, R3 ; 取一扫描值(01H,02H,04H,08H) CPL A ; 取反 (FEH,FDH,FBH,F7H) MOV P2, A ; 输出列线 MOV A, P2 ; 读取行线 ANL A, #0F0H ; 截取高四位P2.4P2.7行线信号 CJNE A, #0F0H, FN ; 有键值输入,找到了列线,转FN拼装键码 MOV A, R3 ; 列扫描线左移一位: (01H02H04H08H) RL A MOV R3, A DJNZ R2, SCAN ; 未扫描完,转SCAN继续扫描 RET ; 键值无效,可能是抖动或干扰,返回。无键按下30H=0FN: MOV A, P2 ; 拼装键码CPL A ; ; ANL A, #0F0H ; 取高4位的行值 ; ADD A, R3 ; 例:A=01000010 表示第1列和第2行的交点按下 MOV 30H, A; 保存识别到的键值,注意:得到的键值不是连续的。 RETKEY_OFF: LCALLDelay10 ; 在扫描显示中要改为LCALL DisLED MOV P2, #0F0H ; 键释放处理 MOV A, P2 ; ANL A, #0F0H ; CJNE A, #0F0H, KEY_OFF ; 键还没松开,转KEY_OFF RET ; 返回,有键按下30H0(2) 主程序:MAIN: LCALL DISLEDREADKEY: LCALLSTART ; 扫描键盘 MOVA, 30H ; 取键值 JZMAIN1 ; A=0, 没有键按下。 LCALLHH_BIN ; 把30H中的健值转化为015 LCALLFUN ; 进行相应的键处理。 LCALL KEY_OFF ; 键释放 MAIN1: ;其他LJMPMAIN HH_BIN: MOVR6, #-4 ; 把30H中的健值转化为015,结果存放在R6。 MOV A, 30H ; 先把1000bbbb,0100bbbb, 0010bbbb,0001bbbb (转化为12,8,4,0) SWAP A ; 转换为bbbb 1000,bbbb 0100,bbbb 0010,,bbbb0001 MOVR5, A ;用R5保存右移的结果 FN1: MOVA, R6 ; R6每次加4。 得到 0,4,8,12 ADDA, #4 MOVR6, A MOV A, R5 ; R5右移1位 RRCA MOV R5, A JNCFN1 ; 判C=0 则转去再加4;直至C=1 MOV A, 30H ; 再把bbbb 1000,bbbb 0100,bbbb 0010,bbbb0001 MOVR5, A ; (转化为3,2,1,0) DECR6 ; 因为是先加1再判循环结束,所以循环前要先减1。 FN2: INCR6 ; 每次加1 MOVA, R5 ; R5右移1位 RRCA MOV R5, A JNCFN2 ; 判C=0 则转去再加4;直至C=1 MOV A, R6 MOV 30H, A RET(3) 键处理子程序:FUN: MOVA, 30H ; 取键值:(30H)=015 RLA ; 因为AJMP 为两字节指令,所以(015)2 MOVDPTR, #TEMP JMPA+DPTR ; 见P39页TEMP: AJMPK0 ; 如果是 TEMP: LJMP K0 ; 因为LJMP 为三字节指令,所以(115)3 AJMPK1 ; LJMP K1 ; AJMPK14 ; LJMP K14 AJMPK15 ; LJMP K15K0: RETK15: RET +5V线反转法的按键识别:接口电路图如下(见P219页)。对应的键识别程序: 8051START:MOV30H, #00H ; 初始健值置00 P2.0 MOV P2, #0F0H ; 03输出,47输入 P2.1 MOVA, P2 P2.2 +5VANL A, #0F0H P2.3 CJNEA, #0F0H,KEY1 P2.4 0 1 2 3 RET ; 无键按下。 P2.5 4 5 6 7 KEY1: LCALLDelay10 ; 消除抖动 P2.6 8 9 A B MOVA, P2 P2.7 C D E F ANLA, #0F0H CJNEA, #0F0H,KEY2 RET ; 是干扰 KEY2: MOVA, P2 ; 取行健值 FN: MOVA,P2 ; 取列健值 CPLA CPLA MOV30H, A ; 保存行健值 ORLA,30H ; 拼装键值MOVP2, #0FH ; 03输入,47输出 MOV30H,A ; 保存健值 MOVA,P2 RET ANLA,#0FH CJNEA,#0FH,FN MOV30H, #00H RET ; 是干扰或错误 3. 键盘扫描方式 键盘扫描处理可分为三部分:一、判别有无键按下二、键盘扫描识别(有键按下返回键值,无键按下返回 0 )三、键释放处理 1) 随机扫描方式:在主循环中进行识别。 主程序 一般键入的速度约为每秒三个键, 因此事件处理的时间应小于200ms。 有键入 N Y 当事件处理的时间大于200ms时, 键盘(扫描)输入须用2)或3)的扫描方式。 键处理 键释放 事件处理 2) 定时扫描方式:利用定时器中断,每隔一个固定的时间进入定时器中断程序中进行识别。 定时器中断子程序(每10ms) S0:无键按下。 T0:刚按下。 主程序 等待键释放 N S=0 Y 有键入 N T0:10m后的消抖。 Y 有键入 Y T=0 Y 刚按下 S0:已有键压住。 事件处理 N 已消抖 N Q0:键压住。 Y Q=0 键盘(扫描)输入 T=0 Q0:键松开。 Q=1 已消抖 N Q=0 S=0 Q=0 键处理 T=1 注:S、T、Q为位变量。 RETI S=1 T=0 定时器中断的时间间隔一般在100ms 以内, 为了消抖的处理,采用10ms。 RETI 3) 中断扫描方式:行线输入到 与门,相与结果输出到INT0或INT1。当有键按下时,产生外部中断,进入外部中断程序中进行识别。 8051 与门 INT1 1A114 Vcc P1.0 与 门 1B213 4B P1.1 1Y312 4A P1.2 +5V 2A411 4Y P1.3 2B510 3B P1.4 0 1 2 3 2Y6 9 3A P1.5 4 5 6 7 GND7 8 3Y P1.6 8 9 A B 74LS08 P1.7 C D E F Y = AB P1.41A 1Y P1.51B 3A 3Y P1.62A 3B INT1 P1.7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论