📄 复件 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码
;―――――――――――――
按键输入引脚定义
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 P2.5
;============= 主程序 ==============
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 ;调用按键扫描子程序
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
;-------- 温度数据处理显示子程序----------
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 ;读取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1值加1
DJNZ R0,B0 ;判断是否将代码读取完?
RET
;―――――――――――――
BJ2: ;代码表
DB 00H,"C"
;―――――――――――――
;―――――在 LCD 的第二行显示高温数字――――
SHOW_LINE2H:
MOV B,#100 ;设置被除数,B为百位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;低半字节加30得到ASCII码(转换为字符)
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来
;―――――――――――――
POP B ;B由堆栈取出来
MOV A,#0AH ;A赋值10
XCH A,B ;A、B数据互换,B为十位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;转换为字符
INC X ;LCD显示位位置加1
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
ACALL LCDP2 ;由LCD显示出来
;―――――――――――――
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A,B ;B为个位数
MOV B,X ;设置LCD显示的位置
ADD A,#30H ;转换为字符
ACALL LCDP2 ;由LCD显示出来
RET
;―――――在 LCD 的第二行显示低温数字―――――
SHOW_LINE2L:
MOV B,#100 ;设置被除数
DIV AB ;除法运算,结果A存商数,B存余数
MOV A,#0AH ;A赋值10
XCH A,B ;A、B数据互换,B为十位数
DIV AB ;除法运算,结果A存商数,B存余数
ADD A,#30H ;转换为字符
PUSH B ;B放入堆栈暂存起来
MOV B,X ;设置LCD显示的位置
CALL LCDP2 ;由LCD显示出来
;――――――――――――――
POP B ;B由堆栈取出来
INC X ;LCD显示位位置加1
MOV A,B ;B为个位数
MOV B,X ;设置LCD显示的位置
ADD A,#30H ;转换为字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -