4585|21

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

我想依次按下12345,然后led也依次显示12345,请大神指点指点 [复制链接]








数码管是共阳极

键盘是这样的


我想依次按下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

此帖出自51单片机论坛

最新回复

我这么的跟你说,对于按键的编程,也有过一些改变,越变越快,越变越精简,我很久没用汇编语言了,大部分都是用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   详情 回复 发表于 2015-6-26 19:37
点赞 关注
 

回复
举报

1234

帖子

4

TA的资源

纯净的硅(高级)

推荐
 
不要慌 发表于 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
此帖出自51单片机论坛

点评

谢谢啦!!  详情 回复 发表于 2015-6-27 00:54
我再改一下看看  详情 回复 发表于 2015-6-27 00:53
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
是移位显示12345
当输入2时显示12
输入3时显示123
这样的
此帖出自51单片机论坛

点评

已经按键五次,显示了比如说“12345”,继续再按下1~5中某个键,比如说按下3,你希望显示什么? 1、不响应,仍然显示“12345”。 2、响应按键,显示“23453”。 3、重新开始,首位显示“3”,其余四位灭。 ……  详情 回复 发表于 2015-6-25 14:05
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

板凳
 
不要慌 发表于 2015-6-25 13:37
是移位显示12345
当输入2时显示12
输入3时显示123
这样的

已经按键五次,显示了比如说“12345”,继续再按下1~5中某个键,比如说按下3,你希望显示什么?
1、不响应,仍然显示“12345”。
2、响应按键,显示“23453”。
3、重新开始,首位显示“3”,其余四位灭。
……
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

4
 
重新开始
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

5
 
maychang 发表于 2015-6-25 14:05
已经按键五次,显示了比如说“12345”,继续再按下1~5中某个键,比如说按下3,你希望显示什么?
1、不 ...

重新显示
如果按了五次  再按的话,就重新显示
此帖出自51单片机论坛

点评

无论使用汇编语言还是C语言,编程必须模块化。 你的按键-显示工作是很简单的,但也应该模块化。各模块之间联系越少越好。 读键程序最好放到定时中断里面,两次定时中断的时间间隔恰好用来判断按键是否稳定按下。显  详情 回复 发表于 2015-6-25 16:07
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

6
 
maychang 发表于 2015-6-25 14:05
已经按键五次,显示了比如说“12345”,继续再按下1~5中某个键,比如说按下3,你希望显示什么?
1、不 ...

能帮我在源程序上面改一下吗?
就是按下一个数字键后把这个数字传到最低位,其余的数字顺序左移一位,然后再显示出来,
直到下一次按键
此帖出自51单片机论坛

点评

五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。  详情 回复 发表于 2015-6-25 16:10
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

7
 
不要慌 发表于 2015-6-25 15:47
重新显示
如果按了五次  再按的话,就重新显示

无论使用汇编语言还是C语言,编程必须模块化。
你的按键-显示工作是很简单的,但也应该模块化。各模块之间联系越少越好。
读键程序最好放到定时中断里面,两次定时中断的时间间隔恰好用来判断按键是否稳定按下。显示程序也可以放到定时中断里面,每次中断显示一位。
读键程序判断按键已经稳定按下,将键码放入一个存储单元,同时建立一个标志,通知显示程序更新显示。显示程序每次都检查一下标志。若无,不更新显示内容,若有,清除标志,将键码转换成显示码。显示程序还要使用一个存储单元纪录有几位显示,若未满,放到最后,显示纪录加一,若已满,重新开始。显示码放到第一位,其余各位灭。纪录几位的存储单元设置为有一位显示。
此帖出自51单片机论坛
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

8
 
不要慌 发表于 2015-6-25 15:58
能帮我在源程序上面改一下吗?
就是按下一个数字键后把这个数字传到最低位,其余的数字顺序左移一位,然 ...

五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。
此帖出自51单片机论坛

点评

http://pan.baidu.com/s/1kTsy3tX 然而运行确实这样的,我也不知道错在哪里  详情 回复 发表于 2015-6-25 21:41
大哥 求指点 一下,这是我写的  详情 回复 发表于 2015-6-25 21:26
大哥 求指点 一下,这是我写的  详情 回复 发表于 2015-6-25 21:24
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

