?? ds18b20-lcd.asm
字號:
nop
clr date_line ;讀前總線保持為低
nop
nop
nop
setb date_line ;開始讀總線釋放
mov r3,#09 ;延時18微妙
djnz r3,$
mov c,date_line ;從DS18B20總線讀得一個BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
rrc a ;把讀得的位值環移給A
djnz r2,re01 ;讀下一個BIT
mov @r1,a
inc r1
djnz r4,re00
ret
;*****************************************************
; 處理溫度 BCD 碼子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;溫度零上轉
CLR C
MOV A,TEMPL ;二進制數求補(雙字節)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;+
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小數部分 BCD
MOV A,TEMPL ;整數部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A
ORL A,TEMPL ;重新組合
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位數 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 個位數 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R4
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R4,A
MOV A,TEMPHC ;TEMPHC HI = 百位數 BCD
ANL A,#0FH
ORL A,R4
MOV TEMPHC,A
TEMPC12: RET
;---------------------------------------------------------------
HEX2BCD1:
MOV B,#064H ;十六進制-> BCD
DIV AB ;B= A % 100
MOV R4,A ;R7 = 百位數
MOV A,#0AH
XCH A,B
DIV AB ;B = A % B
SWAP A
ORL A,B
RET
;-------------------------------------------------------------
; 小數部分碼表
;-------------------------------------------------------------
TEMPDOTTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;=====================================================
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;指針指到顯示信息區
MOV A,#2 ;顯示在第二行
CALL LCD_PRINT
MOV A,#0C6H
CALL TEMP_BJ1
MOV A,TEMP_TH ;加載TH數據
MOV LCD_X,#3 ;設置位置
CALL SHOW_DIG2H ;顯示數據
MOV A,#0CEH
CALL TEMP_BJ1
MOV A,TEMP_TL ;加載TL數據
MOV LCD_X,#12 ;設置位置
CALL SHOW_DIG2L ;顯示數據
RET
;--------------------------------------------
M_ALAX1:
DB " LOOK ALERT CODE",0
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"
;---------------------------------------------------
SHOW_DIG2H: ;在 LCD 的第二行顯示數字
MOV B,#100
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
CALL LCDP2
POP B
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H
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
CALL LCDP2
RET
SHOW_DIG2L: ;在 LCD 的第二行顯示數字
MOV B,#100
DIV AB
MOV A,#0AH
XCH A,B
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
CALL LCDP2
POP B
INC LCD_X
MOV A,B
MOV B,LCD_X
ADD A,#30H
CALL LCDP2
RET
;-------------------------------------------------------------
;顯示區 BCD 碼溫度值刷新子程序
;-------------------------------------------------------------
DISPBCD:
MOV A,TEMPLC
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,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位數是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符號位不顯示
MOV 72H,A ;十位數顯示符號
DISPBCD2: RET
;==========================================================
; LCD 1602 顯示子程序
;==========================================================
CONV:
MOV A,73H ;加載百位數據
MOV LCD_X,#6 ;設置位置
CJNE A,#1,CONV1
JMP CONV2
CONV1: MOV A,#" "
MOV B,LCD_X
CALL LCDP2
JMP CONV3
CONV2: CALL SHOW_DIG2 ;顯示數據
CONV3: INC LCD_X ;
mov a,72h ;十位
CALL SHOW_DIG2
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
MOV B,LCD_X
CALL LCDP2
RET
;---------------------------------------------------------
LCDP2: ;在LCD的第二行顯示字符
PUSH ACC ;
MOV A,B ;設置顯示地址
ADD A,#0C0H ;設置LCD的第二行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數據
RET
;---------------------------------------------------------
SET_LCD: ;對 LCD 做初始化設置及測試
CLR LCD_EN
CALL INIT_LCD ;初始化 LCD
CALL STORE_DATA ;將自定義字符存入LCD的CGRAM
RET
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
call delay1
MOV A,#38H
CALL WCOM
call delay1
MOV A,#38H
CALL WCOM
call delay1
MOV A,#0CH ;開顯示,顯示光標,光標不閃爍
CALL WCOM
call delay1
MOV A,#01H ;清除 LCD 顯示屏
CALL WCOM
call delay1
RET
;==================================================
CLR_LINE1: ;清除LCD的第一行字符
MOV A,#80H ;設置 LCD 的第一行地址
CALL WCOM ;
MOV R0,#24 ;設置計數值
C1: MOV A,#' ' ;載入空格符至LCD
CALL WDATA ;輸出字符至LCD
DJNZ R0,C1 ;計數結束
RET
;==================================================
LCD_PRINT: ;在LCD的第一行或第二行顯示字符
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
;=========================================
CLR_LINE: ;清除該行 LCD 的字符
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
DE: MOV R7,#250
DJNZ R7,$
RET
;============================================
WCOM: ;以8位控制方式將命令寫至LCD
MOV P0,A ;寫入命令
CLR LCD_RS ;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
CLR LCD_RW
SETB LCD_EN
ACALL DELAY1
CLR LCD_EN
RET
;=============================================
WDATA: ;以8位控制方式將數據寫至LCD
MOV P0,A ;寫入數據
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DE
CLR LCD_EN
CALL DE
RET
;=============================================
;PRINT A CHAR ON LINE 1
;A=ASC DATA, B=LINE X POS
;==============================================
LCDP1: ;在LCD的第一行顯示字符
PUSH ACC ;
MOV A,B ;設置顯示地址
ADD A,#80H ;設置LCD的第一行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數據
RET
;==============================================
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP
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
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 + -