ORG 0300H
CSH: MOV R3,#0FH ;字位码始值送R3
MOV A,R3
MOV P2,A ;字位码送P2口
MOV A,#0C0H ;字形码送A(“0”的字形码)
MOV P0,A ;字形码送P0口,LED显示全0
START: JB P1.0,START ;等待开始键按下,若无按下,则系统不工作
ZCZ: MOV TMOD,#55H ;令T0和T1为计数器方式1
MOV TH0,#0D8H ;装入T0高8位初值
MOV TL0, #0F0H ;装入T0低8位初值
SETB TR0 ;启动T0计数
SETB TR1 ;启动T1计数
JX: JB TF0,OK ;若T0溢满,跳转至OK
AJMP JX ;若T0未溢满则JX
OK: CLR TR0 ;停止T0计数
CLR TR1 ;停止T1计数
QIUCHA: ;求T0与T1的差值
MOV 10H,TL0 ;赋T0低八位给10H
MOV 11H,TH0 ;赋T0高八位给11H
MOV 12H,TL1 ;赋T1低八位给12H
MOV 13H,TH1 ;赋T1高八位给13H
CLR C ;清零
MOV A,11H
SUBB A,13H ;T0与T1高八位相减
MOV 15H,A ;结果赋给15H
MOV A,10H
SUBB A,12H ;T0与T1低八位相减
MOV 14H,A ;结果赋给14H
JC QJDZ
MOV R7,#00H ;差值为为正数时,R7=0
MOV 16H,14H ;差值低八位赋给16H
MOV 17H,15H ;差值高八位赋给17H
SJMP LOOP ;转移至LOOP
QJDZ: ;求绝对值
MOV R7,#01H ;差值为负数时,R7=1
MOV A,14H ;低八位赋给A
CPL A ;取反
INC A ;加1
MOV 16H,A ;赋给16H
JC JIA ;低八位若产生进位,则跳转JIA
MOV A,15H ;无进位,高八位赋给A
CPL A ;取反
MOV 17H,A ;赋给17H
SJMP LOOP ;转移至LOOP
JIA: ;低八位有产生进位
MOV A,15H ;把1高八位赋给A
CPL A ;取反
INC A ;加1
MOV 17H,A ;赋给17H
SJMP LOOP ;转移至LOOP
LOOP:
MOV A, 16H ;低八位二进制赋给A
MOV B, #100 ;100赋给B
DIV AB ;A除以B
MOV R3, A ;百位数送R3
MOV A, #10 ;10赋给A,B中为余数
XCH A, B ;A与B中的数交换
DIV AB ;A除以B
MOV R4, A ;十位数送R4,B中为余数
MOV R5, B ;个位数送R5
DISPLY:
MOV DPTR,#TABLE ;DPTR指向字形表的起始地址
MOV R0,#00001000B ;字位码送R0
MOV A,R5 ;个位数字形码的地址偏移量送A
MOVC A,@A+DPTR
MOV P0,A ;字形码送P0口
MOV P2,R0 ;字位码送P2口
ACALL DELAY ;延时1ms
ANL P2,#00000000B ;令显示器熄灭,以免产生残影
MOV DPTR,#TABLE ;DPTR指向字形表的起始地址
MOV A,R0
RR A ;字位码右移
MOV R0,A
MOV A,R4 ;十位数字形码的地址偏移量送A
MOVC A,@A+DPTR