我想依次按下12345,然后led也依次显示12345,请大神指点指点

2019-03-24 17:57发布

QQ图片20150625132441.png




QQ图片20150625132555.png

数码管是共阳极

键盘是这样的


我想依次按下12345,然后led也依次显示12345

可是哪里错了 ,我不知道     




               ORG    0000H
MAIN:      MOV    30H,     #00H
               MOV    31H,     #00H
               MOV    32H,     #00H
               MOV    33H,     #00H
               MOV    34H,     #00H                 ;存放值的单元清零

               MOV    3CH,     #10H
               MOV    3BH,     #08H
               MOV    3AH,     #04H
               MOV    39H,     #02H
               MOV    38H,     #01H                 ;位选信号

               MOV    60H,     #0C0H
               MOV    61H,     #0F9H
            MOV    62H,     #0A4H
            MOV    63H,     #0B0H
            MOV    64H,     #99H
            MOV    65H,     #92H
            MOV    66H,     #82H
            MOV    67H,     #0F8H
            MOV    68H,     #80H
            MOV    69H,     #90H                 ;赋段码初值


            MOV    A,       #00H
            MOV    SP,      #70H

L1:
            MOV    P1,      #0F0H
            LCALL  KS1                           ;查有无键闭合
            CJNE   A,       #0FFH,      LK1      ;有键闭合,消颤
            LCALL  XIANSHI                       ;调显示子程序
            AJMP   L1                            ;没有键闭合,继续查询
LK1:        LCALL  YANSHI
            LCALL  KS1                           ;再查
           
            CJNE   A,       #0FFH,      LK0      ;有就转处理
            LCALL  LK1                           ;没有再查
LK0:        MOV     A,       P1               ;判断按键是否松开
            CJNE    A,       #0F0H,     LK2
            AJMP    LK0
LK2:       MOV     A,       5DH
           CJNE    A,       #7BH,        Lk3
           LJMP    L70
LK3:       CJNE    A,       #0BBH,       Lk4
           LJMP    L60
LK4:       CJNE    A,       #0DBH,       Lk5
           LJMP    L50
LK5:       CJNE    A,       #7DH,        Lk6
           LJMP    L71
LK6:       CJNE    A,       #0BDH,       Lk7
           LJMP    L61
LK7:       CJNE    A,       #0DDH,       Lk8
           LJMP    L51
LK8:       CJNE    A,       #7EH,        Lk9
           LJMP    L72
LK9:       CJNE    A,       #0BEH,       Lk10
           LJMP    L62
LK10:      CJNE    A,       #0DEH,       Lk11
           LJMP    L52
LK11:      CJNE    A,       #0B7H,       Lk12
           LJMP    L63
LK12:      CJNE    A,       #0E7H,       Lk13
           LJMP    L43
LK13:      CJNE    A,       #0EBH,       Lk14
           LJMP    L42
LK14:      CJNE    A,       #0EDH,       Lk15
           LJMP    L41
LK15:      CJNE    A,       #0EEH,       Lk16
           LJMP    L40
LK16:      CJNE    A,       #0D7H,       Lk17
           LJMP    L53
LK17:      CJNE    A,       #77H,        Lk18
           LJMP    L73
LK18:      AJMP    L1

L70:       MOV     37H,      #01H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L60:       MOV     37H,      #02H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L50:       MOV     37H,      #03H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L71:       MOV     37H,      #04H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L61:       MOV     37H,      #05H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1
L51:       MOV     37H,      #06H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L72:       MOV     37H,      #07H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1
L62:       MOV     37H,      #08H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

L52:       MOV     37H,      #09H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1
L63:       MOV     37H,      #00H
           LCALL   YIWEI
           LCALL   XIANSHI
           LJMP    L1

l43:       LJMP    L1
L42:       LJMP    L1
L41:       LJMP    L1
L40:       LJMP    L1
L53:       LJMP    L1
L73:       LJMP    L1
P74:       LJMP   MAIN
;*************************************************************************************************
;                                          *                       *                             *
;    查询有无键按下,若有键按下,A不全为1  *                       *                             *
;                                          *                       *                             *
;                                          *                       *                             *
;*************************************************************************************************
KS1:        MOV    P1,      #0F0H                  ;线反转法,                                  ;**
            MOV    A,       P1                                                                 ;**
            ANL    A,       #0F0H                                                               ;**
            MOV    B,       A                                                                  ;**
            MOV    P1,      #0FH                                                              ;**
            MOV    A,       P1                                                                 ;**
            ANL    A,       #0FH                                                              ;**
            ORL    A,       B                     ;有键按下,A不全为1                          ;**
            RET                                                                                ;**
;*************************************************************************************************

YIWEI:      MOV    A,       #00H
            CJNE   A,       30H,         L8
            CJNE   A,       31H,         L9
            CJNE   A,       32H,         L10
            CJNE   A,       33H,         L11
            CJNE   A,       34H,         L12
            MOV    34H,     37H
            LJMP   L13
