📄 wendu.asm
字号:
ORG 0000H
FSW EQU 32H ;分钟十位
FGW EQU 33H ;分钟个位
SSW EQU 34H ;秒钟十位
SGW EQU 35H ;秒钟个位
SZH EQU 2FH ;时钟
FZH EQU 2EH ;分钟
DFZH EQU 20H ;设定分钟
;30H,31H,时间显示单元
;36H,37H,设定时间小时显示单元
;38H,39H,设定时间分钟显示单元
;40H,41H,42H中设定继电器启动温度
DSZH EQU 2CH ;设定时钟
LJMP STA
ORG 000BH
LJMP DING
ORG 0100H
STA: MOV 40H,#00H
MOV 41H,#02H
MOV 42H,#01H
MOV SZH,#00H
MOV SSW,#00H
MOV SGW,#00H
MOV FSW,#00H
MOV FGW,#00H
MOV FZH,#00H
MOV DFZH,#00H
MOV DSZH,#00H
MOV 36H,#01H
MOV 37H,#02H
MOV 38H,#03H
MOV 39H,#00H
MOV R4,#00H
MOV R5,#00H
MOV TMOD,#01H
MOV TH0,#4CH
MOV TL0,#00H
MOV IE,#82H
SETB TR0
START: JNB P1.3,JIANPAN
JNB P1.1,QWE
GOON: LCALL ADC
LCALL CMPAA
LJMP START
;***************************************
;切换到时间程序: ;***************************************
QWE: LCALL DELAY
JB P1.1,START
JNB P1.1,$
LJMP LOOP
;***************************************
;键盘程序: ;***************************************
JIANPAN: LCALL DELAY ;由P1.3口键入键盘程序
JB P1.3,STAR
JNB P1.3,$
LCALL JIAN12
LJMP GOON
JIAN12: MOV R0,#00H
MOV R1,#3FH
MOV R3,#7FH
STAR: JNB P1.0,J1 ;位选键
JNB P1.1,J2 ;增加键
JNB P1.2,J3 ;减少键
JNB P1.3,NEXT ;退出键
SJMP STAR
NEXT: LCALL DELAY
JB P1.3,STAR
JNB P1.3,$
MOV 70H,40H
MOV 71H,41H
MOV 72H,42H
LCALL SSXS
MOV R0,#00H
MOV R3,#7FH
MOV R1,#3FH
RET
J1: LCALL DELAY ;去抖
JB P1.0,STAR
JNB P1.0,$
CJNE R0,#03H,QRT
MOV R3,#7FH
MOV R0,#00H
MOV R1,#3FH
LJMP STAR
QRT: INC R0
INC R1
MOV A,R3
RL A
MOV R3,A
LCALL XS
LJMP STAR
J2: MOV A,R0 ;未选中字位时,退出(无效按键)
JZ TUI
LCALL DELAY
JB P1.1,STAR
JNB P1.1,$
MOV A,@R1
CLR C
SUBB A,#09H
JNC FU1 ;判断数据是否大于9
INC @R1
LCALL XS
LJMP STAR
FU1: MOV @R1,#00H
LCALL XS
LJMP STAR
J3: MOV A,R0 ;判断数据是否为零
JZ TUI
LCALL DELAY
JB P1.2,STAR1
JNB P1.2,$
MOV A,@R1
JZ FU2
DEC @R1
LCALL XS
LJMP STAR
FU2: MOV @R1,#00H
LCALL XS
LJMP STAR
TUI: LJMP STAR
STAR1: LJMP STAR
XS: MOV A,@R1 ;键盘显示
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,R3
MOV DPTR,#0EFFFH
MOVX @DPTR,A
LCALL DELAY
RET
;***************************************
;比较报警程序: ;***************************************
CMPAA: MOV R0,#70H
MOV R1,#40H
MOV R2,#03H
BJ: MOV A,@R1
CLR C
SUBB A,@R0
JC BAJ ;读入数据比预设的值大跳转
JNZ OUT
INC R1
INC R0
DJNZ R2,BJ
OUT: MOV P1,#0FFH
RET
BAJ: MOV P1,#6FH ;启动继电器
RET
;***************************************
;AD转换程序: ;***************************************
ADC: MOV 70H,#00H ;显示单元
MOV 71H,#00H
MOV 72H,#00H
MOV R7,#00H
MOV R6,#00H
MOV R3,#00H
ST: MOV DPTR,#0FFFFH ;启动AD转换
MOVX @DPTR,A
JB P3.2,$
INC R7
MOVX A,@DPTR
MOV P2,#7FH
MOV DPTR,#07FFFH
MOVX A,@DPTR ;读入转换数据
ADD A,R3
MOV R3,A
MOV A,R6
ADDC A,#00
MOV R6,A ;将转换的数据先存入R,R6中
CJNE R7,#80H,ST
;MOV R4,#08H ;128次采集处理一次
;CHU: CLR C
;MOV A,R6
;RRC A
;MOV R6,A
;MOV A,R3
;RRC A
;MOV R3,A
;DJNZ R4,CHU
;MOV A,R6 ;温度不超过100度,R6取平均后会为零
MOV B,#64H ;转换成10进制
DIV AB
MOV 70H,A
MOV A,B
MOV B,#0AH
DIV AB
MOV 71H,A
MOV 72H,B ;AD转换结束后将数据存入70H,71H,72H中。
LCALL SSXS
RET
;***************************************
;显示程序: ;***************************************
SSXS: MOV R4,#0C6H
LP2: MOV R1,#70H
MOV R0,#0FEH
MOV A,#0C6H
MOV P2,#0D7H
MOV DPTR,#0EFFFH
MOVX @DPTR,A
LCALL DELAY ;固定显示`C
MOV R2,#03H
LP1: MOV DPTR,#TAB
MOV A,R0
MOV P2,A
MOV A,@R1
MOVC A,@A+DPTR
MOV DPTR,#0EFFFH
MOVX @DPTR,A
LCALL DELAY
INC R1
MOV A,R0
RL A
MOV R0,A
DJNZ R2,LP1
DJNZ R4,LP2
RET
;***************************************
;时间程序: ;***************************************
LOOP: MOV 60H,30H
MOV 61H,31H
MOV 62H,32H
MOV 63H,33H
JNB P1.0,JIA1 ;变换成分钟显示程序
JNB P1.1,QH1
JNB P1.2,DING
JNB P1.3,JIAN11
XIAOQ: LCALL SSXS
LCALL CMPAA
LJMP LOOP
JIAN11: CJMP JIANPAN
;***************************************
;切换回温度程序
;***************************************
QH1: LCALL DELAY
JB P1.1,LOOP
JNB P1.1,$
LJMP START
;***************************************
;切换到分钟显示
;***************************************
JIA1: LCALL DELAY ;去抖
JB P1.0,XIAOQ
JNB P1.0,$
LOOP1: MOV 60H,32H
MOV 61H,33H
MOV 62H,34H
MOV 63H,35H
JNB P1.2,DING
JNB P1.0,JIA2 ;变换回小时显示程序
JNB P1.1,QH1
JNB P1.3,JIAN11
FEN: LCALL SSXS
LCALL CMPAA
LJMP LOOP1
;**************************************
;切换回小时显示: ;***************************************
JIA2: LCALL DELAY ;去抖
JB P1.0,FEN
JNB P1.0,$
LJMP LOOP
;***************************************
;定时程序: ;***************************************
DING: LCALL DELAY ;去抖
JB P1.2,XIAOQ
JNB P1.2,$
LCALL DINGSHI
LJMP LOOP
XUN: JNB P1.0,JIAN1 ;
JNB P1.1,JIAN2 ;
JNB P1.2,NEXT2 ;退出
MOV 60H,36H
MOV 61H,37H
MOV 62H,38H
MOV 63H,39H
LCALL SSXS
SJMP XUN
JIAN1: LCALL DELAY ;去抖
JB P1.0,XUN
JNB P1.0,$
INC DSZH
MOV A,DSZH
CJNE A,#18H,GOOON
MOV DSZH,#00H
GOOON: MOV A,DSZH
MOV B,#0AH
DIV AB
MOV 36H,A
MOV 37H,B
LJMP XUN
JIAN2: LCALL DELAY ;去抖
JB P1.1,XUN
JNB P1.1,$
INC DFZH
MOV A,DFZH
CJNE A,#3CH,GN1
MOV DFZH,#00H
GN1: MOV A,DFZH
MOV B,#0AH
DIV AB
MOV 38H,A
MOV 39H,B
LJMP XUN
NEXT2: LCALL DELAY
JB P1.2,XUN
JNB P1.2,$
MOV 60H,36H
MOV 61H,37H
MOV 62H,38H
MOV 63H,39H
LCALL SSXS
RET
;***************************************
;时钟键盘程序: ;***************************************
LOOP11: CJMP LOOP
JIAN: LCALL DELAY ;由P1.3口键入键盘程序
JB P1.3,LOOP11
JNB P1.3,$
LCALL JIANPAN
MOV SSW,#00H
MOV SGW,#00H
LJMP LOOP ;键盘输入后直接返回到小时显示程序
SM: JNB P1.0,JI1 ;
JNB P1.1,JI2 ;
JNB P1.3,NEXT1 ;退出键
MOV 60H,30H
MOV 61H,31H
MOV 62H,32H
MOV 63H,33H
LCALL SSXS
SJMP SM
JI1: LCALL DELAY ;去抖
JB P1.0,SM
JNB P1.0,$
INC SZH
MOV A,SZH
CJNE A,#18H,GN
MOV SZH,#00H
GN: MOV A,SZH
MOV B,#0AH
DIV AB
MOV 30H,A
MOV 31H,B
LJMP SM
JI2: LCALL DELAY ;去抖
JB P1.1,SM
JNB P1.1,$
INC FZH
MOV A,FZH
CJNE A,#3CH,GT1
MOV FZH,#00H
GT1: MOV A,FZH
MOV B,#0AH
DIV AB
MOV 32H,A
MOV 33H,B
LJMP SM
NEXT1: LCALL DELAY
JB P1.3,SM
JNB P1.3,$
MOV 60H,30H
MOV 61H,31H
MOV 62H,32H
MOV 63H,33H
LCALL SSXS
RET
DELAY: MOV R7,#010H
DEL1: MOV R6,#20H
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
TAB: DB 01H,02H,03H,04H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -