📄 复件 (4) main.asm
字号:
;程序:LCD2402.ASM
; ―――――――――――――――――――――――――――――――
; 温度值存放单元
TEMP_ZH EQU 24H ;实时温度值存放单元
TEMPL EQU 25H ;低温度值存放单元
TEMPH EQU 26H ;高温度值存放单元
TEMP_TH EQU 27H ;高温报警值存放单元
TEMP_TL EQU 28H ;低温报警值存放单元
TEMPHC EQU 29H ;存十位数 BCD码
TEMPLC EQU 2AH ;存个位数 BCD码
KEYBUF EQU 2BH ;存放键值
KEYBUFL EQU 2CH ;存放设置的最低温值
KEYBUFH EQU 2DH ;存放设置的最高温值
KEYMODE EQU 2EH ;状态模式,显示当前温度0、设置报警最高温度1和最低温度2
;―――――――――――――
;按键输入引脚定义
KK EQU P2
K1 EQU P2.1
K2 EQU P2.2
K3 EQU P2.3
K4 EQU P2.4
;―――――――――――――
SPK EQU P3.4 ;蜂鸣器引脚
RELAY EQU P2.0 ;继电器引脚
X EQU 2FH ;LCD 地址变量
;―――――――――――――
;LCD控制引脚
RS EQU P3.5
RW EQU P3.6
E EQU P3.7
;―――――――――――――
FLAG EQU 20H.0 ;DS18B20是否存在标记
KEY_UD EQU 20H.1 ;设定 KEY 的UP与DOWN 标记
BUFFLAG EQU 20H.2
KEYFULL EQU 20H.3 ;
DQ EQU P3.0
;============= 主程序 ==============
MAIN:
ACALL SET_LCD ;LCD初始化设置子程序
ACALL WR_THL ;将报警上下线写入暂存寄存器子程序
TOOP: ACALL RESET_1820 ;调用18B20复位子程序
JNB FLAG,TOOP1 ;DS1820不存在转移TOOP1处
ACALL MEU_OK ;调用显示"OK"信息子程序
ACALL RE_THL ;把EEROM里温度报警值拷贝回暂存器
ACALL TEMP_BJ ;显示温度标记"℃"
MOV KEYMODE,#00H
CLR BUFFLAG
CLR KEYFULL
JMP TOOP2
TOOP1: ACALL MEU_ERROR ;显示"ERROR"信息
ACALL TEMP_BJ ;显示温度标记
JMP $ ;等待
;――――――――――――――
TOOP2:
ACALL RE_TEMP ;调用读取温度数据子程序
ACALL SET_DATA ;调用处理显示温度数据子程序
ACALL TEMP_COMP ;实际温度值与标记温度值比较子程序
; ACALL P_KEY ;调用按键扫描子程序
ACALL KEYSCAN
ACALL SHOW_DATA ;显示按键的数值
SJMP TOOP2 ;循环
;--------―― 读取温度数据子程序 --------――
RE_TEMP:
ACALL RESET_1820 ;18B20复位子程序
JNB FLAG,TOOP1 ;DS1820不存在
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;写入子程序
MOV A,#44H ;发出温度转换命令
ACALL WRITE_1820 ;调写入子程序
ACALL RESET_1820 ;调复位子程序
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;写入子程序
MOV A,#0BEH ;发出读温度命令
ACALL WRITE_1820 ;写入子程序
ACALL READ_1820 ;调用读取子程序
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描子程序
KEYSCAN:
MOV KK,#0FH
NOP
NOP
MOV A,KK
ANL A,#0FH
CJNE A,#0FH,KEYSCAN1
AJMP KEYSCAN
KEYSCAN1:
MOV B,#00H
SETB C
MOV R3,#0EFH
KEYSCAN2:
MOV A,R3
JNB ACC.0, KEYSCAN8 ;一次循环结束
MOV KK,A
RL A
MOV R3,A
NOP
MOV A,KK
ANL A,#0FH
CJNE A,#0FH,KEYSCAN4 ;检测到按键按下则转KEYSCAN4
INC B
INC B
INC B
AJMP KEYSCAN2
KEYSCAN4:
MOV R4,#04H
KEYSCAN5:
RRC A
JNC KEYSCAN6
INC B
DJNZ R4,KEYSCAN7 ;计数达到4次则出错返回
AJMP KEYSCAN8
KEYSCAN7:
AJMP KEYSCAN5
KEYSCAN6:
INC B
ACALL C_BUF
KEYSCAN8: ;判断按键是否释放
MOV KK,#0FH
NOP
NOP
MOV A,KK
ANL A,#0FH
CJNE A,#0FH,KEYSCAN8
RET
;------------更新显示存储单元
C_BUF:
MOV A,B
CJNE A,#0AH,C_BUF1
INC KEYMODE
MOV A,KEYMODE
CJNE A,#03H,C_BUF1
MOV KEYMODE,#00H
RET
C_BUF1: MOV R5,KEYMODE
CJNE A,#0BH,C_BUF2
MOV B,#00H
AJMP C_BUF3
C_BUF2: CJNE A,#0CH,C_BUF3
CJNE R5,#02H,C_BUF4 ;'#'号(确定键)按下
MOV A,KEYBUF
MOV TEMP_TL,A ;将设定的温值设置为最低温值
AJMP C_BUF5 ;
C_BUF4: CJNE R5,#01H,C_BUF8
MOV A,KEYBUF ;将设定的温值设置为最高温值
MOV TEMP_TH,A
C_BUF5: CLR BUFFLAG
CLR KEYFULL
MOV A,KEYBUF
MOV P0,A
MOV KEYBUF,#00H
RET
C_BUF3: CJNE R5,#00H,C_BUF6 ;处理按键值
RET
C_BUF6: JB KEYFULL,C_BUF8 ;超过两位数不做处理
JB BUFFLAG,C_BUF7
MOV KEYBUF,B
SETB BUFFLAG
RET
C_BUF7: MOV A,KEYBUF
ANL A,#0FH
PUSH B ;将上一个数值*10加上这个数值
MOV B,#0AH
MUL AB
POP B
ADD A,B
MOV KEYBUF,A
CLR BUFFLAG
SETB KEYFULL
C_BUF8:
RET
;-------- 温度数据处理显示子程序----------
SET_DATA:
ACALL CONV_TEMP ;处理温度 BCD 码子程序
ACALL DISP_BCD ;显示区 BCD 码温度值刷新子程序
ACALL CONV ;LCD显示子程序
RET
;------------------------------------------------------------
SHOW_DATA:
MOV R5,KEYMODE
CJNE R5,#00H,SHOW_DATA1
ACALL MEU_OK ;显示"OK"信息子程序
ACALL TEMP_BJ ;显示温度标记子程序
RET
SHOW_DATA1:
CJNE R5,#01H,SHOW_DATA2
MOV DPTR,#M_ALAXTH ;存M_ALAX1表
MOV A,#1
ACALL LCD_PRINT ;显示字符
MOV DPTR,#SET_TH
MOV A,#2
ACALL LCD_PRINT
; ACALL TEMP_BJ1 ;调用显示温度标记子程序
MOV A,TEMP_TH ;加载TH数据
MOV X,#3 ;设置位置
ACALL SHOW_LINE2H ;显示数据
; ACALL LOOK_ALARM ;显示信息区子程序
; ACALL SET_ALARM ;设定报警值 TH、TL
AJMP SHOW_DATA3
SHOW_DATA2:
MOV DPTR,#M_ALAXTL ;存M_ALAX1表
MOV A,#1
ACALL LCD_PRINT ;显示字符
MOV DPTR,#SET_TH
MOV A,#2
ACALL LCD_PRINT
MOV A,TEMP_TL
MOV X,#3
ACALL SHOW_LINE2H
SHOW_DATA3:
ACALL WR_THL ;将设定的TH,TL值写入DS18B20内
ACALL WRITE_E2 ;调用报警值拷贝EEROM子程序
RET
M_ALAXTH:
DB " RESET ALARM TH",0
M_ALAXTL:
DB " RESET ALARM TL",0
SET_TH:
DB " TH: ",0
SET_TL:
DB " TL: ",0
;----------- 按键键扫描子程序 ----------
P_KEY: ;按键K1处理
JB K1, PK1 ;K1键未按,转到PK1处
ACALL SPK_BZ ;K1键按下,一声鸣响
JNB K1,$ ;等按键放开
MOV DPTR,#M_ALAX1 ;存M_ALAX1表
MOV A,#1
ACALL LCD_PRINT ;显示字符
ACALL LOOK_ALARM ;显示信息区子程序
JB K3, $ ;等待K3按下
ACALL SPK_BZ ;一声鸣响
JMP PK2 ;转到标号 PK2处
PK1: ; 按键K2处理
JB K2, PK3 ;K2键未按,转到PK3处
ACALL SPK_BZ ;K2键按下,一声鸣响
JNB K2,$ ;等按键放开
MOV DPTR, #TA1 ;存#TA1表
MOV A,#1
ACALL LCD_PRINT ;显示字符
ACALL SET_ALARM ;设定报警值 TH、TL
ACALL WR_THL ;将设定的TH,TL值写入DS18B20内
ACALL WRITE_E2 ;调用报警值拷贝EEROM子程序
PK2:
ACALL MEU_OK ;显示"OK"信息子程序
ACALL TEMP_BJ ;显示温度标记子程序
PK3:
RET
;―――――――――――――
TA1: ;菜单表
DB "RESET ALERT CODE"
;―――――――――――――
;--------- 设定报警值 TH、TL子程序 --------
SET_ALARM:
ACALL LOOK_ALARM ;调用显示信息区子程序
A0: JB K1,A2 ;按下K1(查看键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
JNB K1,$ ;等放开
CPL 20H.1 ;UP/DOWN 标记反向
A2: JB 20H.1,A3 ;20H.1=1,UP,转移到A3。
JMP A8 ;20H.1=0,DOWN,转移到A8
;―――――――――――――
; TH值调整(增加)
A3: JB K2, A5 ;按下K2(设定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
INC TEMP_TH ;TH值调整(增加)
MOV A,TEMP_TH ;TH值送入A
CJNE A,#120,A4 ;TH值增到120,程序向下运行
MOV TEMP_TH,#0 ;TH值清0
A4: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时程序
JMP A3 ;循环
;―――――――――――――
;TL值调整(增加)
A5: JB K3,A7 ;按下K3(TL值设定键)程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
INC TEMP_TL ;TL值增加1
MOV A, TEMP_TL ;TL值送入A
CJNE A,#99,A6 ;比较,若A=99,程序向下运行
MOV TEMP_TL,#00H ;TL值清0
A6: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时程序
JMP A5 ;程序转移到A5,循环
;―――――――――――――
;确定调整 OK
A7: JB K4, A0 ;按下K4(调整确定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
JNB K4, $ ;等放开
RET ;程序返回
;―――――――――――――
;TH值调整 (减少)
A8: JB K2, A10 ;按下K2(设定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TH ;TH值减1
MOV A,TEMP_TH ;TH值送入A
CJNE A,#0FFH,A9 ;比较,若A=0FF,程序向下运行
JMP A12 ;转移到A12
A9: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -