📄 ad0808.asm
字号:
zb equ 50h
org 0000h
ljmp main
org 0003h
ljmp int00
org 000bh
ljmp tr00
org 0030h
main: mov p1,#0ffh
mov 2Ah,#00h ;2Ah设为标志位
mov 20h,#01h ;显示最高位缓冲
mov 21h,#02h
mov 22h,#03h
mov 23h,#04h
mov 24h,#05h
mov 25h,#06h
mov 26h,#07h
mov 27h,#08h ;显示最地位缓冲
setb p3.5
setb it0 ;外部中断0为边沿触发方式
setb ex0 ;允许外部中断0
mov tmod,#00h ;定时方式0
mov tl0,#09h ;T0置初值
mov th0,#0f8h
setb tr0 ;启动T0
setb et0 ;允许T0中断
setb ea ;允许中断
mov 3ah,#0ffh
lcall dirv
;-------------------------;
; 读键 ;
;-------------------------;
kl0:
lcall dirv
mov r3,#00h
mov r2,3ah
lcall lh ;量化(转换成um)
mov r0,#32h ;被解压BCD码高位存32h
mov r1,#23h ;解压后BCD码高位存20h
mov r2,#35h ;被解压BCD码最低位:r2-1
lcall bcdjy ;BCD码解压缩(5字节)
; jb zb,kl0
push 24h
push 1fh
push 28h
mov r3,#00h
mov r2,3ah
lcall lh ;量化(转换成um)
mov r0,#32h ;被解压BCD码高位存32h
mov r1,#1fh ;解压后BCD码高位存20h
mov r2,#35h ;被解压BCD码最低位:r2-1
lcall bcdjy ;BCD码解压缩(5字节)
pop 28h
pop 1fh
pop 24h
mov a,20h ;最高位为加小数点
add a,#0ah
mov 20h,a
mov a,24h ;最高位加小数点
add a,#0ah
mov 24h,a
lcall dirv
clr p3.5 ;选通0808
movx @dptr,a ;启动AD转换
setb ea ;允许中断
setb ex0 ;允许外部中断0
setb zb
ljmp kl0 ;无键按下继续
;---------------------;
; 外部中断0 ;
;---------------------;
int00:
movx a,@dptr
mov 3ah,a
; setb p3.5
clr zb
reti
;---------------------;
; 定时中断0 ;
;---------------------;
tr00:
mov tl0,#0ffh ;T0置初值
mov th0,#0f9h
cpl p3.4 ;产生0808时钟
reti
;---------------------;
; 量化(转换成um) ;
;---------------------;
lh: lcall B16BCD ;二进制到BCD码(双字节)
mov 30h,r6 ;被乘数十万、万位
mov 31h,r5 ;被乘数干位、百位
mov 32h,r4 ;被乘数十位、个位
mov 40h,#01h ;乘数百位、十位
mov 41h,#95h ;乘数个位、小数点后第一位(2.443um)
mov 42h,#31h ;乘数小数点后第二位、小数点后第三位
mov r0,#30h ;被乘数入口指针
mov r1,#40h ;乘数入口指针
mov r3,#03h ;参加乘法运算的压缩的BCD码位数
lcall CMUL ;无符号压缩BCD码乘法(CMUL)(积的小数位舍去送显示)
ret
;---------------------------------------;
; @r0中BCD码解压缩到@r1(r2-r1字节);
;---------------------------------------;
bcdjy: mov a,@r0 ;分解一字节高位
anl a,#0f0h
swap a
mov @r1,a
inc r1
mov a,@r0 ;分解一字节低位
anl a,#0fh
mov @r1,a
inc r1
inc r0
mov a,r0
xrl a,r2
jnz bcdjy
ret
;-------------------------------;
; 二进制到BCD码(双字节) ;
;-------------------------------;
; (1)入口,R3R2,(16位无符号二进制整数).
; (2)出口:R6(万位)、R5(干位、百位)、R4(十位、个位)存放5位BCD码。
;2.程序清单
B16BCD:
CLR A ;BCD码寄存器清零
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#10H ;设循环指针
LP0: CLR C ;左移一位,移入c
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4 ;实现(…)X2十ai运算
ADDC A,R4
DA A
MOV R4,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
DJNZ R7,LP0
RET
;-------------------------------------;
; 无符号压缩BCD码乘法子程序(CMUL) ;
;-------------------------------------;
;功能:将(R0)指向的n字节压缩的BCD码乘以(R1)指向的n
;字节压缩的BCD码。
;入口:十进制被乘数存放在addrl—addr+n—1单元,高位在前。
;十进制乘数存放在addr2—acldr2+n—1单元,高位在前。
;(R0):addrl,(R1)=addr2,(R3)=n
;出口:积存放在addr-addrl+2n—1单元中,(R0)=addrl。
;使用寄存器:A,R0,R1,n2,R3,R6,R7及标志cy0
;例如:(R0)=20;(20)=01;(21)=25;(R1)=40;(40)=00;
;(41)=25;(R3)=02
;执行后得:(R0)=20;(20)=00;(21)=00;(22)=31; (23)=25
;程序清单:
CMUL: MOV A, R3
MOV R6, A
ADD A, R3
MOV R2, A
MOV A, R3
ADD A, R0
MOV R0, A
MOV A, R1
ADD A, R3
DEC A
MOV R1, A
CLR A
CMUL1: MOV @R0, A
INC R0
DJNZ R6, CMUL1
MOV A, R2
MOV R6, A
DEC R0
CMUL2: CLR A
CMUL3: XCH A, @R0
SWAP A
XCHD A, @R0
XCH A, @R0
DEC R0
DJNZ R2,CMUL3
MOV R7, A
JZ CMUL7
CMUIA: MOV A, R3
MOV R2, A
ADD A, R3
ADD A, R0
MOV R0, A
CLR C
CMUL5: MOV A, @R0
ADDC A, @R1
DA A
MOV @R0,A
DEC R0
DEC R1
DJNZ R2, CMUL5
MOV A, R3
MOV R2, A
CMUL6: CLR A
ADDC A, @R0
DA A
MOV @R0,A
DEC R0
DJNZ R2, CMUL6
MOV A, R3
ADD A, R1
MOV R1, A
DJNZ R7, CMUIA
CMUL7: MOV A, R3
ADD A, R3
MOV R2, A
ADD A, R0
MOV R0, A
DJNZ R6, CMUL2
RET
;-------------------------;
; 显示 ;
;-------------------------;
;********************************************************
dirv: mov r0,#0feh
mov r1,#27h
mov a,r0
di1: jb acc.0,di10 ;位选
clr p1.0
ljmp di17
di10: setb p1.0
jb acc.1,di11
clr p1.1
ljmp di18
di11: setb p1.1
jb acc.2,di12
clr p1.2
ljmp di18
di12: setb p1.2
jb acc.3,di13
clr p1.3
ljmp di18
di13: setb p1.3
jb acc.4,di14
clr p1.4
ljmp di18
di14: setb p1.4
jb acc.5,di15
clr p1.5
ljmp di18
di15: setb p1.5
jb acc.6,di16
clr p1.6
ljmp di18
di16: setb p1.6
jb acc.7,di17
clr p1.7
ljmp di18
di17: setb p1.7
di18: mov dptr,#tabdis ;查段选表
mov a,@r1
movc a,@a+dptr
mov p2,a ;段选
; mov r7,#01h
;di2: mov r6,#01h
;di3: djnz r6,di3
; djnz r7,di2
mov r7,#03h
di2: mov r6,#0ffh
di3: djnz r6,di3
djnz r7,di2
dec r1 ;
mov a,r0
jnb acc.7, di4
rl a ;下一位(左移)
mov r0,a
ljmp di1
di4: ret
;********************************************************
tabdis:
DB 03fh,06H,05bH,04fH,066H,06dH,07dH,07H
; "0" "1" "2" "3" "4" "5" "6" "7"
DB 07fH,06fH,0Bfh,86H,0dbH,0cfH,0e6H,0edH
; "8" "9" "0." "1." "2." "3." "4." "5."
DB 07dH,07H,0ffH,0efH,077H,07cH,039H,05eH
; "6." "7.""8." "9." "A" "b" "C" "d"
DB 079H,071H,03dH,076H,00fH,00eH,0f0H,038H
; "E" "F" "G" "H" "I" "J" "k" "L"
DB 0d4H,054H,05cH,073H,0dcH,050H,0d8H,078H
; "m" "n" "o" "P" "Q" "r "s" "t"
DB 03eH,018H,098H,0f2H,06eh,0ccH,000h
; "U" "v" "w" "x" "y" "z" " "
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -