📄 复件 (3) 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码
;―――――――――――――
;按键输入引脚定义
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 标记
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 ;显示温度标记"℃"
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
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
SHOW_DATA:
PUSH ACC
MOV A,#2
ACALL CLR_LINE ;清除该行字符数据
ACALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第一行地址
ACALL WR_COMM ;写入命令
POP ACC
ADD A,#30H
ACALL WR_DATA ;写入数据
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描子程序
KEYSCAN:
MOV KK,#0FH
NOP
NOP
MOV A,KK
ANL A,#0FH
CJNE A,#0FH,KEYSCAN1
AJMP KEYSCAN
KEYSCAN1:
; MOV P0,A
; RET
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
MOV A,B
ACALL SHOW_DATA ;显示按键的数值
KEYSCAN8: ;判断按键是否释放
MOV KK,#0FH
NOP
NOP
MOV A,KK
ANL A,#0FH
CJNE A,#0FH,KEYSCAN8
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;更新显示存储单元
C_BUF:
MOV R0,#56H
CC: MOV A,@R0
INC R0
MOV @R0,A
DEC R0
DEC R0
CJNE R0,#49H,CC
MOV 50H,R5
RET
;-------- 温度数据处理显示子程序----------
SET_DATA:
ACALL CONV_TEMP ;处理温度 BCD 码子程序
ACALL DISP_BCD ;显示区 BCD 码温度值刷新子程序
ACALL CONV ;LCD显示子程序
RET
;----------- 按键键扫描子程序 ----------
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
ACALL DELAY ;调用延时子程序
JMP A0 ;转移到A12
;――――――――――――――
;TL值调整(减少)
A10: JB K3, A13 ;按K3(TL值设定键),程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TL ;TL值减1
MOV A,TEMP_TL ;TH值送入A
CJNE A,#0FFH,A11 ;比较,若A=0FF,程序向下运行
JMP A12 ;转移到A12
A11: ACALL LOOK_ALARM ;调用显示信息区子程序
MOV R5, #10
ACALL DELAY ;调用延时子程序
JMP A0 ;转移到A0
A12: CPL 20H.1 ;UP/DOWN 标记反向
JMP A3 ;转移到A3 ,TH值调整(增加)
A13: JMP A7 ;转移到A7 ,确定调整 OK
RET ;子程序返回
;---------- 显示信息区子程序 -----------
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;存表
MOV A,#2 ;显示在第二行
ACALL LCD_PRINT ;调用显示字符子程序
MOV A,#0C6H ;显示起始地址为第二行第7位
ACALL TEMP_BJ1 ;调用显示温度标记子程序
MOV A,TEMP_TH ;加载TH数据
MOV X,#3 ;设置位置
ACALL SHOW_LINE2H ;显示数据
;―――――――――――――
MOV A,#0CEH ;设定显示起始地址为第二行第15位
ACALL TEMP_BJ1 ;调用显示温度标记子程序
MOV A,TEMP_TL ;加载TL数据
MOV X,#12 ;设置位置
ACALL SHOW_LINE2L ;显示数据
RET
;――――――――――――――
M_ALAX1:
DB " LOOK ALERT CODE",0
M_ALAX2:
DB "TH: TL: ",0
;――――――――――――――
;――――――显示温度标记子程序――――――
TEMP_BJ1:
ACALL WR_COMM ;调用写指令子程序
MOV DPTR,#BJ2 ;存代码表
MOV R1,#0 ;使指针指到表中第一个码
MOV R0,#2 ;取码次数
B0: MOV A,R1 ;A为0
MOVC A,@A+DPTR ;读取码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -