📄 a1.asm
字号:
MOV A,#90H ;定数大于等于9500按9000进行测量
WK62: ANL A,#0F0H
JNZ WK63 ;定数大于等于500且小于9500,百位四舍五入,按整千进行测量
MOV A,#10H ;定数大于等于100且小于500按1000进行测量
WK63: MOV TJH,A
MOV TJL,#0 ;按整千计算
SETB DINS ;按定数方式进行测量
LJMP WK6E
WK64: MOV A,TJL
SETB C
SUBB A,#64H
JC WK65
MOV TJL,#64H ;最长定时限定在64s
SJMP WK66
WK65: MOV A,TJL
SUBB A,#3
JNC WK66
MOV TJL,#4 ;不得小于4s
WK66: CLR DINS ;按定时方式进行测量
WK6E: CLR SETTING
MOV SETP,#0
LJMP WKE ;返回汇合点
WK7: MOV R0,#TJSZ ;指向定时条件
LJMP WK90
WK8: JNB SETTING,WK8E ;查询状态,暂不移位
MOV A,SETP ;调整修改位置
INC A
ANL A,#3
MOV SETP,A
WK8E: SETB SETTING ;设置修改标志
LJMP WKE ;返回汇合点
WK9: MOV R0,#NOSZ ;指向序号
WK90: JNB SETTING,WK9E ;查询状态,暂不加1
JNB SETP1,WK91 ;字节定位
INC R0
WK91: MOV A,@R0 ;读取该字节
JNB SETP0,WK92 ;半字节定位
SWAP A ;调整到高半位字节
WK92: ADD A,#10H ;十进制加一
DA A
JNB SETP0,WK93
SWAP A
WK93: MOV @R0,A ;保存结果
WK9E: SETB SETTING ;设立修改标志
WKE: MOV STATE,STATEN ;各模块的汇合点,进入次态
SETB KEYP ;按键处理结束,设立响应标志
LJMP LOOP
;读键子程序:
KIN: ORL P1,#0FH ;从P1口读取键码
MOV A,P1
CPL A
ANL A,#0FH
INC A
MOVC A,@A+PC ;将键码换成顺序码
RET
DB 0,1,2,0,3,0,0,0
DB 4,0,0,0,0,0,0,0
;延时子程序:(0.524s,6MHz晶体524295)
TIM2: MOV R5,#2
MOV R6,#0
MOV R7,#0
WAT1: DJNZ R7,WAT1
DJNZ R6,WAT1
DJNZ R5,WAT1
RET
;启动一次测量子程序:
BEG: MOV NH,#0 ;计数器清零
MOV TH1,#0
MOV TL1,#0
MOV SEC,#0 ;时钟复位
MOV SECD,#0
MOV TL0,#0EEH
MOV TH0,#85H
SETB TR1 ;开始计数
SETB ET1
RET
;三字节除以一字节(R3R4R5/R7-->R4R5):
DV31: MOV R2,#10H
DM23: 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
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: RET
;双字节十六进制数(R6R7)转换为十进制数(R3R4R5):
HB2: CLR A
MOV R5,A
MOV R4,A
MOV R3,A
MOV R2,#10H
CLR C
HB3: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
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
DA A
MOV R3,A
DJNZ R2,HB3
RET
;显示模块:
DISP: SETB DISPLY ;执行显示
MOV A,STATE ;按状态进行显示
JNZ DSP0
SETB LED ;测量休止期,发光二极管灭
MOV R0,#CPSSZ ;显示CPS
SJMP DSPN
DSP0: CJNE A,#1,DSP1
CLR LED ;测量中,发光二极管亮
MOV R0,#NOSZ ;显示测点序号
SJMP DSPN
DSP1: CJNE A,#2,DSP2
MOV C,SECD2 ;条件状态,发光二极管慢闪
MOV R0,#TJSZ ;显示测量条件
SJMP DSP3
DSP2: MOV C,SECD8 ;序号状态,发光二极管快闪
MOV R0,#NOSZ ;显示测点序号
DSP3: MOV LED,C ;发光二极管闪烁
DSPN: MOV A,@R0 ;将待显示的数据分解后送显示缓冲区
ANL A,#0F0H
SWAP A
MOV BUF1,A
MOV A,@R0
ANL A,#0FH
MOV BUF2,A
INC R0
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV BUF3,A
MOV A,@R0
ANL A,#0FH
MOV BUF4,A
JNB SETTING,SHOW ;修改状态?
JNB SECD8,SS ;亮1/8s
MOV A,SETP ;指向闪烁位
ANL A,#3
ADD A,#BUFSZ
MOV R0,A
MOV @R0,#0AH ;灭1/8s
SJMP SS
SHOW: MOV A,BUF1 ;灭0处理
JNZ SS
MOV BUF1,#0AH
MOV A,BUF2
JNZ SS
MOV BUF2,#0AH
MOV A,BUF3
JNZ SS
MOV BUF3,#0AH
MOV A,BUF4 ;取个位数据
SS: MOV DPTR,#LST4 ;取个位数据的笔型表
MOVC A,@A+DPTR ;查表
LCALL OUT ;输出个位数据的笔形码
MOV A,BUF3
MOV DPTR,#LST3
MOVC A,@A+DPTR
LCALL OUT ;输出十位数据的笔型码
MOV A,BUF2
MOV DPTR,#LST2
MOVC A,@A+DPTR
LCALL OUT ;输出百位数据的笔型码
MOV A,BUF1
MOV DPTR,#LST1
MOVC A,@A+DPTR ;输出千位数据的笔型码
OUT: MOV SCON,#0 ;从串行口输出笔型码
MOV SBUF,A
WAIT: JNB TI,WAIT
CLR TI
RET
LST1: DB 12H,0DBH,31H,51H ;千位笔形码
DB 0D8H,54H,14H,5BH
DB 10H,50H,0FFH,0FFH
LST2: DB 50H,0D7H,61H,0C1H ;百位笔型码
DB 0C6H,0C8H,48H,0D3H
DB 40H,0C0H,0FFH,0FFH
LST3: DB 60H,7BH,0C1H,49H ;十位笔型码
DB 5AH,4CH,44H,6BH
DB 40H,48H,0FFH,0FFH
LST4: DB 50H,0DBH,31H,19H ;个位笔型码
DB 9AH,1CH,14H,0D9H
DB 10H,18H,0FFH,0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -