?? ds18b20-lcd1602-溫度控制.asm
字號:
MOV A,TEMP_TH ;加載 TH 數(shù)據(jù)
MOV LCD_X,#3 ;設置位置變量
CALL SHOW_DIG2H ;顯示 TH 數(shù)據(jù)
MOV A,#0CEH ;指定地址
CALL TEMP_BJ1 ;
MOV A,TEMP_TL ;加載 TL 數(shù)據(jù)
MOV LCD_X,#12 ;設置位置變量
CALL SHOW_DIG2L ;顯示 TL 數(shù)據(jù)
RET
;--------------------------------------------
M_ALAX2:
DB "TH: TL: ",0
;--------------------------------------------
;顯示標記“℃”子程序
;在指定的位置顯示“℃”
;--------------------------------------------
TEMP_BJ1:
CALL WCOM
MOV DPTR,#BJ2 ;指針指到顯示信息區(qū)
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 數(shù)值
;將 TH 值分離并轉(zhuǎn)換為 ASCII 碼,送顯示
;百位、十位、個位
;---------------------------------------------------
SHOW_DIG2H:
MOV B,#100
DIV AB ;
CJNE A,#01H,SHOW_DIG2H1
ADD A,#30H ;百位轉(zhuǎn)換為ASCII碼
JMP SHOW_DIG2H2
SHOW_DIG2H1:
MOV A,#' ' ;百位數(shù)不為1,顯示空格
SHOW_DIG2H2:
PUSH B
MOV B,LCD_X
CALL LCDP2 ;送顯示
POP B
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H ;十位轉(zhuǎn)換為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 ;個位轉(zhuǎn)換為ASCII碼
CALL LCDP2 ;送顯示
RET
;-------------------------------------------------
;在 LCD 的第二行顯示 TL 數(shù)值
;將 TL 值分離并轉(zhuǎn)換為 ASCII 碼,送顯示
;只取十位數(shù)和個位數(shù),百位數(shù)舍棄
;-------------------------------------------------
SHOW_DIG2L:
MOV B,#100 ;
DIV AB ;百位數(shù)舍棄
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H ;十位數(shù)轉(zhuǎn)換為 ASCII 碼
PUSH B
MOV B,LCD_X ;確定顯示位置
CALL LCDP2 ;送顯示
POP B
INC LCD_X ;調(diào)整顯示地址
MOV A,B ;個位數(shù)
MOV B,LCD_X ;確定顯示位置
ADD A,#30H ;個位數(shù)轉(zhuǎn)換為 ASCII 碼
CALL LCDP2 ;送顯示
RET
;==========================================================
; LCD 1602 溫度值顯示子程序
;73H-70H 分別存放百位、十位、個位、小數(shù)位的數(shù)據(jù)
;==========================================================
CONV:
MOV A,73H ;加載百位數(shù)據(jù)
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 ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV0:
CJNE A,#00H,CONV2
CONV1: MOV A,#" " ;百位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
MOV A,72H ;十位
CJNE A,#00H,CONV3
INC LCD_X ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV2: CALL SHOW_DIG2 ;顯示數(shù)據(jù)
CONV3: INC LCD_X ;調(diào)整顯示地址
MOV A,72H ;十位
CALL SHOW_DIG2
CONV4:
INC LCD_X ;調(diào)整顯示地址
MOV A,71H ;個位
CALL SHOW_DIG2
INC LCD_X ;調(diào)整顯示地址
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2
MOV A,70H ;加載小數(shù)位
INC LCD_X ;設置位置
CALL SHOW_DIG2 ;顯示數(shù)據(jù)
RET
;-------------------------------------------------------
SHOW_DIG2: ;在 LCD 的第二行顯示數(shù)字
ADD A,#30H ;加30H,轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;確定顯示位置
CALL LCDP2 ;送顯示
RET
;=============================================
;在LCD的第一行顯示數(shù)據(jù)字符
;A=ASCII 數(shù)據(jù), B=位置變量
;==============================================
LCDP1: ;在LCD的第一行顯示字符
PUSH ACC ;
MOV A,B ;設置顯示地址
ADD A,#80H ;設置LCD的第一行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數(shù)據(jù)
RET
;=============================================
;在LCD的第二行顯示數(shù)據(jù)字符
;A=ASCII 數(shù)據(jù), B=位置變量
;==============================================
LCDP2: ;在LCD的第二行顯示字符
PUSH ACC ;
MOV A,B ;設置顯示地址
ADD A,#0C0H ;設置LCD的第二行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數(shù)據(jù)
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 ;清除該行字符數(shù)據(jù)
MOV A,#80H ;設置 LCD 的第一行地址
CALL WCOM ;寫入命令
JMP FILL
LINE2: MOV A,#0C0H ;設置 LCD 的第二行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#0C0H ;設置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,LC1 ;判斷是否為結(jié)束碼
RET
LC1: CALL WDATA ;寫入數(shù)據(jù)
INC DPTR ;指針加1
JMP FILL ;繼續(xù)填入字符
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
;===============================================
;數(shù)據(jù)寫入子程序
;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
;以8位控制方式將數(shù)據(jù)寫至LCD
;===============================================
WDATA:
MOV P0,A ;寫入數(shù)據(jù)
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 ;結(jié)束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -