单片机温度检测系统的汇编实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;数字温度计汇编语言源程序如下:
;******************************温度值存放单元*****************
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 P1.0
K2 EQU P1.1
K3 EQU P1.2
K4 EQU P1.3
SPK EQU P3.7 ;蜂鸣器
ZF EQU 22H.1
X EQU 2FH ;设置显示位置
;****************************LCD控制引脚*************************
RS EQU P2.0
RW EQU P2.1
E EQU P2.2
FLAG EQU 21H.0 ;温度传感器标志位
KEY_UD EQU 21H.1
DQ EQU P3.3 ;温度传感器数据采集口
; *****************************主程序******************************
ORG 0000H
LJMP MAIN
ORG 0023H
ORG 0030H
MAIN: MOV SP,#5FH
MOV TMOD,#20H ;定时器T1为方式2(自动再装入8位计数器)
MOV TH1,#0F3H ;设置定时器初值,
MOV TL1,#0F3H
SETB TR1 ;定时器启动
MOV TEMP_TH,#27
MOV TEMP_TL,#20
ACALL SET_LCD ;LCD初始化设置子程序
TOOP: ACALL RESET_1820 ;调用18B20复位子程序
JNB FLAG,TOOP1 ;DS1820不存在,则跳转
ACALL XS_S ;调用显示"SUCCES"信息子程序
ACALL WR_THL ;将报警上下限写入暂存寄存器子程序
ACALL RE_THL ;把E2ROM里温度报警值拷贝回暂存器
JMP TOOP2
TOOP1: ACALL XS_WRONG ;显示"WRONG"信息
SJMP TOOP ;返回继续判断
TOOP2: ACALL RE_TEMP ;调用读取温度数据子程序
ACALL SET_DATA ;调用处理显示温度数据子程序
ACALL TEMP_COMP ;实际温度值与标记温度值比较子程序
ACALL P_KEY ;调用按键扫描子程序
JMP TOOP2 ;循环
;;****************************读取温度数据子程序**************************
RE_TEMP:
JNB FLAG,TOOP1 ;判断DS18B20是否存在?
ACALL RESET_1820 ;18B20复位子程序
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显示子程序
MOV A,#0CBH ;设定第二行起始地址
ACALL TEMP_BJ ;显示温度标记"℃"

ACALL zhfu
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, #01
ACALL LCD_PRINT ;显示字符
ACALL LOOK_ALARM ;调用显示信息区子程序
ACALL SET_ALARM ;设定报警值TH、TL
ACALL WR_THL ;将设定的TH,TL值写入DS18B20内
ACALL WRITE_E2 ;调用报警值拷贝E2ROM子程序
PK2: ACALL XS_S ;显示"OK"信息子程序
PK3: RET
TA1: ;菜单表
DB "SET ALERT DATA",0H
;********************************设定报警值TH、TL子程序**************************
SET_ALARM:
A0: JB K1, A2 ;按下K1程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
JNB K1, $ ;等待放开
CPL KEY_UD ;UP/DOWN标记反向
A2: JB KEY_UD, 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键程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
INC TEMP_TL ;TL值增加1
MOV A, TEMP_TL ;TL值送入A
CJNE A, #119, 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 ;跳转到A0
;TL值调整(减少)
A10:JB K3,

A13 ;按K3键,程序向下运行
ACALL SPK_BZ ;蜂鸣器响一声
DEC TEMP_TL ;TL值减1
MOV A, TEMP_TL ;TH值送入A
CJNE A, #0FFH,A11 ;比较,若A=0FFH,程序向下运行
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 ;子程序返回
;********************************************菜单显示子程序*******************
;在LCD的第一行或第二行显示字符
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置LCD的第一行地址
ACALL WR_COMM ;写入命令
JMP FILL
LINE2:
ACALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置LCD的第二行地址
ACALL WR_COMM ;写入命令
FILL:
CLR A
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
ACALL WR_DATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
;*****************************显示信息区子程序************************
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;存表
MOV A, #2 ;显示在第二行
ACALL LCD_PRINT ;调用显示字符子程序
MOV A,#0C6H ;显示起始地址第二行第7位
ACALL TEMP_BJ ;调用显示温度标记子程序
MOV A, TEMP_TH ;加载TH数据
MOV X, #3 ;设置位置
ACALL SHOW_LINE2H ;显示数据
;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A, #0CEH ;设定显示起始地址为第二行第15位
ACALL TEMP_BJ ;调用显示温度标记子程序
MOV A,TEMP_TL ;加载TL数据
MOV X, #12 ;设置位置
ACALL SHOW_LINE2L ;显示数据
RET
M_ALAX1:
DB"LOOK TH","&","TL DATA",0H
M_ALAX2:
DB"TH: TL: ",0H
;*******************************在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显示的位置
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
;**************************温度值比较子程序***********************
;实际温度值与标记温度值比较
TEMP_COMP:
MOV A,TEMP_TH ;高温报警值送入A
SUBB A,TEMP_ZH ;减数>被减数,则
JC TCL1 ;借位标志位C=1,转到TCL1
MOV A,TEMP_ZH ;实时温度送入A
SUBB A,TEMP_TL ;减数>被减数,则
JC TCL2 ;借位标志位C=1,转到TCL2
MOV DPTR,#BJ5 ;存表BJ5
ACALL TEMP_BJ3 ;调用显示高,低温度及加热标记子程序
RET
;**************************实时温度>高温报警值的处理程序******************
TCL1:
MOV DPTR,#BJ3 ;存入#BJ3表
ACALL TEMP_BJ3 ;调用显示高、低温度及加热标记子程序
ACALL SPK_BZ ;调用鸣响子程序
RET
TCL2: ;实时温度>高温报警值的处理程序
MOV DPTR,#BJ4 ;存入#BJ4表
ACALL TEMP_BJ3 ;调用显示高、低温度及标记子程序
ACALL SPK_BZ ;调用鸣响子程序
RET
;*************************显示高、低温度及加热标记程序***************
TEMP_BJ3:
MOV A, #0CEH ;设定显示位置
ACALL WR_COMM ;调用写指令子程序
MOV R1, #0 ;使指针指到表中第一个码
MOV R0, #2 ;取码次数
BJJ:MOV A, R1 ;A位0
MOVC A, @A+DPTR ;读取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1增加1
DJNZ R0,BJJ ;判断是否将代码读取完?
RET
BJ3:
DB ">H"
BJ4:
DB "BJ5:
DB "!"
;*********************报警上下线写入暂存器子程序***************
WR_THL:
JB FLAG,WR_T ; FLAG=1,表示DS18B20存在,转WR_T处
RET
WR_T:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A, #0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A, #4EH ;写暂存寄存器
ACALL WRITE_1820
MOV A,TEMP_TH ;TH(报警上限)
ACALL WRITE_1820
MOV A,TEMP_TL ;TL(报警下限)
ACALL WRITE_1820
MOV A, #7FH ;12位精确度
ACALL WRITE_1820
RET
;*********************报警值拷贝到EEROM子程序*****************
WRITE_E2:
ACALL RESET_1820 ;调用18B20复位子

程序
MOV A, #0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A, #48H ;[48H]为拷贝到EEROM子程序
LCALL WRITE_1820
RET
;************************报警值拷贝回暂存器子程序**************
RE_THL:
ACALL RESET_1820 ;调用18B20复位子程序
MOV A, #0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
ACALL WRITE_1820
RET
;*****************处理温度BCD码子程序************************
CONV_TEMP:
MOV A,TEMPH ; 判断温度是否零下
ANL A,#80H
JZ TC1 ; A为零,温度为正值,则转到TC1
;为负值;
CLR C ; C=0
setb ZF ;为1时,温度是负值
MOV A,TEMPL ;二进制数求补
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TC2
TC1:clr ZF ;为0时,温度是正值
MOV TEMPHC,#0AH
TC2:MOV A,TEMPHC
SWAP A ; 高低位交换
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#DOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC ,低位为小数部分,BCD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高4位
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH ;取出低4位
SWAP A ;高低位交换
ORL A,TEMPL ;重新组合
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H ;取出高4位
SWAP A ;高低位交换
ORL A,TEMPHC ;TEMPHC,低位为十位值,BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;取出低4位
SWAP A ;高低位交换
ORL A,TEMPLC ;TEMPLC,高位存个位值,BCD
MOV TEMPLC,A
MOV A,R4
JZ TC3 ;百位不为0往下执行
ANL A,#0FH ;取出低4位
SWAP A
MOV R4,A ;
MOV A,TEMPHC ;TEMPHC 高位为百位值,BCD
ANL A,#0FH ;取出TEMP的十位值
ORL A,R4
MOV TEMPHC,A ;存十、百位值
TC3:RET
;**************************显示区BCD 码温度值刷新子程序************
DISP_BCD:
MOV A,TEMPLC ;个位数BCD码送入A
ANL A,#0FH ;取低位码
MOV 70H,A ;小数位值
MOV A,TEMPLC
SWAP A ;高低位交换
ANL A,#0FH ;取结果数的高位
MOV 71H,A ;个位值
MOV A,TEMPHC
ANL A,#0FH ;取低位码
MOV 72H,A ;十位值
MOV A,TEMPHC
SWAP A ;高低位交换
ANL A,#0FH;
MOV 73H,A ;百位值
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DI0 ;判断百位是否为0,是跳
MOV 73H,A ;如果百位为1
DI0:MOV A,TEMPHC ;百位为0时,下...
ANL A,#0FH ;取十位值
MOV A,TEMPLC
SWAP A
ANL A,#0FH ;取结果数的高位
MOV 73H,#20h ;符号位不显示
MOV 72H,#0 ;十位数显示符号
RET
HEX2BCD1:
MOV B,#100 ; 十六进制转BCD
DIV AB
MOV R4,A ;R4 为百位数
MOV A,#0AH
XCH

