单片机设计之按键程序设计 | 太极博弈原理官方站|紫欽天|融通百科为我所用|生活全智慧|生活智慧之书

正在阅读:

单片机设计之按键程序设计

1,020

按键程序的设计

        按键的硬件通常有两种形式:

1.独立式:

独立式键盘较为单一,通过判断键盘接入口的状态就能判断有无键按下;

2.矩阵式也叫行列式:

所谓矩阵式就是说每一个按键不是单独的,键与键之间有一定的硬件联系,它的判断是通过先设置某行或某列的状态再来读某列或某行的状态来实现的.

相比之下,两种方式各有千秋,如果单片机资源充足的情况下,用独立式键盘较方便,如果单片机资源紧缺,当然要用矩阵式键盘,下面我们来简单的讲一下独立式键盘的程序编写原理:

试验板上P1为按键输入口,当有按键按下时,对应的P3.2,P3.3LED会闪动,我们这样做的目的在于让初学者知道散转指令的一些用法,知道按键的实际应用意义,因程序中有延时,有时候按键会没有效,后面的讲课我们会教你如何去克服这种现象,程序设计如下:

 

        VCC

89c51

 

 

                           P1.0

                           P1.1

                           

                           P1.7

 

 

 

 

 

 

 

 

              程序编号为:   (KEY00.ASM)

               ORG  0000H

               LJMP   START0

               ORG   0050H

          START0:

                MOV   P1,#0FFH

                MOV   A,P1

                START:

                JNB    ACC.0,PG0       ;P1.0被按下吗?是的,PG0

                JNB    ACC.1,PG1           ;P1.1被按下吗?是的,PG1

JNB    ACC.2,PG2           ;P1.2被按下吗?是的,PG2  

JNB    ACC.3,PG3           ;P1.3被按下吗?是的,PG3

JNB    ACC.4,PG4           ;P1.4被按下吗?是的,PG4

JNB    ACC.5,PG5           ;P1.5被按下吗?是的,PG5

JNB    ACC.6,PG6           ;P1.6被按下吗?是的,PG6

JNB    ACC.7,PG7           ;P1.7被按下吗?是的,PG7

SJMP   START

           PG0:

                MOV     P3,#0FFH

                CLR     P3.2           ;点亮D7

                SJMP    START

           PG1:

                MOV     P3,#0FFH

                CLR     P3.3           ;点亮D8

                SJMP    START

 

           PG2:

                MOV     P3,#0FFH

                CLR     P3.2           ;点亮D7

                CLR     P3.3           ;点亮D8

                SJMP    START

 

           PG3:

                MOV     P3,#0FFH

                MOV     A,#8

           NEXT0:

                CLR     P3.2           ; ;点亮D7

                CALL  DELAY1Ms       ;延时1S

                SETB    P3.2           ;D7

                DEC    A

                CJNE    A,#00,NEXT0   ;循环8

                SJMP    START

 

           PG4:

                MOV     P3,#0FFH

                CLR     P3.3

                SJMP    START

 

           PG5:

                MOV     P3,#0FFH

                CLR     P3.2

                SJMP    START

 

           PG6:

                MOV     P3,#0FFH

                CLR     P3.2

                CLR     P3.3

                SJMP    START

           PG7:

                MOV     P3,#0FFH

                SJMP    START

                        END

       那幺矩阵式键盘的程序又是怎样设计的呢?通常有三种方法来设计按键扫描程序:⒈计算法;⒉查表法;⒊查寻法。下面我用计算法来设计一下按键扫描程序:

          程序标号为:  KEY01.ASM

 

 

 

 

89C51

                   P1.4  P1.5 P1.6  P1.7

                                      P1.0

                                      P1.1

                                      P1.2

                                      P1.3

 

 

 

 

 

