📄 yali.asm
字号:
;-------------------------------------------------------------------
A_DPORT EQU 8100H ;0809 口地址
Z8279 EQU 0FF82H ;8279状态口地址
D8279 EQU 0FF80H ;8279数据口地址
LEDMOD EQU 00H ;左边输入;外部译码键扫描方式,双键互锁
LEDFEQ EQU 2FH ;扫描速率
LEDCLS EQU 0C1H ;清除显示 RAM
LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址
MAX EQU 30H ;采集数据的最大值
MIN EQU 31H ;采集数据的最小值
AVERAGE EQU 32H ;采集数据的平均值
BIN_XS EQU 33H ;压力的二进制小数位
FLAG_BW EQU 34H ;十进制压力值百位标志位
FLAG_SW EQU 35H ;十进制压力值十位标志位
FLAG_GW EQU 36H ;十进制压力值个位标志位
FLAG_SFW EQU 37H ;十进制压力值十分位标志位
FLAG_BFW EQU 38H ;十进制压力值百分位标志位
FLAG_DW EQU 39H ;十进制压力值单位K/警戒值L/H
;-------------------------------------------------------------------
ORG 0000H
LJMP START
;ORG 0003H ;INT0入口地址
ORG 0040H
START:
MOV SP,#60H
LCALL INIT8279 ;初始化键盘/显示接口芯片8279
MOV R7,#0FFH ;A/D转换结束标志
LOOP:
MOV R6,#10H ;采集16个数,并放在50H起始的16个单元中
MOV R0,#50H
;SETB IT0 ;选择INT0为边沿触发
;SETB EX0 ;开中断
;SETB EA
A_D:
MOV A,#00H ;通道数
MOV DPTR,#A_DPORT
MOVX @DPTR,A ;启动A_D
;CJNE R7,#00H,$ ;等待 A_D 转换结束
LCALL T128VS ;128VS延时程序
LCALL SCH
MOV @R0,A ;数据保存到50H起始的单元中
INC R0
MOV R7,#0FFH ;清读数标志
DJNZ R6,A_D
;CLR EA ;关中断
LCALL FILTER ;数据平滑处理子程序
LCALL DISPLAY ;显示压力值子程序
LCALL DELAY
LCALL DELAY
LJMP LOOP
;-------------------------------------------------------------------
T128VS: ;128VS延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
TM:
MOV 1,#40H
DJNZ 1,$
DJNZ 0,TM
POP 1 ;恢复现场
POP 0
RET
;-------------------------------------------------------------------
SCH: ;A/D转换
;MOV A,@DPTR ;置RD信号有效
MOVX A,@DPTR ;读 A_D 数据
MOV R7,#00H ;置读数标志
RETI
;-------------------------------------------------------------------
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
LCALL DELAY ;延时
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;-------------------------------------------------------------------
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1:
MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET
;-------------------------------------------------------------------
FILTER: ;数据平滑处理子程序,结果放在AVERAGE中
MOV A,#00H
MOV R7,#10H ;计数
MOV R6,#00H
MOV R5,#00H
MOV MAX,#00H
MOV MIN,#0FFH
MOV R0,#50H ;从50H开始依次取出16个数据
DSP:
CLR C
MOV A,@R0
CJNE A,MAX,QMAX
SJMP NEXT
QMAX: ;求16个数据中的最大值
JC NEXT
MOV MAX,A
NEXT:
CJNE A,MIN,QMIN
SJMP QSUM
QMIN: ;求16个数据中的最小值
JNC QSUM
MOV MIN,A
QSUM: ;求16个数据之和
CLR C
ADDC A,R5
MOV R5,A
MOV A,R6
ADDC A,#00H
MOV R6,A
INC R0
DJNZ R7,DSP
CLR C ;从和中减去最大值
MOV A,R5
SUBB A,MAX
MOV R5,A
MOV A,R6
SUBB A,#00H
MOV R6,A
CLR C ;再减去最小值
MOV A,R5
SUBB A,MIN
MOV R5,A
MOV A,R6
SUBB A,#00H
MOV R6,A
MOV R2,#0EH ;求平均值
ACALL DIVIDE
MOV AVERAGE,R5
RET
;-------------------------------------------------------------------
DISPLAY:
MOV B,#50
MOV A,AVERAGE
LCALL CONVERT ;电压信号转换为二进制压力值
LCALL B2BCD
MOV R4,#04H
LCALL DIS_DATA ;显示压力值
RET
;-------------------------------------------------------------------
CONVERT: ;间接压力值F=50*X/255=B*A/R2
;为真实值的1/10
MUL AB
MOV R5,A
MOV R6,B
MOV R2,#255 ;置除数为255
LCALL DIVIDE
CJNE R6,#00H,CONV1
SJMP CONV2
CONV1:
MOV BIN_XS,R5
MOV R5,#0
MOV R2,#0FFH
ACALL DIVIDE
MOV A,BIN_XS
MOV R6,A
RET
CONV2:
MOV A,R5
MOV R6,A
MOV R5,#0
RET
;-------------------------------------------------------------------
DIVIDE: ;16位/8位除法,商在R5中,余数在R6中
MOV R7,#08H
DIV1:
CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV 44H,C
CLR C
SUBB A,R2
JB 44H,DIV2
JNC DIV2
ADD A,R2
AJMP DIV3
DIV2:
INC R5
DIV3:
MOV R6,A
DJNZ R7,DIV1
RET
;-------------------------------------------------------------------
B2BCD: ;二进制数转为十进制数
MOV A,R5 ;二进制小数0.R5转为二位十进制小数
MOV B,#0AH
MUL AB
MOV R0,A
MOV A,B
SWAP A
MOV R1,A
MOV A,R0
MOV B,#0AH
MUL AB
MOV R0,A
MOV A,B
ORL A,R1
MOV R1,A
MOV A,R0
MOV B,#0AH
MUL AB
MOV A,B
CJNE A,#4,JUDGE4
SJMP COMP_OK
JUDGE4:
JNC BIGER5
SJMP COMP_OK
BIGER5:
CJNE R1,#99H,D_PART
MOV R1,#00H
MOV A,R6
ADD A,#1H
MOV R6,A
MOV FLAG_SFW,#00H
MOV FLAG_BFW,#00H
RET
D_PART:
MOV A,R1
ADD A,#1H
DA A
MOV R1,A
COMP_OK:
MOV A,R1
ANL A,#0F0H
SWAP A
MOV FLAG_SFW,A
MOV A,R1
ANL A,#0FH
MOV FLAG_BFW,A
MOV A,R6 ;二进制整数R6转为二位十进制整数
MOV B,#10
DIV AB
MOV FLAG_SW,A
MOV FLAG_GW,B
MOV FLAG_BW,FLAG_SW ;压力中间值扩大10倍变为真实值
MOV FLAG_SW,FLAG_GW
MOV FLAG_GW,FLAG_SFW
MOV FLAG_SFW,FLAG_BFW
MOV A,FLAG_BW
CJNE A,#0,COMBIG
MOV A,FLAG_SW
CJNE A,#0,WORTH
MOV FLAG_DW,#20H
RET
COMBIG:
CJNE A,#5,COMBIG2
MOV FLAG_DW,#21H
RET
COMBIG2:CJNE A,#4,WORTH
MOV A,FLAG_SW
CJNE A,#9,WORTH
MOV FLAG_DW,#21H
RET
WORTH:
MOV FLAG_DW,#22H
RET
;-------------------------------------------------------------------
DIS_DATA: ;显示压力值的百位、十位、个位、十分位数字
;和标志位字符
MOV A,FLAG_BW
CJNE A,#0,DIS
MOV R3,A
LCALL DISLED
SJMP DIS_SW
DIS: CJNE A,#9,DIS_BW
MOV R3,A
LCALL DISLED
SJMP DIS_SW
DIS_BW: ;显示百位数字
MOV R3,A
LCALL DISLED
DIS_SW: ;显示十位数字
DEC R4
MOV A,FLAG_SW
MOV R3,A
LCALL DISLED
DEC R4 ;显示个位数字
MOV A,FLAG_GW
ADD A,#10H
MOV R3,A
LCALL DISLED
DEC R4 ;显示十分位数字
MOV A,FLAG_SFW
MOV R3,A
LCALL DISLED
DEC R4 ;显示标志位字符,要么是L,要么是U,要么是G
MOV A,FLAG_DW
MOV R3,A
LCALL DISLED
RET
;-------------------------------------------------------------------
DISLED: ;显示字符子程序
;输入: R4,位置 R3,值
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置显示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R3
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;-------------------------------------------------------------------
LEDSEG: ;LED显示常数表
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.'
DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.'
DB 38H,3EH,3CH ;'L,U,G'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -