我想依次按下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条回答
maychang
1楼-- · 2019-03-25 18:11
不要慌 发表于 2015-6-25 15:47
重新显示
如果按了五次  再按的话,就重新显示

无论使用汇编语言还是C语言,编程必须模块化。
你的按键-显示工作是很简单的,但也应该模块化。各模块之间联系越少越好。
读键程序最好放到定时中断里面,两次定时中断的时间间隔恰好用来判断按键是否稳定按下。显示程序也可以放到定时中断里面,每次中断显示一位。
读键程序判断按键已经稳定按下,将键码放入一个存储单元,同时建立一个标志,通知显示程序更新显示。显示程序每次都检查一下标志。若无,不更新显示内容,若有,清除标志,将键码转换成显示码。显示程序还要使用一个存储单元纪录有几位显示,若未满,放到最后,显示纪录加一,若已满,重新开始。显示码放到第一位,其余各位灭。纪录几位的存储单元设置为有一位显示。
maychang
2楼-- · 2019-03-25 22:12
 精彩回答 2  元偷偷看……
不要慌
3楼-- · 2019-03-26 04:04
maychang 发表于 2015-6-25 16:10
五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。

我按下一个数字键    显示器就循环显示这个数字,一松开,它就停下,并且停下的位置随意,而且按下一个数字的时候又是这样,反正每次只显示一位,还不停的循环移动,我不知道哪里错了,能告诉我哪里有问题吗?
我想先让它正确显示,再慢慢优化代码
ienglgge
4楼-- · 2019-03-26 09:49
不太擅长汇编,大概的思路是这样的。五个变量,存储五位数码管需要显示的数据。读键盘函数,读取数值,并记录数据个数,把数据和长度传递给显示函数。显示函数把需要改变的数码管刷一遍。 每次长度为1,消除显示一次
不要慌
5楼-- · 2019-03-26 12:04
 精彩回答 2  元偷偷看……
不要慌
6楼-- · 2019-03-26 13:20
不要慌 发表于 2015-6-25 16:17
我按下一个数字键    显示器就循环显示这个数字,一松开,它就停下,并且停下的位置随意,而且按下一个数 ...

新建文本文档.txt (36.28 KB, 下载次数: 1) 2015-6-25 21:22 上传 点击文件名下载附件
阅读权限: 10
大哥   求指点


一下,这是我写的

一周热门 更多>