⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.asm

📁 实现交通灯功能的汇编程序.
💻 ASM
字号:
ORG 0000H
LJMP 0100H
ORG 000BH
SETB P3.5
MOV TH0,#88H                       ;10001000=>TH0 0定时/计数器高位	
MOV TL0,#00H                       ;00000000=>TL0 0定时/计数器低位
CLR P3.5
RETI                               ;中断返回
ORG 001BH
LJMP COUNTER                       ;长转移子程COUNTER
ORG 0100H
MAIN:MOV SP,#50H                   ;01010000=>SP入栈确定栈顶
     MOV TMOD,#61H                 ;01100001=>TMOD,1选为自动重装初值的8位计数器
                                    ;0选为16位定时器
     MOV TH1,#0E2H                 ;11100010=>TH1 1定时/计数器高位
     MOV TL1,#0E2H                 ;11100010=>TL1 1定时/计数器低位
     MOV TH0,#88H
     MOV TL0,#00H
     CLR P3.5
     MOV IE,#8AH                   ;10001010=>IE(中断控制器)允许CPU,0,1的中断请求
     SETB TR0
     SETB TR1
     MOV R0,#1EH                   ;00011110=>R0
     MOV R1,#23H                   ;00100011=>R1
     MOV R4,#00H                   ;00000000=>R4
     MOV R5,#00H                   ;00000000=>R5
     MOV R7,#00H                   ;00000000=>R7
     LCALL TRAFFCONTROL            ;调用子程TRAFFCONTROL
LOOP:LCALL SHOWNUM1                ;子程调用
     LCALL SHOWNUM2                ;子程调用
     SJMP LOOP             


SHOWNUM1:MOV A,R0                  ;00011110=>A(累加器)
         MOV B,#0AH                ;00001010=>B(乘法寄存器)
         DIV AB                    ;
         MOV DPTR,#NUMCODE         ;16位数据送指针寄存器
         MOVC A,@A+DPTR            ;(A)<-((A)+(DPTR))
         MOV P0,A                  ;相对数据指针内容送P0口
         MOV P2,#70H               ;立即数0111000送P2口
         LCALL DELAY               ;调用延时程序
         MOV A,B                   ;乘法寄存器内容送累加器
         MOVC A,@A+DPTR            ;(A)<-((A)+(DPTR))
         MOV P0,A                  ;相对数据指针内容送P0口
         MOV P2,#0B0H              ;立即数10110000送P2口
         LCALL DELAY               ;调用延时程序
         RET


SHOWNUM2:MOV A,R1                  ;00100011=>A(累加器)
         MOV B,#0AH                ;00001010=>B(乘法寄存器)
         DIV AB                    ;
         MOV DPTR,#NUMCODE         ;16位数据送指针寄存器
         MOVC A,@A+DPTR            ;(A)<-((A)+(DPTR))
         MOV P0,A                  ;相对数据指针内容送P0口
         MOV P2,#0D0H              ;11010000=>P2
         LCALL DELAY               ;延时程序调用
         MOV A,B                   ;乘法寄存器内容送累加器
         MOVC A,@A+DPTR            ;(A)<-((A)+(DPTR))
         MOV P0,A                  ;相对数据指针内容送P0口
         MOV P2,#0E0H              ;11100000=>P2
         LCALL DELAY               ;延时程序调用
         RET


TRAFFCONTROL:MOV DPTR,#STATE       ;16位立即数送数据指针寄存器
             MOV A,R7              ;00000000=>A
             CJNE A,#03H,NEQUAL    ;累加器与立即数不等,转移到子程NEQUAL
             MOV R7,#00H           ;R7送0
             SJMP OTHERWISE        ;短转移到子程OTHERWISE 
NEQUAL:     INC R7                 ;寄存器内容+1
OTHERWISE:MOVC A,@A+DPTR           ;(A)<-((A)+(DPTR))
          MOV P1,A                 ;累加器内容入P1
          RET
DELAY :MOV R2,#05H                 ;00000101=>R2
DELAY2:MOV R3,#18H                 ;00011000=>R3
DELAY1:NOP                         
       NOP
       DJNZ R3,DELAY1              ;寄存器R3内容减1不为零转移到DELAY1子程
       NOP
       NOP
       DJNZ R2,DELAY2              ;寄存器R2内容减1不为零转移到DELAY2子程
       RET
COUNTER:DJNZ R0,NEXT0              ;寄存器R0内容减1不为零转移到NEXT0子程            
        LCALL TRAFFCONTROL         ;子程转移
        CJNE R4,#02H,NEQUAL1       ;寄存器R4内容与立即数不等转移到NEQUAL1子程
        MOV R4,#00H                ;寄存器R4清零
        SJMP ELSE1                 ;转到ELSE1子程
NEQUAL1:INC R4                     ;R4内容加1
ELSE1:  MOV A,R4                   ;R4内容入A(00000000)
        MOV DPTR,#SCEND1           ;SCEND1立即数送数据指针寄存器
        MOVC A,@A+DPTR             ;(A)<-((A)+(DPTR))
        MOV R0,A                   ;A=>R0
NEXT0:  DJNZ R1,NEXT1              ;R1减1不为零跳转NEXT1子程
        LCALL TRAFFCONTROL         ;调用TRAFFCONTROL子程
        CJNE R5,#02H,NEQUAL2       ;R5与立即数比较不等转NEQUAL2
        MOV R5,#00H                ;R5清零
        SJMP ELSE2                 ;跳转ELSE2
NEQUAL2:INC R5                     ;R5加1
ELSE2:  MOV A,R5                   ;R5=>A
        MOV DPTR,#SCEND2           ;SCEND2立即数送数据指针寄存器
        MOVC A,@A+DPTR             ;(A)<-((A)+(DPTR))
        MOV R1,A                   ;A=>R1
NEXT1 :CJNE R4,#01H,NOTY1          ;R4比较01不等转移NOTY1子程
       CPL P1.1                    ;口P1.1取反
       CPL P1.4                    ;口P1.4取反
NOTY1:CJNE R5,#02H,NOTY2           ;R5与02比不等转移NOTY2子程
NOTY2:RETI                         ;中断返回

STATE :DB 22H,21H,14H,0CH;
SCEND1:DB 1EH,05H,14H;
SCEND2:DB 23H,0FH,05H
NUMCODE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H,80H;
END



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -