- LCD_X EQU 23H ;LCD 地址變量(決定文字的在LCD上的顯示位置)
- ;-----------------------------------------------------------
- LCD_RS EQU P4.0 ;LCD 數據/命令選擇端
- LCD_RW EQU P4.1 ;LCD 讀/寫選擇端
- LCD_EN EQU P4.2 ;LCD 使能信號
- LCD_BG EQU P4.3 ;LCD 背光控制端
- LCD_SJ EQU P0 ;LCD 數據
- ;===========================================================
- ORG 0000H
- AJMP MAIN
- ORG 0100H
- ;===========================================================
- MAIN: MOV SP,#60H
- CLR LCD_BG ;打開LCD背光
- CALL SET_LCD ;初始化 LCD
- CALL MENU_1 ;顯示菜單1
- MOV 73H,#1 ;加載百位數據
- MOV 72H,#2 ;加載十位數據
- MOV 71H,#3 ;加載個位數據
- MOV 70H,#4 ;加載小數位數據
- ACALL CONV01
- SJMP $
- ;=================================================
- ;對 LCD 做初始化設置
- ;=================================================
- SET_LCD: MOV A,#34H ;34H--擴充指令操作
- CALL WCOM ;寫入命令
- MOV A,#30H ;30H--基本指令操作
- CALL WCOM ;寫入命令
- MOV A,#01H ;清除顯示
- CALL WCOM ;寫入命令
- MOV A,#06H ;指定在資料寫入或讀取時,光標的移動方向
- CALL WCOM ;DDRAM 的地址計數器(AC)加1
- MOV A,#0CH ;開顯示,關光標,不閃爍
- CALL WCOM ;寫入命令
- RET
- ;==========================================================
- ;73H-70H 分別存放百位、十位、個位、小數位的數據
- ;==========================================================
- CONV01: MOV A,73H ;加載百位數據
- MOV LCD_X,#1 ;設置顯示位置
- 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
- ;=============================================
- ;在LCD的第二行顯示數據字符
- ;A=ASCII 數據, B=位置變量
- ;==============================================
- LCDP2: PUSH ACC ;在LCD的第二行顯示字符
- MOV A,B ;設置顯示地址
- ADD A,#90H ;設置LCD的第二行地址
- CALL WCOM ;寫入命令
- POP ACC ;由堆棧取出A
- CALL WDATA ;寫入數據
- RET
- ;-------------------------------------------------------
- SHOW_DIG2: ;在 LCD 的第二行顯示數字
- ADD A,#30H ;加30H,轉換為ASCII碼
- MOV B,LCD_X ;確定顯示位置
- CALL LCDP2 ;送顯示
- RET
- ;===============================================
- ;命令寫入子程序
- ;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
- ;以8位控制方式將命令寫至LCD
- ;===============================================
- WCOM: LCALL CHK_BUSY ;寫入指令
- CLR LCD_RS
- CLR LCD_RW
- MOV LCD_SJ,A
- SETB LCD_EN
- NOP
- NOP
- CLR LCD_EN
- RET
- ;===============================================
- ;數據寫入子程序
- ;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
- ;以8位控制方式將數據寫至LCD
- ;===============================================
- WDATA: MOV LCD_SJ,A ;寫入數據
- SETB LCD_RS
- CLR LCD_RW
- SETB LCD_EN
- CALL DE
- CLR LCD_EN
- CALL DE
- RET
- ;===============================================
- ;測LCD忙碌子程序
- ;RS=0,RW=1,E=H,D0-D7=狀態字
- ;===============================================
- CHK_BUSY: MOV LCD_SJ,#0FFH ;測忙碌子程序
- CLR LCD_RS
- SETB LCD_RW
- SETB LCD_EN
- JB LCD_SJ.7,$
- CLR LCD_EN
- RET
- ;==========================================================
- ;LCD 顯示第一頁菜單
- ;==========================================================
- MENU_OK1: MOV DPTR,#M_OK11 ;指針指到顯示信息區
- MOV A,#1 ;顯示在第一行
- CALL LCD_PRINT
- MOV DPTR,#M_OK12 ;指針指到顯示信息區
- MOV A,#2 ;顯示在第二行
- CALL LCD_PRINT
- MOV DPTR,#M_OK13 ;指針指到顯示信息區
- MOV A,#3 ;顯示在第二行
- CALL LCD_PRINT
- MOV DPTR,#M_OK14 ;指針指到顯示信息區
- MOV A,#4 ;顯示在第二行
- CALL LCD_PRINT
- RET
- M_OK11: DB"一氧化氮濃度: ",0
- M_OK12: DB" PPM",0 ;超過120PPM報警
- M_OK13: DB"油量: ",0
- M_OK14: DB" 升 ",0
- ;==================================================
- ;在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: CJNE A,#2,LINE3 ;判斷是否為第二行
- MOV A,#90H ;設置 LCD 的第二行地址
- CALL WCOM ;寫入命令
- CALL CLR_LINE ;清除該行字符數據
- MOV A,#90H ;設置 LCD 的第二行地址
- CALL WCOM
- JMP FILL
- LINE3: CJNE A,#3,LINE4 ;判斷是否為第三行
- MOV A,#88H ;設置 LCD 的第三行地址
- CALL WCOM ;寫入命令
- CALL CLR_LINE ;清除該行字符數據
- MOV A,#88H ;設置 LCD 的第三行地址
- CALL WCOM
- JMP FILL
- LINE4: MOV A,#98H ;設置 LCD 的第四行地址
- CALL WCOM ;寫入命令
- CALL CLR_LINE ;清除該行字符數據
- MOV A,#98H ;設置 LCD 的第四行地址
- CALL WCOM
- FILL: CLR A ;填入字符
- MOVC A,@A+DPTR ;由信息區取出字符
- CJNE A,#0,LC1 ;判斷是否為結束碼
- RET
- LC1: CALL WDATA ;寫入數據
- INC DPTR ;指針加1
- JMP FILL ;繼續填入字符
- ;===============================================
- ;清除一行 LCD 的字符
- ;輸入一行空格,來替代原顯示字符
- ;===============================================
- CLR_LINE: MOV R0,#24 ;清除該行 LCD 的字符
- CL1: MOV A,#' '
- CALL WDATA
- DJNZ R0,CL1
- RET
- ;====================================================
- ;實時溫度值與設定報警溫度值 TH、TL 比較子程序
- ;當實際溫度大于 TH 的設定值時,顯示“過高”并閃動顯示
- ;當實際溫度小于 TH 的設定值時,顯示“正常”
- ;當實際溫度小于 TL 的設定值時,顯示“過低”
- ;====================================================
- TEMP_COMP:JNB FLAG2,L101 ;讀取水溫傳感器時用以下程序
- MOV TEMP_TH,#SWGWSD
- MOV TEMP_TL,#SWDWSD ;設置 LCD 的第一行地址
- SJMP L102
- L101: JNB FLAG3,L104 ;讀取油溫傳感器時用以下程序
- MOV TEMP_TH,#YWGWSD
- MOV TEMP_TL,#YWDWSD
- L102: CLR C
- MOV A,TEMP_ZH
- CJNE A,TEMP_TH,T_COMP0;實時溫度與設定報警溫度比較,運行后當A<TEMP_TH則C=1
- T_COMP0: JNC CHULI1 ;檢查溫度是否過高
- MOV A,TEMP_ZH
- SUBB A,TEMP_TL ;檢查溫度是否過低,減數>被減數,則
- JC CHULI2 ;借位標志位C=1,轉
- MOV DPTR,#BJ50 ;顯示"正常"
- CALL TEMP_BJ3
- L106: JNB FLAG2,L103 ;讀取水溫傳感器時用以下程序
- CLR FLAH1 ;清除水溫報警標志
- SJMP L104
- L103: JNB FLAG3,L104 ;讀取油溫傳感器時用以下程序
- CLR FLAH2 ;清除油溫報警標志
- L104: RET
- CHULI1: MOV DPTR,#BJ60 ;顯示形成閃爍效果
- CALL TEMP_BJ3
- MOV R5,#10 ;延時10MS
- LCALL DELAY1
- MOV DPTR,#BJ30 ;顯示"過高"
- CALL TEMP_BJ3
- JNB FLAG2,L105
- SETB FLAH1 ;設置水溫報警標志
- SJMP L104
- L105: JNB FLAG3,L104
- SETB FLAH2 ;設置油溫報警標志
- SJMP L104
- CHULI2: MOV DPTR,#BJ40 ;顯示"過低"
- CALL TEMP_BJ3
- SJMP L106
- ;=========================================
- ;標記字符寫入子程序
- ;=========================================
- TEMP_BJ3: JNB FLAG2,L001 ;讀取水溫傳感器時用以下程序
- MOV A,#86H ;設置 LCD 的第一行地址
- SJMP L002
- L001: JNB FLAG3,L004 ;讀取油溫傳感器時用以下程序
- MOV A,#8EH ;設置 LCD 的第三行地址
- L002: CALL WCOM ;寫入指令
- L003: CLR A ;填入字符
- MOVC A,@A+DPTR ;由信息區取出字符
- CJNE A,#0,L005 ;判斷是否為結束碼
- L004: RET
- L005: CALL WDATA ;寫入數據
- INC DPTR ;指針加1
- JMP L003 ;繼續填入字符
- BJ30: DB "濃度超標請注意!",0 ;溫度過高顯示內容
- BJ40: DB " ",0 ;溫度正常顯示內容
- BJ50: DB "低油位,請加油!",0 ;溫度過低顯示內容
- BJ60: DB " ",0 ;清除以上標記
- ;**********************************************************
- ;延時子程序
- ;**********************************************************
- DE: MOV R7,#229 ;延時 500 微秒,此條2個機器周期
- DJNZ R7,$
- RET ;此條2個機器周期,總延時(229*2+2+2)*(12/11.0592)≈500uS
- END
復制代碼
|