程序编号为:   (KEY.ASM)

                ORG  0000H

                    LJMP   START

                    ORG   0050H

          START:

                MOV   P1,#0FH         ;按键初始化

                LCALL     KEYIN                ;调按键输入子程序

                JNZ          LKOUT               ;有按键吗?

                            LJMP     START

      LKOUT:

                     MOV    R2,#0EFH           ;首列扫描码送入R2

                         MOV    R4,#00H                     ;首列偏移值送R4

       CONU:

                         MOV    P1,R2                  ;列扫描码送P1

                         MOV    A,P1                           ;读按键值

                         JB         ACC.0,L0NE             ;检查按键是否在第0.

                         MOV    A,#00H                ;此行有键按下,将列号放入A

                         AJMP   KCODE                     ;求出键号

              LONE:

                         JB         ACC.1,LTWO            ; 检查按键是否在第1.

                         MOV    A,#04H                ; 此行有键按下,将列号放入A

                        AJMP    KCODE                     ; 求出键号               

        LTWO:

               JB        ACC.2,LTHREE  ; 检查按键是否在第2.

                        MOV             A,#08H                ; 此行有键按下,将列号放入A

                        AJMP     KCODE                     ; 求出键号

              LTHREE:

                     JB          ACC.3,LFOUR          ; 检查按键是否在第2.

                          MOV     A,#0CH               ; 此行有键按下,将列号放入A

        LKP:                                       ; 求出键号

                ADD     A,R4                    ;行号加列号进行编码

                            PUSH    A                         ;A中的值保存起来

                            LCALL  KEYIN                ;等待按键释放

                            JNZ              WKFE                 ; 按键松开了码?

                            POP              A                         ;按键松开,键值放在A

                            LJMP     KJMP                  ;根据键值处理相关事项

       LFOUR:

                INC              R4                        ;此列没有键按下,继续检查下一列

                            MOV     A,R2                    ;

                            JNB              ACC.7,KND              ;4列检查完了码?

                            RL         A                         ;没有,继续检查.

                            MOV     R2,A                    ;

                            LJMP     CONU                 ;

        KND:                                   ; 4列检查完,返回

                RET

              KEYIN:

                            MOV     P1,#0FH                     ;想将按键初始化

                            MOV     A,P1                    ;读按键

                            CPL              A                         ;取反

ANL         A,#0FH        ;屏蔽高四位,在这里其实是检查有无按键按

;,A不等于0,表示有按键按下.

                            RET                            

         KJMP: 

            ……                ;后面的显示程序中我们会将此转散程序加

;上的

         从上面的程序我们知道,按键的编码其实就是按照我们预先定义的键号来做的,至于键号是多少,我们不要去理会,因为我们可以根据自己想要的一个键号值去处理相关的事务.光有按键程序,我们看不到按键执行的效果,下面我重点讲一下用查表法来设计按键扫描程序的设计:

                 程序编号为:   (KEY00.ASM)

                            ORG      0000H

                            LJMP     START

                            ORG      0050H

START:

                            MOV     A,#0FFH                    ;请按键

                            MOV     P1,A

                            MOV     P2,A                    ;关显示

START1:

                            MOV     R3,#0F7H            ;按键扫描码送R3

                            MOV     R1,#00H                     ;先将按键值置0

START2:

                            MOV     A,R3                    ;开始扫描按键

                            MOV     P1,A

                            MOV     A,P1                    ;读按键

                            MOV     R4,A                    ;按键存入R4

                            SETB     C

                            MOV     R5,#04H                     ;按键扫描4

START3:

                            RLC              A                         ;看有没有按键按下

                            JNC              KEYIN

                            INC              R1                        ;没有,指针加一

                            DJNZ     R5,START3         ;扫描四列了吗?

                            MOV     A,R3                    ;扫描值送入A

                            SETB     C

                            RRC      A

                            MOV     R3,A

                            JC          START2                      ;4行扫描完了吗?

                            LJMP     START1               ;

KEYIN:

                            MOV     R7,#80                 ;消抖延时程序

KEYIN1:

                            MOV     R6,#200

                            DJNZ     R6,$

                            DJNZ     R7,KEYIN1

KEYIN2:

                            MOV     A,P1                    ;在次读按键

                            XRL       A,R4                    ;与前一次按键值比较

                            JZ          KEYIN2                            ;按键松开了吗?

                            MOV     A,R1                    ;

                            MOV     DPTR,#TAB1             ;查表

                            MOVC  A,@A+DPTR

                            MOV     30H,A                  ;键值存在30H

                            LJMP     START1

TAB1:

                            DB 0DH,0EH,00H,0FH

                            DB 0CH,07H,08H,09H

                            DB 0BH,04H,05H,06H

                            DB 0AH,01H,02H,03H

                            END

              从上面的两个程序我们可以分析得出,查表法设计程序较为简洁,比较好懂,用查寻法设计程序,逻辑较差,程序似乎不紧奏,无论用那种方法,结果都一样,因此,初学者最好定好一种格式,将自己的风格加进去,学会用自己的个性来设计程序。

抱歉,这篇文章关闭了评论功能。

关闭