L8:         LJMP   MAIN                                       ;返回查询
L9:         MOV    30H,     31H
            MOV    31H,     32H
            MOV    32H,     33H
            MOV    33H,     34H
            MOV    34H,     37H
            LJMP   L13
L10:        MOV    31H,     32H
            MOV    32H,     33H
            MOV    33H,     34H
            MOV    34H,     37H
            LJMP   L13
L11:        MOV    32H,     33H
            MOV    33H,     34H
            MOV    34H,     37H
            LJMP   L13
L12:        MOV    33H,     34H
            MOV    34H,     37H
L13:        RET








;*************************************************************************************************
;                                          *                       *                             *
;    让数字显示在数码管上                  *                       *                             *
;                                          *                       *                             *
;                                          *                       *                             *
;*************************************************************************************************
                                                                                               ;**
                                                                                               ;**
XIANSHI:    MOV    A,       #00H                                                               ;**
            CJNE   A,       30H,         L15                                                   ;**
            CJNE   A,       31H,         L16                                                   ;**
            CJNE   A,       32H,         L17                                                   ;**
            CJNE   A,       33H,         L18                                                   ;**
            CJNE   A,       34H,         L29                                                   ;**
            MOV    5EH,     #01H                                                               ;**
            AJMP   L30                                                                         ;**
                                                                                               ;**
L15:        MOV    5EH,     #05H                                                               ;**
            AJMP   L30                                                                         ;**
L16:        MOV    5EH,     #04H                                                               ;**
            AJMP   L30                                                                         ;**
L17:        MOV    5EH,     #03H                                                               ;**
            AJMP   L30                                                                         ;**
L18:        MOV    5EH,     #02H                                                               ;**
            AJMP   L30                                                                         ;**
L29:        MOV    5EH,     #01H               ;判断缓存区里面有几位数字                       ;**
            AJMP   L30                                                                         ;**
                                                                                               ;**
                                                                                               ;**
                                                                                               ;**
L30:        MOV    R7,      5EH                                                                ;**
            MOV    R0,      #34H                                                               ;**
            MOV    R1,      #38H                                                               ;**
                                                                                               ;**
L57:        MOV    P3,      @R1                                                                ;**
            MOV    A,       @R0                                                                ;**
                                                                                               ;**
            MOV    5FH,     R0                                                                 ;**
            MOV    R0,      #60H                                                               ;**
            ADD    A,       R0                                                                 ;**
            MOV    R0,      A                                                                  ;**
                                                                                               ;**
            MOV    P2,      @R0                                                                ;**
            MOV    R0,      5FH                                                                ;**
            DEC    R0                                                                          ;**
            INC    R1                                                                          ;**
            DJNZ   R7,      L57                                                                ;**
                                                                                               ;**
            RET                                                                                ;**
                                                                                               ;**
;*************************************************************************************************

YANSHI:     MOV    R7,      #120
DL1:        MOV    R6,      #200
DL2:        DJNZ   R6,      DL2
            DJNZ   R7,      DL1
            RET

END

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
ywlzh
2019-03-25 00:08
不要慌 发表于 2015-6-26 16:52
5DH放键码。
你看这样改可以么?

我这么的跟你说,对于按键的编程,也有过一些改变,越变越快,越变越精简,我很久没用汇编语言了,大部分都是用C,对于4*4矩阵,以前是一行一行扫描一列一列扫描,耗时!现在是正反两次扫描就可解决,你电路图中读的是P1口,而且51单片机的IO口是准双向口,要先赋1,再读。
现在说一下程序:
   你事先放两个表,一个正转扫描得到的值得表,一个反转得到的值得表
  mov P1,#0fh          ; 行为低,列为高
  mov  a,P1             ;读P1 低四位      有键按键 比如为:0x00001101 P1.1被拉低为0
  cpl a                    ;取反        0x11110010
  and a, #0fh          ;屏蔽高四位 0x00000010  这就是正转的按键
mov dptr,#tab1    ;  查表,得到列的键值
mov a,@a+dptr  
mov 53h,a         ;  存起来
翻转时 原理一样
mov P1,#0f0h          ; 行为高,列为低
  mov  a,P1             ;读P1 低四位      有键按键 比如为:0x11010000 P1.5被拉低为0   P1.5与P1.1相连的
                            ; 按键是哪个就知道吧   
  cpl a                    ;取反        0x00101111
  and a, #0f0h          ;屏蔽低四位 0x00100000  这就是反转的按键
XCHD a              ;半字节交换 ,不然表就写的很大了  0x00000010
mov dptr,#tab2    ;  查表,得到列的键值
mov a,@a+dptr  
add a,53h ;
mov 53h,a;           存起来了总键值
至于表 也跟你写了吧,反正也写的差不多了
tab1 db 01h,02h,00h,03h,00h,00h,00h,04h   ;只需要关心1,2,4,8 梯度为1
tab2 db 00h,04h,00h,08h,00h,00h,00h,0ch  ;也只需要关心1,2,4,8 梯度为4

一周热门 更多>