返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

 单片机教程 栏目导航   第一页..单片机入门教程    第二页..单片机c语言   第三页..红外遥控和步进电机    第四页..单片机问答

 

5.7 查键程序---51系列单片机设计实例教程

具有按键控制功能的单片机应用系统都有查键功能程序,有简单的顺序查键及复杂的行列式查键。

例1  顺序查键程序

START:MOV   P3,#OFFH;   置P3口为输入口

       JNB   P3.0,FUNO;  P3.0口为0转FUNO

       JNB   P3.1,FUN1;  P3.1口为0转FUN1

       JNB   P3.2,FUN2;  P3.2口为0转FUN2

       JNB   P3.3,FUN3;  P3.3口为0转FUN3

       AJMP  START;       转START循环

例2  32键行列式查键程序(4X8)

32键行列式查键程序电原理图如图5.3所示。

以下是32键行列式查键程序(4X8):

                                           图5.3 32键行列式查键程序电原理图

;***********************************

;*                                 *

;*    键盘工作总程序(4X8阵列)    *

;*      出口为各键工作程序入口     *

;***********************************

KEYWORK:   MOV   KEYY,#OFFH;       置列线输入

            CLR   KEYXO;             行线(P1口)全置O

            CLR   KEYX1

            CLR   KEYX2

            CLR   KEYX3

            MOV   A,KEYY;           读入PO值

            MOV   B,A;              KEYY口值暂存B中

            CJNE  A,#OFFH,KEYHIT;  不等于#OFFH,转KEYHIT(有键按下)

 KEYOUT:   RET;                     没有键按下返回

 ;

 KEYHIT:   LCALL DL10MS;            延时去抖动

            MOV   A,B,KEYOUT;      A不等于B(是干扰),子程序返回

            SETB  KEYX1;             有键按下,找键号,开始查0行

            SETB  KEYX2

            SETB  KEYX3

            MOV   A,KEYY;           读入PO口值

            CJNE  A,#OFFH,KEYVALO; PO不等于#OFFH,按下键在第1行

            SETB  KEYX1;             不在第1行,开始查第2行

            CLR   KEYX2

            MOV   A,KEYY;           读入PO口值

            CJNE  A,#OFFH,KEYVAL2; PO口不等于#OFFH,按下键在第2行

            SETB  KEYX2;             不在第2行,开始查3行

            CLR   KEYX3

            MOV   A,KEYY;           读入PO口值

            CJNE  A,#OFFH,KEYVAL3; PO口不等于#OFFH,按下键在第3行

            LJMP  KEYOUT;            不在第3行,子程序返回

 ;

 KEYVALO:  MOV  R2,#OOH;         按下键在第0行,R2赋行号初值0

            LJMP KEYVAL4;          跳到KEYVAL4

 ;

 KEYVAL1:  MOV  R2,#O8H;         按下键在第1行,R2赋行号初值8

            LJMP KEYVAL4;          跳到KEYVAL4

 ;

 KEYVAL2:  MOV  R2,#1OH;         按下键在第2行,R2赋行号初值16

            LJMP KEYVAL4;          跳到KEYVAL4

 ;

 KEYVAL3:  MOV  R2,#18H;         按下键在第3行,R2赋行号初值24

            LJMP KEYVAL4;          跳到KEYVAL4

 ;

 KEYVAL4:  MOV  DPTR,#KEYVAI,TB;键值翻译成连续数字

            MOV  B,A;             PO口值暂存B内

            DLR  A;                清A

            MOV  RO,A;            清RO

 KEYVAL5:  MOV  A,RO;            查列号开始,RO数据放入A

            SUBB A,#08H;          A中数减8

            INC  KEYOUT;           错位C为0,查表出错,返回

            MOV  A,RO;            查表次数小于8,继续查

            MOV  A,@A+DPTR;       查列号表

            INC  RO;               RO加1

            CJNE A,B,KEYVAL5;    查得值和PO口值不等,转KEYVAL5再查

            DEC  RO;               查得值和PO口值相等,RO减1

            MOV  A,RO;            放入A(RO中数值即为列号值)

            ADD  A,R2;            与行号初值相加成为键号值(0—31)

            MOV  B,A;             键号乘3处理用于JMP散转指令

            RL   A;                键号乘3处理用于JMP散转指令

            ADD  A,B;             键号乘3处理用于JMP散转指令

            MOV  DPTR,#KEYFUNTAB; 取散转功能程序(表)首址

            JMP  @A+DPTR;          散转至对应功能程序标号

 KEYFUNTAB:LJMP KEYFUNOO;         跳到键号O对应功能程序标号

            LJMP KEYFUN01;         跳到键号1对应功能程序标号

            LJMP KEYFUN02;         跳到键号2对应功能程序标号

            LJMP KEYFUN03

            LJMP KEYFUN04

            LJMP KEYFUN05

            LJMP KEYFUN06

            LJMP KEYFUN07

            LJMP KEYFUN08

            LJMP KEYFUN09

            LJMP KEYFUN010

            LJMP KEYFUN011

            LJMP KEYFUN012

            LJMP KEYFUN013

            LJMP KEYFUN014

            LJMP KEYFUN015

            LJMP KEYFUN016

            LJMP KEYFUN017

            LJMP KEYFUN018

            LJMP KEYFUN019

            LJMP KEYFUN020

            LJMP KEYFUN021

            LJMP KEYFUN022

            LJMP KEYFUN023

            LJMP KEYFUN024

            LJMP KEYFUN025

            LJMP KEYFUN026

            LJMP KEYFUN027

            LJMP KEYFUN028

            LJMP KEYFUN029

            LJMP KEYFUN030

            LJMP KEYFUN031

            RET

 ;PO口对应列号的ROM数值表

 KEYVAlTAB:DB  OFEH,OFDH,OFBH,OF7H,OEFH,ODFH,OBFH,7FH

 ;              0     1     2     3     4     5     6     7

                RET

 ;各按键功能程序

 KEYFUNOO:RET;            键号0功能程序

 KENFUNO1:RET;            键号1功能程序

 KEYFUNO2:RET;            键号2功能程序

 KEYFUNO3:RET

 KEYFUNO4:RET

 KEYFUNO5:RET

 KEYFUNO6:RET

 KEYFUNO7:RET

 KEYFUNO8:RET

 KEYFUNO9:RET

 KEYFUNO10:RET

 KEYFUNO11:RET

 KEYFUNO12:RET

 KEYFUNO13:RET

 KEYFUNO14:RET

 KEYFUNO15:RET

 KEYFUNO16:RET

 KEYFUNO17:RET

 KEYFUNO18:RET

 KEYFUNO19:RET

 KEYFUNO20:RET

 KEYFUNO21:RET

 KEYFUNO22:RET

 KEYFUNO23:RET

 KEYFUNO24:RET

 KEYFUNO25:RET

 KEYFUNO26:RET

 KEYFUNO27:RET

 KEYFUNO28:RET

 KEYFUNO29:RET

 KEYFUNO30:RET

 KEYFUNO31:RET

 RET

 ;

51系列单片机设计实例教程12题

单片机指令的应用例子

定时器/计数器的基本结构与操作方式

定时器/计数器的SFR

定时器/计数器的工作方式

定时器/计数器的编程和使用

单片机定时器应用举例

中断系统的基本组成

单片机中断系统中的SFR

中断响应的自主操作过程

串行口的基本结构与操作方式

串行口的特殊功能寄存器

单片机串口的工作方式

如果对本文有疑问,请到论坛提问 编辑:51单片机学习网 @ 2009-10-20校对 中国开发板最佳品牌  版权:部分由编辑摘引,权利属原著作人