⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sucelev.asm

📁 八路数据采集系统 含有各个详细的子程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
   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 + -