📄 chao.asm
字号:
;********************************************
;4位共阴LED数码管
;千位 p2.3
;百位 p2.4
;十位 p2.5
;个位 p2.6
;定时溢出 p1.1
;接收中断 p1.7
;超声发射 p2.0
;可供选择信号指示:p1.1/p1.5/p1.6/p1.7
;注:此程序为方便学习理解,末进行优化
;***********************************************
ORG 0000H
AJMP START
ORG 0003H; 定时器0外中断向量地址
AJMP TIME1
ORG 000BH;定时器0的溢出中断向量地址
AJMP TIME0;跳转到定时器程序出
ORG 36H
START:
MOV TMOD,#00000001B;记数器0工作于方式1
SETB EA;开总中断
LOOP:MOV R0,#01H
MOV 14H,#0AH;超声波发射持续200us
MOV TH0,#0B1H
MOV TL0,#0E0H;赋值定时器定时20ms
SETB ET0;开定时/记数器0溢出中断
SETB TR0;定时/记数器0开始
HERE:CPL P2.0;输出40K方波
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ 14H,HERE
NOP
NOP
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$
MOV R7,#200
DJNZ R7,$;超声波谐振等待
MOV R4,0030H
MOV R5,0031H
SETB EX0;开定时器0外中断
DENG:MOV A,R0;外中断R0为0, 溢出中断r0为0
JNZ DENG;累加器非0转移
MOV A,R1;煌庵卸蟁1为0,溢出中断R1为1;
JNZ DPLOP;累加器非0转移,超量程显示,
MOV R6,#1H
MOV R7,#54H
MOV R2,30H
MOV R3,31H
ACALL MULD
MOV R6,#4EH
MOV R7,#20H
ACALL DIVD
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
JNZ AAA1;
MOV A,R7
CJNE A,#28H,RT;
AJMP RT
RT:JC EEP;
AJMP AAA1
EEP:MOV A,#0BBH;
MOV 33H,A
MOV 34H,A
AJMP DDR
AAA1:ACALL HB2
DDR:ACALL AEE
AJMP LOOP;程序结束返回
RET
AEE:MOV DPTR,#TAB
MOV R6,#255;显示255次
DPLOP:MOV A,33H;*************千位显示
SWAP A
ANL A,#0FH;
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
ACALL DIMS;********如不需要千位显示可删掉
MOV A,33H
ANL A,#0FH;屏蔽A中的高四位
MOVC A,@A+DPTR;查代码
SETB P2.3
MOV P0,A;送出百位的7段代码
CLR P2.4;开百位显示
ACALL DIMS;显示1ms
MOV A,34H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
SETB P2.4
MOV P0,A
CLR P2.5;开十位显示
ACALL DIMS
MOV A,34H
ANL A,#0FH;屏蔽A中的高四位
MOVC A,@A+DPTR;查个位数的7段代码
SETB P2.5
MOV P0,A;送出个位的7段代码
CLR P2.6;开个位显示
ACALL DIMS;
SETB P2.6
DJNZ R6,DPLOP;循环
RET
DIMS:MOV R7,#80;(按12M)
DJNZ R7,$
RET
;MULD 功能:双字节无符号数乘法
;入口条件:被乘数在R2.R3中乘数在R6.R7中
;出口信息:乘积在R2.3.4.5中
;影响资源:PSW.A B R2---7
MULD:MOV A,R3;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B;崭存部分积
MOV R5,A
MOV A,R3;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4; 累加器部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3; 累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;****************************************
;DIVD功能:双字节无符号数除法
;入口条件:被除数在R2.3.4.5中,除数在R6.7中
;出口信息:OV=0时,双字节商在R2.3 中,OV=1时溢出。
;影响资源:PSW,A,B,R1--7
DIVD: CLR C;比较被被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R7
JC DVD1
SETB OV;溢出
RET
;*****************************************
DVD1:MOV B,#10H;计算双字节商
DVD2:CLR C;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C;保存溢出位
CLR C
SUBB A,R7;计算(R2.3--R6.7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0;结果判断
JC DVD3
MOV R2,A;够减,存新的余数
MOV A,R1
MOV R3,A
INC R5;商的低位置一
DVD3:DJNZ B,DVD2;计算完十六位商(R4R5)
MOV A,R4;将商移到R2·R3
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV;设立成功标志
RET
;*****************************************
;HB2功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6R7中
;出口信息:转换后的三字节BCD码整数在R3.4.5中
;影响资源: PSW, A .R2--7
HB2:CLR A;BCD;码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H;转换双字节十六进制整数
HB3:MOV A,R7;从高端移出待转换数的一位到CY
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3;处理完16bit
MOV 32H,R3
MOV 34H,R5
RET
;*******************************************
;T定时器0的溢出中断
TIME0:PUSH ACC;定时器0的溢出中断
PUSH PSW;将PSW和ACC入浅
CLR TR0;关定时器
CLR EX0;关外中断
MOV A,#0AAH
MOV 32H,A
MOV 33H,A
MOV 34H,A
MOV R0,#00H
MOV R1,#01H
CPL P1.1
POP PSW
POP ACC
; RET1
;*****************************************
;T定时器0的外中断
TIME1:PUSH ACC
PUSH PSW;将PSW和ACC入浅
CLR TR0;关定时器
CLR EX0;关外中断
CLR ET0
CPL P1.7
MOV A,TH0;高位
SUBB A,#0B3H;0B1H
MOV 0030H,A
MOV A,TL0
SUBB A,#6FH;0E0H
MOV 0031H,A
MOV R0,#00H
MOV R1,#00H
POP PSW
POP ACC
; RET1
;***************************************
;TAB:0EBH,00AH,067H,06EH,08EH,0ECH,0EDH
; 02AH,0EFH,0EEH,014H,074H,;0123456789
; 一。三。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -