📄 pljsj.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ZDZD
MAIN:MOV SP,#60H
MOV 30H,#0FDH ;
MOV 31H,#0FDH ;
MOV 32H,#0FDH ;
MOV 33H,#0FDH ;
LCALL XS4 ;
LCALL XS4 ;
LCALL XS4 ;
LCALL XS4 ;以上程序为开机自检程序
CLR A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,A ;所有缓存清零
MOV TMOD,#51H ;置T1为计数方式,T0为定时方式
MOV TCON,#02H
MOV TL1,#00H
MOV TH1,#00H ;置T1初值
MOV TL0,#3CH
MOV TH0,#0B0H ;置T0初值
MOV IP,#02H ;置T0为高优先级中断
MOV IE,#82H ;开T0中断和总中断
SETB TR1
SETB TR0 ;开启T0和T1
MOV R4,#20
LDIR:LCALL XSXS
SJMP LDIR ;调用显示程序并等待中断
;分离数字子程序
FLFL:MOV R0,#30H ;置千位BCD码间址
MOV A,30H ;置被除数
MOV B,31H ;
MOV R6,#03H ;置除数1000=03E8H
MOV R5,#0E8H ;
LCALL SUM ;除以1000,千位商存30H,余数存A B
MOV R6,#0 ;置除数100
MOV R5,#100 ;
INC R0 ;指向百位商间址(31H)
LCALL SUM ;除以100,百位商存31H,作余数存B,(A=0)
MOV A,#10 ;置除数10
XCH A,B ;
DIV AB ;除以10
INC R0 ;指向十位商间址32H
MOV @R0,A ;十位商存32H
XCH A,B ;读个位数
INC R0 ;指向个位间址(33H)
MOV @R0,A ;个位存33H
RET
;16位除法子程序
SUM: MOV R7,#0 ;商寄存器清零
SLP: CLR C ;CY清零
XCH A,B ;被除数低8位入A;被除数高8位入B
SUBB A,R5 ;被除数低8位减除数低8位
XCH A,B ;低8位差入B,被除数高8位入A
SUBB A,R6 ;被除数高8位减除数高8位
INC R7 ;商预加1
JNC SLP ;够减,转再减
DEC R7 ;不够减,商复原
XCH A,B ;低8位差入A,高8位差入B
ADD A,R5 ;低8位差加减(除)数低8位等于被减(除)数低8位,入A
XCH A,B ;被减(被除)数低8位入B,高8位差入A
ADDC A,R6 ;高8位差加减数(除数)高8位等于被减(被除)数高8位
XCH A,R7 ;被减(被除)数高8位入R7,商入A
MOV @R0,A ;商存@R0
XCH A,R7 ; 被减(被除)数高8位入A
RET ;返回
;转换显示字段码子程序
ZHZH:MOV DPTR,#TAB ;置共阳字段码表首址
MOV R0,#30H ;置显示数据区首址
CGLP:MOV A,@R0 ;取显示数字
MOVC A,@A+DPTR ;读相应显示字段码
MOV @R0,A ;指向下一位显示数字
INC R0 ;判5个显示数字转换完否?未完继续
CJNE R0,#35H,CGLP ;转换完毕,结束
RET ;
TAB: DB 0EDH,088H,0B5H,0B9H,0D8H ;字段码表
DB 79H,7DH,0A8H,0FDH,0F9H
;显示子程序
;---------------- 判0消隐部分 -----------------------
XSXS:CLR A ;
MOV A,30H ;先判断千位字段码是否为0
CJNE A,#0C0H,XS4 ;千位不为0,就从这位开显
MOV A,31H ;千位为0,就判断百位
CJNE A,#0C0H,XS3 ;百位不为0,就从这位开显
MOV A,32H ;百位为0,就判断十位
CJNE A,#0C0H,XS2 ;十位不为0,就从这位开显
AJMP XS1 ;十位为0,不管个位是什么,都要显示
;-----------------动态显示部分------------------------
XS4: MOV P0,30H ;千位段码送P0口
MOV P2,#08H ;千位位码送P2口
LCALL DY2ms ;显示2ms
MOV P2,#0FFH ;关闭这一位
XS3: MOV P0,31H ;百位段码送P0口
MOV P2,#06H ;百位位码送P2口
LCALL DY2ms ;显示2ms
MOV P2,#0FFH ;关闭这一位
XS2: MOV P0,32H ;十位段码送P1口
MOV P2,#04H ;十位位码送P3口
LCALL DY2ms ;显示2ms
MOV P2,#0FFH ;关闭这一位
XS1: MOV P0,33H ;个位段码送P1口
MOV P2,#02H ;个位位码送P3口
LCALL DY2ms ;显示2ms
MOV P2,#0FFH ;关闭这一位
RET
;2ms延时子程序
DY2ms:MOV R2,#4 ;外循环次数
DLP1:MOV R3,#250 ;内循环次数
DLP2:DJNZ R3,DLP2 ;2机周X250X1us/机周=500us=0.5ms
DJNZ R2,DLP1 ;0.5msX4=2ms
RET
;T0中断服务子程序
ORG 200H ;T0中断服务程序首地址
ZDZD:PUSH Acc ;保护现场
PUSH PSW ;
MOV TH0,#3CH ;重置T0初值
MOV TL0,#0B0H ;
DJNZ R4,GOGO ;判1S到否,未到转返回
CLR TR1 ;1S到,停T1
MOV 30H,TH1 ;转存T1内计的数
MOV 31H,TL1 ;
MOV TH1,#0 ;清T1
MOV TL1,#0 ;
SETB TR1 ;T1重新运行
MOV R4,#20 ;50mm计数器重置
LCALL FLFL ;调分离显示数字子程序
LCALL ZHZH ;调数字转换为字段码子程序
GOGO:POP PSW ;恢复现场
POP Acc ;
RETI ;中断返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -