NENG1 BIT P1.7;1为正常数字键,0为功能键
FLAG0 BIT 30H ;标志位是26H
FLAG1 BIT 31H
FLAG2 BIT 32H
FLAG3 BIT 33H
FLAG4 BIT 34H
FLAG5 BIT 35H
FLAG6 BIT 36H
FLAG7 BIT 37H
H_TEMP EQU 38H ;温度上限
L_TEMP EQU 39H ;温度下限
H_SHZ EQU 3AH ;设置模拟温度上限
L_SHZ EQU 3BH ;设置温度下限
DH_SHZ EQU 3CH ;设置数字温度上限
DL_SHZ EQU 3EH ;设置温度下限
ORG 0000h
AJMP MAIN
ORG 0003H
LJMP INT11 ;外部中断0
ORG 0013H
LJMP INT22 ;外部中断1
MAIN: MOV TMOD,#11H ;定时器用方式1
SETB EA ;开中断
SETB EX0 ;外部中断0
SETB EX1 ;外部中断1
SETB IT0 ;电平触发
CLR IT1 ;边沿触发
CLR ET0
CLR ET1
CLR TF1 ;溢出标志位
CLR TF0
MOV R6,#00H
MOV R5,#00H
MOV TL1,#0B0H
MOV TH1,#3CH
MOV TL0,#0B0H
MOV TH0,#3CH ;(65536-15536)\(6000000\12)=0.1s即100ms
MOV L_SHZ,#10
MOV H_SHZ,#50
MOV DH_SHZ,#125
MOV DL_SHZ,#25
MWE: JNB NENG1,MWE1
LCALL SHEZHI;高电平进入设置
MWE1: MOV R0,#00H ;低电平正常显示
MOV 47H,#50H
MOV 44H,47H
SETB P1.6
LCALL AD ;调用AD转换,所有温度值存储在50-7F的存储空间中
MOV R0,#00H
MOV 47H,#50H
MOV 44H,47H
AGA: LCALL BAOJING ;设置26H标志位,1为 超范围,0为正常
MOV A,26H
JZ BT
ABC: LCALL BJD
LCALL AD
JNB P3.7,ABC
AJMP AGA
BT: MOV 47H,#50H
NET:
SETB P3.7
ACALL DISP
INC R0
MOV A,47H
ADD A,#06H
MOV 47H,A
ACALL KINP
JB PSW.5,WUJ ;无键不处理键值
AJMP DISP2
WUJ: CJNE R0,#08H,NET
;ACALL DELY6
AJMP MWE
SJMP $
;A/D zhunhuan
AD: MOV 3FH,R0
PUSH 3FH
MOV DPTR,#0FFFEH
MOV R1,#50H ;R1要显示的温度值
MOV A,#00H ;a和R2是通道号
MOV R2,#00H
MOV R0,#48H ;R0是转化之后的数字量
LOP1:
MOV A,R2
PUSH ACC
MOVX @DPTR,A
JNB P3.0,$
MOVX A,@DPTR
MOV @R0,A
INC R0
MOV B,#04H
MUL AB
ACALL CONVERT
ACALL SEP
MOV @R1,30H
INC R1
MOV @R1,31H
INC R1
MOV @R1,32H
INC R1
MOV @R1,33H
INC R1
MOV @R1,34H
INC R1
MOV @R1,35H
INC R1
POP ACC
MOV R2,A
INC R2
MOV A,R2
CJNE R2,#08H,LOP1
POP 3FH
MOV R0,3FH
RET
CONVERT:
PUSH PSW
SETB PSW.4 ;设置当前寄存器
CLR PSW.3
MOV R6,B ;R6(高位)R7(低位)
MOV R7,A
CLR A
MOV R3,A ;清零, R3(最高位)R4(高位)R5(低位)
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
H_B:
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,H_B
MOV 20H,R4
MOV 21H,R5
POP PSW ;处理完16bit
RET
SEP: MOV A,R2
MOV B,#10H
DIV AB
MOV 30H,B
MOV A,20H
MOV B,#10H
DIV AB
MOV 35H,A
MOV 34H,B
MOV A,21H
MOV B,#10H
DIV AB
MOV 33H,A
MOV 32H,B
MOV 31H,#0CH
RET
;显示子程序
DISP:
SETB TR1
XUN1: ACALL DISP1
JNB TF1,XUN1
INC R6
CLR TF1
CJNE R6,#10,XUN1
MOV R6,#0
RET
DISP1:MOV R1,47H ;显示缓冲首址
MOV
R2,#01H
MOV A,47H
ADD A,#03H
MOV 46H,A ;位控初始码(先亮最低位)
LOOP:MOV
A,#0FFH ;共阳 灭码????????????
MOV
DPTR,#0FFDCH
MOVX
@DPTR,A
MOV
A,R2 ;送位控信号
MOV
DPTR,#0FFDDH
MOVX
@DPTR,A
MOV
A,@R1
PUSH ACC
MOV A,R1
CJNE A,46H,WUD
AJMP DIAN ;从显示缓冲中取数
WUD:
MOV DPTR,#TAB1
AJMP CHU
DIAN: MOV DPTR,#TAB
CHU: POP ACC
MOVC
A,@A+DPTR
;查出字形代码
MOV DPTR,#0FFDCH
MOVX
@DPTR,A ;送显示字符段代码
ACALL
DY1MS ;稳定显示信息
INC
R1 ;取下一个数
MOV
A,R2
JB
ACC.5,EXIT2 ;判断是否送到最高位?
RL
A
MOV
R2,A
;得到下一个位控信号
AJMP LOOP
EXIT2: RET
;延时子程序
DY1MS:MOV R7,#0FFH
DJNZ R7,$
RET
TAB:DB
40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,08H,03H,46H,21H,06H,0EH;0,1,
2,3,4,5,6,7,8,9,A,B,C,D,E,F
TAB1:DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
DISP2:;PUSH 47H
MOV A,45H
MOV B,#08H ;有键,分离键码
DIV AB
MOV 40H,B
INC 40H
MOV B,#04H
MUL AB
ADD A,40H
MOV 41H,A
DEC A
MOV B,#06H
MUL AB
ADD A,44H
MOV 47H,A
HUAN: JNB P1.6,DNE
ACALL DISP1
ACALL AD
ACALL KINP
JB PSW.5,WUJ1
AJMP DISP2
WUJ1: AJMP HUAN
DNE:
LJMP MWE
;扫描键子程序
KINP:LCALL KAP
JNZ KP1 ;有键
SETB PSW.5 ;置无键标志
RET
KP1:LCALL DELY ;去抖
LCALL KAP ;再次扫描键盘
JNZ KP2 ;转识键码程序
SETB PSW.5 ;置无键标志
RET
KP2:CLR PSW.5 ;置有键操作标志
MOV R2,#0FEH ;逐列扫描初始值,第一列
MOV R4,#00H ;0列加数 ,
列
KP4:MOV DPTR,#0FFDDH
MOV A,R2
MOVX @DPTR,A ;送列扫描信号
MOV DPTR,#0FFDEH
MOVX A,@DPTR ;回读行信号
JB ACC.0,L3 ;不是第一行,转第二行
MOV A,#00H ;是第一行吗=0
AJMP KP5
L3:JB ACC.1,NEXT ;不是第二行,转下一列
MOV A,#08H ;是第二行,行码=24
KP5:ADD A,R4
MOV 45H,A ;对应的行码+对应的列码=键码
PUSH ACC ;保护已经得到的键码
KP3:LCALL DELY
LCALL KAP ;继续扫描
JNZ KP3 ;A值不等于0,表示手未松开!
POP ACC ;A值等于0,手已经松开,弹回键码!
RET
NEXT:INC R4 ;下一列列码加1
MOV A,R2
JNB ACC.4,KINP ;列到最后列了吗?
RL A ;下一列置0
MOV R2,A ;下一列
AJMP KP4 ;扫描下一列
;全扫描子程序
KAP:MOV A,#0F0H ;全扫描字(列)
MOV DPTR,#0FFDDH
MOVX @DPTR,A ;送全扫描字
MOV DPTR,#0FFDEH
MOVX A,@DPTR ;回读行信息
CPL A
ANL A,#03H ;得到A值,=0,无键;≠0,有键
RET
;去抖子程序
DELY:MOV R6,#14H ;去抖!
DL:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DL
RET
;BAOJING
BAOJING:MOV H_TEMP,DH_SHZ
MOV L_TEMP,DL_SHZ
CLR FLAG0
CLR FLAG1
CLR FLAG2
CLR FLAG3
CLR FLAG4
CLR FLAG5
CLR FLAG6
CLR FLAG7
TONG0: MOV A,48H
SUBB A,H_TEMP
JNC NEXT1
NEXT2: MOV A,48H
SUBB A,L_TEMP
JC NEXT1
JNC TONG1
NEXT1: SETB FLAG0
TONG1: MOV A,49H
SUBB A,H_TEMP
JNC NEXT3
NEXT4: MOV A,49H
SUBB A,L_TEMP
JC NEXT3
JNC TONG2
NEXT3:SETB FLAG1
TONG2: MOV A,4AH
SUBB A,H_TEMP
JNC NEXT5
NEXT6: MOV A,4AH
SUBB A,L_TEMP
JC NEXT5
JNC TONG3
NEXT5:SETB FLAG2
TONG3: MOV A,4BH
SUBB A,H_TEMP
JNC NEXT7
NEXT8: MOV A,4BH
SUBB A,L_TEMP
JC NEXT7
JNC TONG4
NEXT7:SETB FLAG3
TONG4: MOV A,4CH
SUBB A,H_TEMP
JNC NEXT9
NEXT10: MOV A,4CH
SUBB A,L_TEMP
JC NEXT9
JNC TONG5
NEXT9:SETB FLAG4
TONG5: MOV A,4DH
SUBB A,H_TEMP
JNC NEXT11
NEXT12: MOV A,4DH
SUBB A,L_TEMP
JC NEXT11
JNC TONG6
NEXT11:SETB FLAG5
TONG6: MOV A,4EH
SUBB A,H_TEMP
JNC NEXT13
NEXT14: MOV A,4EH
SUBB A,L_TEMP
JC NEXT13
JNC TONG7
NEXT13:SETB FLAG6
TONG7: MOV A,4FH
SUBB A,H_TEMP
JNC NEXT15
NEXT16: MOV A,4FH
SUBB A,L_TEMP
JC NEXT15
JNC EXT7
NEXT15:SETB FLAG7
EXT7: RET
DISP3:
SETB TR0
XUN3: ACALL DISP1
JNB TF0,XUN3
INC R5
CLR TF0
CJNE R5,#3,XUN3
MOV R5,#0
RET
BJD: CLR P3.7
CLR C
MOV C ,FLAG0
MOV 47H,#50H
JNC LAST0
ACALL DISP3
ACALL DELY6
LAST0:MOV C, FLAG1
MOV 47H,#56H
JNC LAST1
ACALL DISP3
ACALL DELY6
LAST1:MOV C,FLAG2
MOV 47H,#5CH
JNC LAST2
ACALL DISP3
ACALL DELY6
LAST2:MOV C,FLAG3
MOV 47H,#62H
JNC LAST3
ACALL DISP3
ACALL DELY6
LAST3:MOV C,FLAG4
MOV 47H,#68H
JNC LAST4
ACALL DISP3
ACALL DELY6
LAST4:MOV C,FLAG5
MOV 47H,#6EH
JNC LAST5
ACALL DISP3
ACALL DELY6
LAST5:MOV C,FLAG6
MOV 47H,#74H
JNC LAST6
ACALL DISP3
ACALL DELY6
LAST6:MOV C,FLAG7
MOV 47H,#7AH
JNC LAST7
ACALL DISP3
ACALL DELY6
LAST7:RET
DELY6:MOV R6,#0FFH ;去抖!
DL6:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DL6
RET
SHEZHI:
;PUSH ACC
SZ: LCALL KINP
JNB NENG1,COMP
JB PSW.5,SZ
MOV A,45H
CJNE A,#00H,KEYS ;0键上限减一
DEC H_SHZ
ACALL SUAN
ACALL JISUAN
ACALL DISP
AJMP COMP
KEYS:CJNE A,#01H,KEYA ;1键上限加一
INC H_SHZ
ACALL SUAN
ACALL JISUAN
ACALL DISP
AJMP COMP
KEYA:CJNE A,#02H,KEYB ;2键下限减一
DEC L_SHZ
ACALL SUAN
ACALL JISUAN
ACALL DISP
AJMP COMP
KEYB:CJNE A,#03H,COMP ;3键下限加一
INC L_SHZ
ACALL SUAN
ACALL JISUAN
ACALL DISP
COMP:JB NENG1,SZ
MOV A,H_SHZ
MOV B,#2
MUL AB
MOV 1FH,A
MOV A,H_SHZ
MOV B,#2
DIV AB
ADD A,1FH
MOV DH_SHZ,A
MOV A,L_SHZ
MOV B,#2
MUL AB
MOV 1FH,A
MOV A,L_SHZ
MOV B,#2
DIV AB
ADD A,1FH
MOV DL_SHZ,A
;POP ACC
RET
JISUAN:
MOV A,20H
MOV B,#10H
DIV AB
MOV 55H,A
MOV 54H,B
MOV A,21H
MOV B,#10H
DIV AB
MOV 52H,A
MOV 51H,B
MOV 50H,#0CH
MOV 53H,#0CH
MOV 47H,#50H
RET
SUAN:MOV A,L_SHZ
MOV B,#00
LCALL CONVERT
PUSH 21H
MOV A,H_SHZ
MOV B,#00
LCALL CONVERT
MOV 20H,21H
POP 21H
RET
INT11:SETB P3.7
RETI
INT22:CLR P1.6
RETI
END