📄 sucelev.asm
字号:
ASSU: MOV A,HBZ ;HBZ高越限标识字节
MOV R5,NUMK ;NUMK表示优先显示的路数
INC R5 ;带进位右移NUMK+1次,将第K路的高报警标识位移出
LP1: RRC A
DJNZ R5,LP1
JC NEXT2 ;若第K路的低值标志位为1,表明无故障,继续查低限
SETB STATE ;标志位为1,则第K路高于上限;置第K路越高限标志
RET ;此次循环显示路数以确定,可返回
NEXT2: MOV A,LBZ ;LBZ低越限标识字节
MOV R5,NUMK ;NUMK表示优先显示的路数
INC R5 ;带进位右移NUMK+1次,将第K路的低报警标识位移出
LP2: RRC A
DJNZ R5,LP2
JC NEXT3 ;标志位为0,则表明第K路低于下限
CLR STATE ;清STATE标志位表明第K路越低限
RET ;此次循环显示路数以确定,可返回
NEXT3: INC NUMK ;若执行到了NEXT3,表明第K路无故障,检查下一路
MOV A,NUMK
CJNE A,#LUSHU,NEXT0 ;路数加一,但要检查是否超过总路数
MOV NUMK,#0 ;若超过八,则将路数值为0
SJMP NEXT0
;########################################################## NUMK值确定子程序终
PREDISP: MOV R1,#HUCH ;调显示之前,先填充缓冲区
MOV R5,NUMK ;NUMK表示此次循环应显示的路数
INC R5
MOV A,DOTB
LP6: RRC A ;小数点标识位右移NUMK+1次,将第K路的小数信息移出
DJNZ R5,LP6
JC LP4
MOV @R1,#0 ;移出的小数标志位为0,则显示0
SJMP LP7
LP4: MOV @R1,#5 ;移出的小数标志位为1,则显示1
LP7: MOV A,R1
ADD A,#3 ;找到百位的缓冲单元
MOV R1,A
MOV A,#SHUJU ;数据首址
ADD A,NUMK ;找到第K路对应的存储单元
MOV R0,A
MOV A,@R0 ;将第K路数值存到A中
MOV B,#100 ;得到第K路数值百位,十位和个位
DIV AB
CJNE A,#0,YIN0 ;若百位为零,则消隐
MOV A,#15
YIN0: MOV @R1,A ;得到百位
MOV A,B
MOV B,#10
DIV AB
DEC R1
MOV @R1,A ;得到十位
MOV A,B
ADD A,#19 ;得到个位,个位数要加小数点
DEC R1
MOV @R1,A
MOV A,R1
ADD A,#4
MOV R1,A
MOV A,NUMK
MOV @R1,A ;送至频道显示单元
DEC R1
MOV @R1,#10 ;使2EH单元显示 ‘-’
JB GUZO,NEXT12 ;无故障,返回即可
RET
NEXT12: MOV A,ZESH ;有故障,在前1秒内显示数值,后1秒内显示原因
MOV NUMN,A
RET
;############################################################## 数据缓冲程序终
DISP: JB GUZO,SP1 ;无故障,直接调用显示程序即可
ACALL SHOW
RET
SP1: MOV A,NUMN ;故障情况下,判断在前1秒,还是在后1秒
CLR C
SUBB A,#10
JC SP2
ACALL SHOW ;前1秒,显示有故障通道的数值
RET
SP2: MOV R0,#HUCH ;后1秒,显示有故障通道的故障原因
JNB STATE,TLOW ;若STATE为0,说明太低了
MOV @R0,#14 ;若STATE为1,说明太高了
SJMP SP3 ;14对应字母'H'
TLOW : MOV @R0,#11 ;11对应字母'L'
SP3 : INC R0
MOV @R0,#12 ;12对应字母'o'
INC R0
MOV @R0,#12
INC R0
MOV @R0,#13 ;13对应字母't'
INC R0
ACALL SHOW
RET
;############################################################## 显示子程序1终
SHOW: MOV R0,#HUCH ;找到缓冲首址
MOV R2,#01H ;位控初始码(先亮最低位)
LOOPS: MOV A,#0FFH ;共阳灭码
MOV DPTR,#0FFDCH
MOVX @DPTR,A
MOV A,R2 ;送位控信号
MOV DPTR,#0FFDDH
MOVX @DPTR,A
MOV DPTR,#TAB0
MOV A,@R0 ;从显示缓冲中取数
MOVC A,@A+DPTR ;查出字形代码
MOV DPTR,#0FFDCH
MOVX @DPTR,A ;送显示字符段代码
ACALL DY1MS ;稳定显示信息
INC R0 ;取下一个数
MOV A,R2
JB ACC.5,EXIT ;判断是否送到最高位?
RL A
MOV R2,A ;得到下一个位控信号
AJMP LOOPS
EXIT: RET
TAB0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
DB 0BFH,0C7H,0A3H,87H,89H, 0FFH ,0C6H,0CEH,086H
;'-', 'L','o', 't','H' '消隐' 'C' 'E'
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;带小数点的个位
DY1MS: MOV R7,#0FFH
DJNZ R7,$
RET
;############################################################ 延时一毫秒程序终
T0_INT: DEC NUMN ;NUMN单元存储定时器计数次数,从10减到0
MOV A,NUMN
CJNE A,#0,NEXT5 ;未完成定时1S,则继续赋初值,继续定时
CLR TR0 ;定时完成,关定时器
RETI
NEXT5: MOV TH0,#3CH
MOV TL0,#080H
RETI
;######################################################## 定时器0中断子程序终
JIANSAO:
SAO: ACALL KINP ;键盘扫描程序,扫描数值放于 A 中
JNB PSW.5,SAO1 ;有键按下,转向SAO1,处理键值
JB QLOCK,SAO13
JB QLIM,SAO13
RET
SAO1: MOV DPTR,#TAB1
MOVC A,@A+DPTR ;扫描到的值要先查表,得到用户在键盘上看到的值
CJNE A,#FIX,SAO2 ;若按下键不是锁定键,则转移
JNB YLOCK,SAO3 ;若已锁定标志位未置位,则转移
CLR YLOCK ;若YLOCK已置位,表明此次按下锁定键的是要解除锁定
RET
SAO3: JNB QLOCK,SAO4 ;如果请求锁定标志位没置位,则转移
CLR QLOCK ;若请求标志位已置位,表明用户按过锁定键后改变主
MOV NUMN,#0 ;意,没有输入路数即退出
RET ;准备进入下一次循环
SAO4: SETB QLOCK ;请求锁定标志位没置位,则表明此次按锁定键的目的
CLR TR0 ;是锁定显示某路; 设定前先关定时器 T0
MOV R0,#HUCH ;填充缓冲区
MOV A,#15 ;刚开始,先将末位消隐,等待输入路数后,再显示
MOV @R0,A
INC R0
MOV A,#10 ;倒数第二位显示‘-’
MOV @R0,A
INC R0
MOV A,#15 ;倒数第三位消隐
MOV @R0,A
INC R0
MOV A,#16 ;倒数第四位显示'C'
MOV @R0,A
INC R0
MOV A,#0 ;倒数第五位显示'O'
MOV @R0,A
INC R0
MOV A,#11 ;倒数第六位显示'L'
MOV @R0,A
CLR QLIM ;若请求设定上下值键也置位,则清掉
CLR TODAO ;清掉设定上下限中的其他标志位,防止未完成上下限
CLR GADI1 ;设定而按下锁定键后出现的异常
CLR GADI2
AJMP SAO0 ;等待输入路数
SAO2: JNB QLOCK,SAO8 ;请求锁定标识位置位情况下,此次按下的键认为是路数
MOV R3,A
CLR C
SUBB A,#8 ;要检查输入的路数是否在0-7之内
JNC SAO13 ;若不在0-7之内,此次输入无效,继续等待输入
CLR QLOCK ;在0-7之内,此次输入有效,清掉请求锁定标志位
SETB YLOCK ;已锁定,置已锁定标志位
MOV A,R3
MOV R0,#HUCH
MOV @R0,A ;将输入的路数在数码管上显示出来
MOV NUMK,A ;将输入的路数存到 NUMK 中,以后即显示此路
MOV NUMN,#15
MOV TH0,#3CH ;定时1.5s,让用户看到输入的路数
MOV TL0,#080H
SETB TR0
SAO9: ACALL SHOW
MOV A,NUMN ;通过NUMN检查一下定时器是否已经定时完1.5秒
CJNE A,#0,SAO9
RET ;程序认为输入有效,则显示1.5s后,程序自动退出
SAO13: ACALL SHOW ;调用显示程序后,再扫描
AJMP SAO
SAO8: CJNE A,#DING,SAO5 ;如果按下的不是设定上下界键,转移至SAO5
JNB QLIM,SAO6 ;判断请求设定上下界键是否置位
JB XIAN,JIE0 ;若数据输入标志位置位,则进行码转换,并存储
SJMP JIE16 ;否则说明停止数据输入或数据已经输入,退出
JIE0: MOV A,R6 ;非压缩BCD转化为二进制
MOV B,#100
MUL AB
MOV R6,A
MOV A,R5
MOV B,#10
MUL AB
ADD A,R6
ADD A,R4
PUSH ACC ;得到的二进制数堆栈保护
JNB GADI2,JIE14
MOV A,#HILMT ;如果当前设置高限,则将高限存储单元赋予 A
SJMP JIE15
JIE14: MOV A,#LOLMT ;如果当前设置低限,则将高限存储单元赋予 A
JIE15: ADD A,@R1 ;找到限值存储单元
MOV R0,A
POP ACC ;将保护后的二进制数弹出
MOV @R0,A ;将转化后的值存入要设定的单元
JIE16: CLR QLIM ;若已经置请求设定上下限位,表明按下此键是要退出
MOV NUMN,#0 ;设定界值程序; 准备进入下一次循环
CLR TODAO ;程序退出前要清标志位
CLR GADI1
CLR GADI2
CLR XIAN
CLR GEW
CLR SHI
CLR BAI
RET
SAO6: CLR TR0 ;设定上下界标志位未置位,则表明按下此键是要设限
SETB QLIM ;置位请求设定上下界标志位
MOV R2,#6 ;填充缓冲,将后五个显示器消隐
MOV R0,#HUCH
MOV A,#15
SAO7: MOV @R0,A
INC R0
DJNZ R2,SAO7
MOV A,#HUCH ;缓冲区首址赋予A
ADD A,#3
MOV R0,A ;使2DH单元显示 '-'
MOV @R0,#10
LJMP SAO0 ;返回继续扫描
SAO5: JB QLIM,SAO10 ;检查请求设定上下界键是否置位,置位则进行处理
RET ;没有置位,此次输入当作误输入,退出此子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -