?? 1602_lcd at89s52.txt
字號:
MOV A,#48H ;將高低溫限值寄存器數據送18B20-EPROM保存.
LCALL WRITE
A_END:
RET
;***************18b20指令子程序**********************
READ_TEMP: ;讀1820內部溫度子程序.
LCALL RESET
JB 70h,EXT1
LCALL SKIP_ROM
LCALL TEMP_CONV ;溫度AD變換
LCALL DELAY_600MS ;時........
LCALL RESET
LCALL SKIP_ROM
LCALL TEMP_GET ;發取溫度的命令
LCALL READ ;接收...
EXT1:
RET
SKIP_ROM:;跳過ROM檢測
MOV A,#0CCH ;#0CCH為跳過rom命令
LCALL WRITE
RET
RELCALL_EPROM:;重調Eprom的值到18B20的暫存RAM中去,,這樣一上電18B20中RAM就有數據了
MOV A,#0B8H;在重調之前有配置或設定好下上限溫度值嗎?看看按鍵程序處有什么?
LCALL WRITE
RET
TEMP_CONV:
MOV A,#44H ;AD變換
LCALL WRITE
RET
TEMP_GET:
MOV A ,#0BEH;讀18b20命令
LCALL WRITE
RET
;****************************18B20基本時序子程序*********************************
RESET: ;初始化子程序 同時也檢測18B20是否存在,,,
SETB P0.0
NOP
CLR P0.0 ;拉低
MOV R3,#150 ; *4=600US
LCALL DELAY_BY_R3
SETB P0.0 ;拉高
MOV R3,#15 ; 60US
LCALL DELAY_BY_R3
MOV R3,#60 ;4個周期*60=240US內檢測
A1: JNB P0.0,A2 ;檢測到低平信號
DJNZ R3,A1 ;如果沒有應答的低電平信號,返回A1重新檢測,超時后下一行,
SETB 70h ;DS1820不存在.
JMP A3
A2: CLR 70h
MOV R3,120;240US;等恢復時間2*120=240us
DJNZ R3, $
A3:
RET
;------------------------
WRITE:
MOV R2,#8;一個字節為8位
CLR C ;C位清0 C位用來放A的一位數據,用移位的方法放入C
B1: SETB P0.0
NOP
CLR P0.0
MOV R3,#4 ;16US
LCALL DELAY_BY_R3
RRC A ;把A中的數送入C
MOV P0.0,C ;把C送入總線
MOV R3,#12 ;48US(一位數據的發送:60us<tx<120us)
LCALL DELAY_BY_R3
SETB P0.0 ;拉高1us結束一位
NOP
DJNZ R2,B1
RET
READ:
MOV R1,#9 ;接收4個字節數據依次是1.低位 2.高位. 3.高限 4.低限
MOV R0,#TEMPHEAD;低位放28H;高位放29h (1. 28H,2. 29H 3. 2AH 4. 2BH )
MOV B,#00H
READTEMP2:LCALL READDS1820
MOV @R0,A
INC R0
READTEMP21:LCALL CRC8CAL
DJNZ R1,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD
MOV TMP_L,A
MOV A,TEMPHEAD+1
MOV TMP_H,A
MOV A,TEMPHEAD+2
MOV 2AH,A
MOV A,TEMPHEAD+3
MOV 2BH,A
READTEMPOUT:RET
CRC8CAL:PUSH ACC
MOV R7,#08H
CRCLOOP1:XRL A,B
RRC A
MOV A,B
JNC CRCLOOP2
XRL A,#18H
CRCLOOP2:RRC A
MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRCLOOP1
POP ACC
RET
READDS1820:
MOV R2,#8;一字節數據8位
C11: CLR C ;清除C
SETB P0.0
NOP
NOP
CLR P0.0 ;拉低.
NOP ;1us秒后拉高?
NOP
NOP
SETB P0.0
MOV R6,#07H
DJNZ R6,$
MOV C,P0.0 ;讀出18b20的數據
RRC A ;移入A
MOV R6,#3CH
DJNZ R6,$
SETB P0.0
DJNZ R2,C11 ;一個字節收完
MOV R6,#3CH
DJNZ R6,$
RET
;*********************************************************************************
;*****************LCD_控制命令***************
DISPLAY: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE_DATA_TO_LCD
INC R1
DJNZ R0,DISPLAY
RET
WRITE_NOT_CHECK_BUSY:
SETB E
NOP
NOP
CLR RS ;寫入控制命令的子程序
CLR RW
CLR E
RET
ENABLE: ;只要先將命令數據或地址先送P1,再調用ENABLE就可以寫入哦
SETB E
NOP
NOP
CLR RS ;寫入控制命令的子程序
CLR RW
CLR E
LCALL TEST_BUSY
SETB E
RET
TEST_BUSY:
SETB E
NOP
NOP
MOV P1,#0FFH ;判斷液晶顯示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,TEST_BUSY ;如果P1.7為高電平表示忙就循環等待
RET
WRITE_DATA_TO_LCD:
SETB E
NOP
NOP
SETB RS ;RS=1
CLR RW ;RW=0 ;準備寫入數據
CLR E ;E=0 ;執行顯示命令
LCALL TEST_BUSY ;判斷液晶模塊是否忙?
SETB E ;E=1 ;顯示完成,程序停車
RET
;***************************數據轉換***************************
DATA_CONV: ;數據轉換
MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A
MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A
MOV A,28H ;低字節
ANL A,#0FH;去除高位
MOV B,#6;乘6得到實際數值的100倍.
MUL AB
MOV B,#10
DIV AB
MOV 33H,A;小數位高
MOV 32H,B; 小數位低
MOV A,28H
MOV C,29H.0 ;29h高位的低4字節
RRC A
MOV C,29H.1
RRC A
MOV C,29H.2
RRC A
MOV C,29H.3
RRC A
MOV 28H,A ;重新合成.結果存在28H.
MOV A,28H
MOV B,#10
DIV AB
MOV 26H,A ;整數位高
MOV 25H,B ;整數位低
;-------------------------
MOV A,2AH
MOV B,#10
DIV AB
MOV 40H,B ;高溫限值個位
MOV B,#10
DIV AB
MOV 41H,B;十位
MOV 42H,A;百位
;----------------------------
MOV A,2BH
MOV B,#10
DIV AB
MOV 43H,B ;低溫限值位個位
MOV B,#10
DIV AB
MOV 44H,B ;十位
MOV 45H,A ;百位
CLR C ;只在下上限兩溫度之間才能正常工作
MOV A,28H;現溫度值與高溫限值比較
SUBB A,2AH
JC BIG ;如果高.則關機器
CLR K_ON
AJMP CONVERT_END
BIG:CLR C
MOV A,2BH;現溫度與低溫限值比較
SUBB A,28H
JC X_BIG ;低溫限值比現溫高,則開機器
CLR K_ON
AJMP CONVERT_END
X_BIG:
SETB K_ON
CONVERT_END:
RET
DATA_CONV1 :
MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A
MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A
MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A
RET
/*********顯示時間TIME字符串及時間值***************/
DISPLAY_TIME: PUSH PSW
MOV P1,#11000000B
LCALL ENABLE
MOV DPTR,#TIME
MOV R1,#0
MOV R0,#6
LCALL DISPLAY
/***************/
MOV DPTR,#LED_DATA
MOV R1,46H //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,47H //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,48H //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,49H //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,4AH //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,4BH //已經是壓縮型BCD碼了,,但還不是ASCII碼
MOV R0,#1
LCALL DISPLAY
POP PSW
RET
;********************顯示溫度*************************
DISPLAY_18B20_TEMP: ;LCD_顯示子程序
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#TAB3;顯示'WENDU:'
MOV R1,#0 ;碼表初值
MOV R0,#7;字數
LCALL DISPLAY
;---------------顯示溫度值高位
MOV DPTR,#LED_DATA
MOV R1,26H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示溫度值低位
MOV DPTR,#LED_DATA
MOV R1,25H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示小數點
MOV DPTR,#DOT
MOV R1,#0 ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示溫度值小數高位
MOV DPTR,#LED_DATA
MOV R1,33H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示溫度值小數低位
MOV DPTR,#LED_DATA
MOV R1,32H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示單位度
MOV DPTR,#SIGN
MOV R1,#0 ;碼表初值
MOV R0,#2;字數
LCALL DISPLAY
RET
;******************顯示限值.*****************
DISPLAY_18B20_TEMP_XZ:
MOV P1,#11000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#TAB_L ; 顯示'L:'
MOV R1,#0 ;碼表初值
MOV R0,#2;字數
LCALL DISPLAY
;---------------顯示溫度限值高位
MOV DPTR,#LED_DATA
MOV R1,45H ;碼表初值(45H中存的是十進制值)只是一位數百位,通過查表可找出相應ASCII值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示溫度限值低位
MOV DPTR,#LED_DATA
MOV R1,44H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;-----------------
MOV DPTR,#LED_DATA
MOV R1,43H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
MOV P1,#11000111B; 顯示位置
LCALL ENABLE
;----
MOV DPTR,#TAB_H ; 顯示'H:'
MOV R1,#0 ;碼表初值
MOV R0,#2;字數
LCALL DISPLAY
;---------------顯示高溫度限值高位
MOV DPTR,#LED_DATA
MOV R1,42H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;---------------顯示高溫度限值低位
MOV DPTR,#LED_DATA
MOV R1,41H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
;-------------------
MOV DPTR,#LED_DATA
MOV R1,40H ;碼表初值
MOV R0,#1;字數
LCALL DISPLAY
RET
;**********************提示語**********************
DISPLAY_18B20_HELLO:
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#TAB_HELLO
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
RET
/*
DISPLAY_18B20_TESTING:
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#TAB_TESTING
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
RET
*/
DISPLAY_18B20_ERROR:
MOV P1,#00000001B ;清屏并光標復位
LCALL ENABLE
MOV DPTR,#TAB1
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
RET
DISPLAY_WATING:
MOV P1,#00000001B ;清屏并光標復位
LCALL ENABLE;調用寫入命令子程序
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#TAB2
MOV R1,#0 ;碼表初值
MOV R0,#13;字數
LCALL DISPLAy
RET
DISPLAYINT_MUSIC:
MOV P1,#00000001B ;清屏并光標復位
LCALL ENABLE;調用寫入命令子程序
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#MUSICSTRING
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
DISPLAY_NAME:
MOV P1,#11000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV R1,#0 ;碼表初值
MOV R0,#15;字數
LCALL DISPLAy
RET
STOPWATCH:DB ' STOPWATCH '
STOPWATCH_INIT:DB '--00:00:00:00---'
DISPLAYINT_STOPWATCH_000000:
MOV P1,#00000001B ;清屏并光標復位
LCALL ENABLE;調用寫入命令子程序
MOV P1,#10000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#STOPWATCH
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
MOV P1,#11000000B; 顯示位置
LCALL ENABLE ;執行指令
MOV DPTR,#STOPWATCH_INIT
MOV R1,#0 ;碼表初值
MOV R0,#16;字數
LCALL DISPLAy
RET
MUSICSTRING:DB 'PLAYING... MUSIC'
MUSIC_NAME_15: DB '<JUST LOVE YOU>'
MUSIC_NAME_8: DB 'ZHOU_ZAI_XIANG_X'
MUSIC_NAME_9: DB 'SHUI_SHANG_PU_DE'
MUSIC_NAME_10: DB ' SHANG-HAI-TAN '
MUSIC_NAME_11: DB 'GU-DAN-BEI-P-QIU'
MUSIC_NAME_12: DB 'TAO-HUA-DUO.-KAI'
MUSIC_NAME_13: DB 'DA-CHENG-XIAO_AI'
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -