📄 ds18b20-lcd1602-温度控制.asm
字号:
MOV A,TEMP_TH ;加载 TH 数据
MOV LCD_X,#3 ;设置位置变量
CALL SHOW_DIG2H ;显示 TH 数据
MOV A,#0CEH ;指定地址
CALL TEMP_BJ1 ;
MOV A,TEMP_TL ;加载 TL 数据
MOV LCD_X,#12 ;设置位置变量
CALL SHOW_DIG2L ;显示 TL 数据
RET
;--------------------------------------------
M_ALAX2:
DB "TH: TL: ",0
;--------------------------------------------
;显示标记“℃”子程序
;在指定的位置显示“℃”
;--------------------------------------------
TEMP_BJ1:
CALL WCOM
MOV DPTR,#BJ2 ;指针指到显示信息区
MOV R1,#0
MOV R0,#2
BBJJ2:
MOV A,R1
MOVC A,@A+DPTR
CALL WDATA
INC R1
DJNZ R0,BBJJ2
RET
BJ2:
DB 00H,"C"
;---------------------------------------------------
;在 LCD 的第二行显示 TH 数值
;将 TH 值分离并转换为 ASCII 码,送显示
;百位、十位、个位
;---------------------------------------------------
SHOW_DIG2H:
MOV B,#100
DIV AB ;
CJNE A,#01H,SHOW_DIG2H1
ADD A,#30H ;百位转换为ASCII码
JMP SHOW_DIG2H2
SHOW_DIG2H1:
MOV A,#' ' ;百位数不为1,显示空格
SHOW_DIG2H2:
PUSH B
MOV B,LCD_X
CALL LCDP2 ;送显示
POP B
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H ;十位转换为ASCII码
INC LCD_X
PUSH B
MOV B,LCD_X
CALL LCDP2 ;送显示
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H ;个位转换为ASCII码
CALL LCDP2 ;送显示
RET
;-------------------------------------------------
;在 LCD 的第二行显示 TL 数值
;将 TL 值分离并转换为 ASCII 码,送显示
;只取十位数和个位数,百位数舍弃
;-------------------------------------------------
SHOW_DIG2L:
MOV B,#100 ;
DIV AB ;百位数舍弃
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H ;十位数转换为 ASCII 码
PUSH B
MOV B,LCD_X ;确定显示位置
CALL LCDP2 ;送显示
POP B
INC LCD_X ;调整显示地址
MOV A,B ;个位数
MOV B,LCD_X ;确定显示位置
ADD A,#30H ;个位数转换为 ASCII 码
CALL LCDP2 ;送显示
RET
;==========================================================
; LCD 1602 温度值显示子程序
;73H-70H 分别存放百位、十位、个位、小数位的数据
;==========================================================
CONV:
MOV A,73H ;加载百位数据
MOV LCD_X,#6 ;设置显示位置
JNB FLAG3,CONV0 ;
MOV A,#"-" ;显示"-"
MOV B,LCD_X
CALL LCDP2
MOV A,72H ;十位
CJNE A,#00H,CONV3
INC LCD_X ;调整显示地址
MOV A,#" " ;十位数等于0显示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV0:
CJNE A,#00H,CONV2
CONV1: MOV A,#" " ;百位数等于0显示空格
MOV B,LCD_X
CALL LCDP2
MOV A,72H ;十位
CJNE A,#00H,CONV3
INC LCD_X ;调整显示地址
MOV A,#" " ;十位数等于0显示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV2: CALL SHOW_DIG2 ;显示数据
CONV3: INC LCD_X ;调整显示地址
MOV A,72H ;十位
CALL SHOW_DIG2
CONV4:
INC LCD_X ;调整显示地址
MOV A,71H ;个位
CALL SHOW_DIG2
INC LCD_X ;调整显示地址
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2
MOV A,70H ;加载小数位
INC LCD_X ;设置位置
CALL SHOW_DIG2 ;显示数据
RET
;-------------------------------------------------------
SHOW_DIG2: ;在 LCD 的第二行显示数字
ADD A,#30H ;加30H,转换为ASCII码
MOV B,LCD_X ;确定显示位置
CALL LCDP2 ;送显示
RET
;=============================================
;在LCD的第一行显示数据字符
;A=ASCII 数据, B=位置变量
;==============================================
LCDP1: ;在LCD的第一行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#80H ;设置LCD的第一行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;=============================================
;在LCD的第二行显示数据字符
;A=ASCII 数据, B=位置变量
;==============================================
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;=================================================
;对 LCD 做初始化设置
;将自定义字符“℃”存入 LCD1602 的 CGRAM 中
;=================================================
SET_LCD:
CLR LCD_EN
CALL INIT_LCD ;初始化 LCD
CALL STORE_DATA ;将自定义字符存入LCD的CGRAM
RET
INIT_LCD:
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM ;写入命令
CALL DELAY1 ;延时5MS
MOV A,#38H
CALL WCOM ;写入命令
CALL DELAY1 ;延时5MS
MOV A,#38H
CALL WCOM ;写入命令
CALL DELAY1 ;延时5MS
MOV A,#0CH ;开显示, 不显示光标,光标不闪烁
CALL WCOM ;写入命令
CALL DELAY1 ;延时5MS
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM ;写入命令
CALL DELAY1 ;延时5MS
RET
;==================================================
;在LCD的第一行或第二行显示字符串
;DPTR = 放字符串的地址
;==================================================
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;===============================================
;清除一行 LCD 的字符
;输入一行空格,来替代原显示字符
;===============================================
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
DE: MOV R7,#250 ;延时 500 微秒
DJNZ R7,$
RET
;===============================================
;命令写入子程序
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;以8位控制方式将命令写至LCD
;===============================================
WCOM:
MOV P0,A ;写入命令
CLR LCD_RS
CLR LCD_RW
SETB LCD_EN
ACALL DELAY1
CLR LCD_EN
RET
;===============================================
;数据写入子程序
;RS=H,RW=L,D0-D7=指令码,E=高脉冲
;以8位控制方式将数据写至LCD
;===============================================
WDATA:
MOV P0,A ;写入数据
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DE
CLR LCD_EN
CALL DE
RET
;===============================================
;蜂鸣器响一声子程序
;P3.7=0,蜂鸣器响
;===============================================
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP ;对 P3.7 取反
DJNZ R6,BL2
MOV R5,#10
CALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY: ;(R5)*延时10MS
MOV R6,#50
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
;==============================================
END ;结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -