标题:
液晶显示数值
[打印本页]
作者:
daniu
时间:
2014-12-26 23:32
标题:
液晶显示数值
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
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1