9
 
maychang 发表于 2015-6-25 16:10
五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。

我按下一个数字键    显示器就循环显示这个数字,一松开,它就停下,并且停下的位置随意,而且按下一个数字的时候又是这样,反正每次只显示一位,还不停的循环移动,我不知道哪里错了,能告诉我哪里有问题吗?
我想先让它正确显示,再慢慢优化代码
此帖出自51单片机论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

10
 
不太擅长汇编,大概的思路是这样的。五个变量,存储五位数码管需要显示的数据。读键盘函数,读取数值,并记录数据个数,把数据和长度传递给显示函数。显示函数把需要改变的数码管刷一遍。 每次长度为1,消除显示一次
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

11
 
ienglgge 发表于 2015-6-25 20:45
不太擅长汇编,大概的思路是这样的。五个变量,存储五位数码管需要显示的数据。读键盘函数,读取数值,并 ...

大神求指点啊
30到34    30是最高位,数据长度这样查询可以么?
每次显示都查询一遍
把长度赋给R7,用来控制显示的循环次数
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

12
 
不要慌 发表于 2015-6-25 16:17
我按下一个数字键    显示器就循环显示这个数字,一松开,它就停下,并且停下的位置随意,而且按下一个数 ...

新建文本文档.txt (36.28 KB, 下载次数: 1) 大哥   求指点 新建文本文档.txt (36.28 KB, 下载次数: 1)

新建文本文档.txt (36.28 KB, 下载次数: 1)
一下,这是我写的
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

13
 
maychang 发表于 2015-6-25 16:10
五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。

大哥   求指点


一下,这是我写的 新建文本文档.txt (36.28 KB, 下载次数: 0)


此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

14
 
maychang 发表于 2015-6-25 16:10
五个显示码存储单元左移一字节,最后一个单元放入新的显示码就是了。

链接已隐藏,如需查看请登录或者注册

然而运行确实这样的,我也不知道错在哪里
此帖出自51单片机论坛

点评

自己慢慢debug吧。 错了,又找出了错误,那可是大进步。程序员就是这样养成的。  详情 回复 发表于 2015-6-25 23:46
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

15
 
不要慌 发表于 2015-6-25 21:41
http://pan.baidu.com/s/1kTsy3tX
然而运行确实这样的,我也不知道错在哪里

自己慢慢debug吧。
错了,又找出了错误,那可是大进步。程序员就是这样养成的。
此帖出自51单片机论坛

点评

没有用过proteus仿真。  详情 回复 发表于 2015-6-26 13:59
那请问一下用proteus仿真时可以像伟福那样跟踪代码运行吗?  详情 回复 发表于 2015-6-26 11:57
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

16
 
maychang 发表于 2015-6-25 23:46
自己慢慢debug吧。
错了,又找出了错误,那可是大进步。程序员就是这样养成的。

那请问一下用proteus仿真时可以像伟福那样跟踪代码运行吗?
此帖出自51单片机论坛
 
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

17
 
我曾经按键编程时用的查表的方式,正反转之后直接查表,就能得到键值,你有太多的跳转指令,看着就不好了。
此帖出自51单片机论坛

点评

[attachimg]203625[/attachimg] 5DH放键码。 你看这样改可以么?  详情 回复 发表于 2015-6-26 16:52
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

2万

帖子

0

TA的资源

超级版主

18
 
maychang 发表于 2015-6-25 23:46
自己慢慢debug吧。
错了,又找出了错误,那可是大进步。程序员就是这样养成的。

没有用过proteus仿真。
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

19
 
ywlzh 发表于 2015-6-26 12:34
我曾经按键编程时用的查表的方式,正反转之后直接查表,就能得到键值,你有太多的跳转指令,看着就不好了。


5DH放键码。
你看这样改可以么?
此帖出自51单片机论坛

点评

我这么的跟你说,对于按键的编程,也有过一些改变,越变越快,越变越精简,我很久没用汇编语言了,大部分都是用C,对于4*4矩阵,以前是一行一行扫描一列一列扫描,耗时!现在是正反两次扫描就可解决,你电路图中读的  详情 回复 发表于 2015-6-26 19:37
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表