找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2074|回复: 3
收起左侧

单片机汇编语言实现4中方式流水灯不能随着开关的变化而变化

[复制链接]
ID:777603 发表于 2020-12-6 23:49 | 显示全部楼层 |阅读模式
我的流水方式不能随着开关的变化而变化,刚刚学。以下是我写的代码:怎么修改我的代码让它能随开关的变化而变化。
ORG        0000H
LJMP        MAIN
ORG     0030H
        MAIN:        SETB         P1.2
                        SETB         P1.1
                        JB        P1.1 ,NEXT
                        JB        P1.2,NEXT1
                        AJMP        LOOP4
                NEXT1:AJMP        LOOP2
                NEXT:JB        P1.2,NEXT2
                AJMP        LOOP3
                NEXT2:AJMP        LOOP1                //开关的状态对应流水彩灯的方式

                DL1:MOV R3,#20
                L1:        MOV        R1,#20
                L2:        MOV        R2,#250
                        DJNZ   R2,$
                       DJNZ   R1,L2
                       DJNZ   R3,L1               
                        RET                                        //延时0.2s

        DL2:MOV R4,#30
                L3:        MOV        R5,#20
                L4:        MOV        R6,#250
                        DJNZ   R6,$
                DJNZ   R5,L4
                DJNZ   R4,L3              
                        RET                                        //延时0.3s

        DL3:MOV R3,#40
                L5:        MOV        R1,#20
                L6:        MOV        R2,#250
                        DJNZ   R2,$
                DJNZ   R1,L6
                DJNZ   R3,L5               
                        RET                                        //延时0.4s

                LOOP1:MOV A,#10000000B
                          MOV R7,#08H
           START1:MOV P3,A
                          LCALL DL1
                          DJNZ R7,N1
                          AJMP LOOP1
                   N1:RR A
                          AJMP START1                //方式1

                LOOP2:MOV R0,#07H
                          MOV R7,#10000000B
                          MOV A,#10000000B
           START2:MOV P3,A
                          LCALL DL2
                          DJNZ R0,N2
                          MOV P3,#00H
                          AJMP LOOP2
                   N2:RR A
                          ORL A,R7
                          MOV R7,A
                          AJMP START2                //方式2

                LOOP3:MOV P3,#0FFH
                          LCALL DL3
                          MOV P3,#01111110B
                          LCALL DL3
                          MOV P3,#00111100B
                          LCALL DL3
                          MOV P3,#00011000B
                          LCALL DL3
                          MOV P3,#00H
              LCALL DL3
                          AJMP LOOP3                //方式3

                LOOP4:MOV P3,#00H
LCALL DL3
                          MOV A,#01H
                          MOV R7,#08H
        START3:          MOV P3,A
                          LCALL DL3
                          DJNZ R7,N3
                          MOV R7,#07H
          N4:          RR A
                          MOV P3,A
                          LCALL DL3
                          DJNZ R7,N4
              AJMP   LOOP4
          N3:          RL A
                          AJMP START3
                           END                                //方式4

l流水灯要求.PNG
回复

使用道具 举报

ID:401564 发表于 2020-12-8 08:23 | 显示全部楼层
第一:电路呢?
第二:单片机型号呢?
第三:这是仿真还是开发板的结果?
建议:在KEIL环境下,不用区分"JMP"和"AJMP",全部用JMP,CALL就可以了,编译器会自动识别的
每个子程序之间用;==============================隔开,这样就更能清楚的显示你的程序走向,不然别人看不明白的,汇编用的人少

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:777603 发表于 2020-12-8 11:11 | 显示全部楼层
Y_G_G 发表于 2020-12-8 08:23
第一:电路呢?
第二:单片机型号呢?
第三:这是仿真还是开发板的结果?

学校里的实验,开发板,可以仿真,也可以去实验室下到硬件里验证。好,谢谢
回复

使用道具 举报

ID:517466 发表于 2020-12-8 12:27 | 显示全部楼层
你的程序逻辑,有风格,哈哈哈。一把的逻辑,不是在主程序里建立循环,在循环里,根据开关的状态值,来决定调用哪个显示处理吗?假设P1采样开关值,P2口显示流水灯, "0"亮, “1”灭

MAIN:              MOV   A, P1
                      JNZ     MODE1               ;开关状态是0吗?
                      LCALL  DISP_MODE0      ;是0,  按照方式0显示
                      LJMP   MAIN

MODE1:        XRL    A, #1                 ;开关状态是1吗?
                     JNZ    MODE2               
                     LCALL  DISP_MODE1      ;是1,  按照方式1显示
                     LJMP   MAIN

MODE2:       MOV   A, P1  
                     XRL    A, #2                 ;开关状态是2吗?
                     JNZ    MODE3               
                     LCALL  DISP_MODE3      ;是2,  按照方式2显示
                     LJMP   MAIN

MODE3:       MOV   A, P1
                     XRL    A, #3                 ;开关状态是3吗?
                     JNZ    MAIN               
                     LCALL  DISP_MODE3      ;是3,  按照方式3显示

                     LJMP   MAIN

DIMSP_MODE0: 按照方式0显示流水灯,每次只亮一个,从Bit0->Bit7
                   MOV  A, #0FEH
                   MOV  P2, A                         ;点亮P20对应的灯
                   LCALL  DELAY500MS

                  MOV  R7, 7
MODE0_LOOP:
                   SETB   C
                   RLC   A                     ;带进位1做循环,使0依次从Bit0->Bit7
                  MOV  P2, A                ;输出到P2口,点亮“0”对应的Bit口位
                  LCALL  DELAY500MS  ;延迟显示一段时间
                  DJNZ   R7, MODE0_LOOP    ;是否已经完成所有循环
                    RET

DIMSP_MODE1: 按照方式1显示流水灯,逐个点亮所有LED
                  ;0FFH + 进位标志C=0, RLC A,保证P2从0FEH,0FCH,0F8H, ... 到00H
                 ;一次是P2的Bit0到Bit7全部输出0,从而逐个点亮所有LED
                  ...
                    RET
DIMSP_MODE2: 按照方式2显示流水灯
                   ...
                    RET

DIMSP_MODE3: 按照方式3显示流水灯
                   ...
                    RET

DELAY500MS:
               ;循环R6,R5,R4等,保证实现接近500ms
               ...
               RET

具体显示,我只写了处理逻辑,具体代码,需要你自己发挥了。
还有一个比较简单的处理方式,你预先把要显示的模式中,对应P2的变化值,写到一个数组中,然后在
显示处理中,循环取得这些值并输出到P2口。

;利用MOVC A,@A+DPTR指令,从预设的显示数据区取得输出数据
;方式0显示流水灯,每次只亮一个,从Bit0->Bit7
TAB_MODE0:  DB 11111110B, 11111101B, 11111011B,  11110111B,
                          11101111B, 11011111B, 10111111B, 01111111B
;依次全部点亮
TAB_MODE1:  DB 11111110B, 11111100B, 11111000B, 11110000B,
                           11100000B, 11000000B, 10000000B,00000000B
;先全亮,从外向中间转移灭灯
TAB_MODE2: DB  00000000B,  10000001B , 11000011B, 11100111B,  11111111B

为了更直观,数据区的定义,我都是用2进制表示的数据。0对应亮,1对应灭
自定义显示流水灯,你可以在内存开辟一段区域,运行时动态指定这些区域的数据,然后利用循环,把这数据依次输出到P2口,就完成了自定义显示模式。
   

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表