📄 text1.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 + -