A,B
DIV AB
SWAP A ;高低位交换
ORL A,B
RET
;小数部分码表
DOTTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;**************************************DS18B20复位初始化子程序*************
RESET_1820:
SETB DQ
NOP
CLR DQ
;主机发出延时537us的复位脉冲
MOV R1,#3
DLY:MOV R0,#107
DJNZ R0,$
DJNZ R1,DLY
;------------------------------
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
;等待DS18B20回应
MOV R0,#25H
T2: JNB DQ,T3 ;0时跳
DJNZ R0,T2
JMP T4
;置标志位FLAG=1,表示DS18B20存在
T3: SETB FLAG
JMP T5
;清标志位FLAG=0,表示DS18B20不存在
T4: CLR FLAG
JMP T7
;时序要求延时一段时间
T5: MOV R0,#117
T6: DJNZ R0,T6
T7: SETB DQ
RET
;*****************************写入DS18B20子程序*****************************
;写入DS18B20
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ; 总线低位,开始写入
MOV R3,#6
DJNZ R3,$ ;保持16us以上
RRC A ; 把字节DATA分成8位,环移给C
MOV DQ,C ;写入一个位
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个位
SETB DQ ;释放总线
RET
;-********************************读出DS18B20子程序***********************
;将温度值从DS18B20中读出
READ_1820:
MOV R4,#4
MOV R1,#TEMPL ;存入25H 26H 27H 28H
RE0:
MOV R2,#8 ;数据一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ ;总线释放
MOV R3,#9
DJNZ R3,$
MOV C,DQ ; 从总线读到一个位
MOV R3,#23 ;
DJNZ R3,$ ;等待50us
RRC A ;把读得的位环移给A
DJNZ R2,RE1 ; 读下一个位
MOV @R1,A
INC R1 ;R1内数据递增
DJNZ R4,RE0
RET
;*******************************LCD1602显示程序***********************
;初始化设置
SET_LCD:
CLR E
ACALL INIT_LCD ;初始化LCD
ACALL SELF_DATA ;将自定义字符存入LCD的CGRAM
RET
;*****************************LCD初始化子程序*********************
INIT_LCD:
MOV A,#38H ;设置显示模式(8位、2行、5*7点阵)
ACALL WR_COMM
ACALL DELAY1
MOV A,#0CH ;显示开关及光标的设置(开显示,光标关,字符不闪烁)
ACALL WR_COMM
ACALL DELAY1
MOV A,#01H ;清除LCD显示屏
ACALL WR_COMM
ACALL DELAY1
RET
;******************************LCD显示子程序***********************
CONV:
MOV 73h,#30h
mov A,73h ;加载百位数据
MOV X,#6 ;设置显示位置
CJNE A,#1,CO1
JMP CO2
CO1:MOV B,X
ACALL LCDP2 ;显示第二行
JMP CO3
CO2:
ACALL SHOW_LINE2 ;显示数据
CO3:INC X ;位加1
MOV A,72H ;十位
ACALL SHOW_LINE2 ;显示数据
INC X ;位加1
MOV A,71H ;个位
ACALL SHOW_LINE2 ;显示数据
INC X

MOV A,#'.'
MOV B,X
ACALL LCDP2 ;显示字符
MOV A,70H ;加载小数点位
INC X ;设置位置
ACALL SHOW_LINE2 ;显示数据
RET
;**************************显示第二行**************************
;在LCD的第二行显示数字
SHOW_LINE2:
ADD A,#30H
MOV B,X
ACALL LCDP2
RET
LCDP2: PUSH ACC ;压入堆栈
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
ACALL WR_COMM ; 写入命令
POP ACC ;由堆栈取出A
ACALL WR_DATA ;写入数据
RET
;******************************写指令子程序******************************
WR_COMM:
MOV P0,A ;写入指令
CLR RS ;RS=0,选择指令寄存器
CLR RW ;RW=0,选择写模式
SETB E ;E=1,允许读写LCM
ACALL DELAY1 ;延时5ms
CLR E ;E=0,禁止读写LCM
RET
;*****************************写数据子程序*****************************
WR_DATA:
MOV P0,A ;写入数据
SETB RS ;RS=1,选择数据寄存器
CLR RW ; RW=0,选择写模式
SETB E ;E=1,允许读写LCM
ACALL DE ;延时0.5ms
CLR E ;E=0,禁止读写LCM
ACALL DE ;延时0.5ms
RET
;******************************清除LCD的字符*********************
CLR_LINE: MOV A,#0C0H ;设置LCD的第一行字符
ACALL WR_COMM ;调用写指令子程序
MOV R0,#24 ;设置计数器
CL1: MOV A,#' ' ; 载入空符至LCD
ACALL WR_DATA ;输出字符至LCD
DJNZ R0,CL1 ;判断
RET
;************************** CLR_LINE1:;清除LCD的第一行字符*******************
MOV A,#80H ;设置LCD的第一行字符
ACALL WR_COMM ;调用写指令子程序
MOV R0,#24 ; 设置计数值
C1: MOV A,#' ' ; 载入空格符至LCD
ACALL WR_DATA ;输出字符至LCD
DJNZ R0,C1 ;计数结束
RET
;*******************************鸣响子程序*************************
SPK_BZ:
MOV R6,#100
BZ2:ACALL DEX1
CPL SPK
DJNZ R6,BZ2
MOV R5,#10
ACALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
;*******************************延时子程序**************************
DELAY: ;延时时间R5*10ms
DL1:MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY
RET
;****************************延时时间5ms******************
DELAY1: ;延时时间5ms
MOV R6,#25
DL2:MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
DE:;延时时间为0.5ms
MOV R7,#250
DJNZ R7,$
RET
;*******************************显示"OK"信息子程序**********************************
XS_S:
MOV DPTR,#SF1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
ACALL LCD_PRINT ;LCD显示
MOV DPTR,#SF2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
ACALL LCD_PRINT

;LCD显示
RET
SF1:
DB " DS18B20 Succes ",0
SF2:
DB "TEMP: ",0
;******************************显示"ERROR"信息子程序*******************************
XS_WRONG:
MOV DPTR,#WRONG1 ;指针指到显示消息1
MOV A,#1 ;显示在第一行
ACALL LCD_PRINT ;调用菜单显示子程序
MOV DPTR,#WRONG2 ;指针指到显示消息2
MOV A,#2 ;显示在第一行
ACALL LCD_PRINT ;调用菜单显示子程序
RET
WRONG1:
DB "DS18B20 is WronG ",0
WRONG2:
DB " TEMP Is No On" ,0
;**************************显示温度标记"C"子程序*********************************
TEMP_BJ:
ACALL WR_COMM ;调用写指令子程序
MOV DPTR,#BJ ;存代码表
MOV R1,#0 ;使指针指到表中第一个码
MOV R0,#2 ;取码次数
TP1:MOV A,R1 ;A为0
MOVC A,@A+DPTR ;取码
ACALL WR_DATA ;调用写数据子程序
INC R1 ;R1值加1
DJNZ R0,TP1 ;判断是否将代码读取完?
RET
;**************************自定义字符子程序*************************************
;将自定义字符写入LCD1602的CGRAM中
SELF_DATA:
MOV A,#40H ;指定CG RAM 起始地址
ACALL WR_COMM ;将指令写入LCD
MOV R2,#08H ;图形数据长度8字节
MOV DPTR,#TAB ;存代码表
MOV R3,#00H ;使指针指到表中第一个码
FD: MOV A,R3 ;A为0
MOVC A,@A+DPTR ;读取表代码
ACALL WR_DATA ;调用写入数据指令
INC R3 ;R3 值加1
DJNZ R2,FD ;判断是否将代码读取完
RET
TAB: ;代码表
DB 0CH,12H,12H,0CH
DB 00H,00H,00H,00H
BJ: ;代码表
DB 00h, "C"
zhfu:
MOV A,#0C5H ;设置LCD的第一行字符
ACALL WR_COMM ;调用写指令子程序
MOV DPTR,#ZFFH
JNB ZF,ZS
MOV A,#2
JMP F12
ZS: MOV A,#0H
F12:MOVC A,@A+DPTR
CJNE A,#0,F2
F2: ACALL WR_DATA
INC A
RET
ZFFH:
DB 2BH,0
DB 2DH,0
END

相关文档
最新文档