- 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
复制代码
|