LM016L的显示程序
- 格式:doc
- 大小:46.00 KB
- 文档页数:8
LCD1602中文资料在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用晶液显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
一、液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
2、液晶显示器的分类:液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
3、液晶显示器各种图形的显示原理:线段的显示:点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
硬件原理图我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
液晶模块简介LM016L的结构及功能LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能丄M016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)与数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC) oIR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM 与CGRAM,或者暂存从DDRAM 与CGRAM 读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令与接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中与5*10点阵字符32种、8位字符编码与字符的对应关系,可以查瞧参考文献(30)中的表4、CGRAM就是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC 可以存储DDRAM与CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿丄M016L 液晶模块的引脚功能如下表所示:引脚说明1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线就是背光电源线VCC(15脚)与地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚符号功能说明VSS 一般接地VDD 接电源(+5V)液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过V0高时会产生鬼影”使用时可以通过一个10K的电位器调整对比度)o RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
R/W R/W为读写信号线,高电平⑴时进行读操作,低电平(0)时进行写操作。
LCD1602和LM016l中文资料编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(LCD1602和LM016l中文资料)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为LCD1602和LM016l中文资料的全部内容。
LCD1602中文资料在日常生活中,我们对液晶显示器并不陌生.液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用晶液显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多.(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
一、液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
Proteus实现ARM7+LM016L液晶模块的仿真1 液晶模块结构及功能简介LM016L液晶模块采用HD44780控制器。
HD44780具有简单而功能较强的指令集,可以实现字符移动、闪烁等功能。
HD44780控制器由两个8位寄存器、指令寄存器(IR)和数据寄存器(DR)、忙标志(BF)、显示数据RAM(DDRAM)、字符发生器ROM(CGROM)、字符发生器RAM(CGRAM)、地址计数器(AC)构成。
IR用于寄存指令码,只能写入不能读出;DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据。
BF为1时,液晶模块处于内部处理模式,不响应外部操作指令和接受数据。
DDRAM用来存储显示的字符,能存储80个字符码。
CGROM由8位字符码生成5 x 7点阵字符160种和5×10点阵字符32种,8位字符编码和字符的对应关系。
CGRAM是为用户编写特殊字符留用的,它的容量仅64字节。
可以自定义8个5×7点阵字符或者4个5×10点阵字符。
AC可以存储DDRAM和CGRAM地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或者CGRAM单元。
2 基于Proteus ISIS 7的液晶模块仿真2.1 接口设计运行Proteus ISIS 7进入设计界面,依照图1所示在元件库中选择需要的元件。
Lpc2138的P0.0-P0.7端口作为8位数据的输出端,P0.8、P0.9、P0.10作为控制信号的输出端,连接完成的电路如图l所示。
2.2 软件设计电路图绘制好之后,就可以编写LM016L的驱动程序。
LM016L的操作有两大类:读操作和写操作。
一般情况下不需要从液晶中读取数据,所以对液晶操作主要是写指令和写数据两个写操作,对于忙标志(BF),查询的方法,保证液晶模块有足够时间进行内部数据处理。
在写源程序时,需要根据液晶模块的时序图编写程序。
LM016L结构及功能LM016L是一种16×2字符液晶模块,具有一系列的功能和特性,适用于各种电子设备和嵌入式系统。
这种显示模块采用了液晶显示技术,可以实现高清晰度、低功耗和长寿命的显示效果。
下面将详细介绍LM016L的结构和功能。
LM016L的结构包括控制器、液晶面板、背光源和接口电路。
控制器是模块的主要部分,负责接收来自主控芯片或者微控制器的命令和数据,并将其转换成电压信号以控制液晶面板的显示。
液晶面板是显示信息的主要组件,由数个液晶单元组成,每个液晶单元可以显示一个字符。
背光源是用来照亮液晶面板的光源,使得显示内容清晰可见。
接口电路是将模块与外部电路连接的部分,一般包括控制引脚、数据引脚和电源引脚等。
1.显示内容:LM016L可以显示16×2个字符,每个字符由一个5×8点阵组成,可以显示数字、字母、符号等内容。
用户可以通过控制模块的接口,向液晶面板发送要显示的内容,从而实现信息的显示。
2.显示模式:LM016L支持多种显示模式,包括光标显示、滚动显示、闪烁显示等。
用户可以通过发送相应的控制命令,调整显示模式以满足不同的显示需求。
3.液晶对比度调整:LM016L可以通过调整控制器的对比度设置,来改变液晶显示的对比度,使得显示内容更清晰、更易读。
4.背光控制:LM016L的背光源可以通过控制器的背光控制引脚进行控制,用户可以通过控制背光源的亮度和开关状态,来调整显示的亮度和适应不同环境的显示需求。
5.低功耗设计:LM016L采用了低功耗的设计方案,具有较低的工作电流和电压,能够有效减少功耗,延长模块的使用寿命。
6.广泛应用:LM016L适用于各种电子设备和嵌入式系统,包括计算机、仪器仪表、家用电器、通信设备等领域。
用户可以根据自己的需求,将LM016L模块集成到自己的产品中,实现信息的显示和交互功能。
总的来说,LM016L是一种功能强大、结构简单的液晶模块,适用于各种应用场景。
LM016L说明
LM016L是一种16字符x 2行LCD显示器模块,可以帮助用户快速和方便地实现小型嵌入式系统中的文本信息显示。
本文将介绍LM016L的主要特性、电气参数、应用和使用注意事项。
主要特性
•显示格式:16字符x 2行
•显示颜色:液晶显示,黑底白字
•显示内容:ASCII字符集,包括数字、字母、符号等
•寿命:预计使用寿命超过100,000小时
电气参数
LM016L的电气参数如下:
•电源电压:5V
•工作温度:-20℃~70℃
•電流消耗:2mA
•接口类型:并行接口
应用
LM016L广泛应用于嵌入式系统中的温度计、电压表、计数器等需要实时显示文本信息的场合。
它在工业、教育、电子游戏等领域应用广泛。
使用注意事项
在使用LM016L之前,请先了解以下注意事项。
1.请保证LM016L的电源电压为5V,否则可能会对模块造成损害。
2.在连接LM016L之前,请务必对接口进行正确的编号,确保每个引
脚正确连接。
3.在使用LM016L的时候,要避免用力触碰或摔落模块,以免导致模
块损坏。
4.如果不是专业技术人员,请勿直接对LM016L进行拆卸和维护,以
免造成损坏或危险。
以上就是LM016L的说明文档,希望可以对用户使用这款模块有所帮助。
如果您在使用LM016L时有任何疑问或遇到问题,可以查看产品手册或与厂家联系。
基于Proteus的A t mega48单片机仿真1602)(1602)液晶LM016L(三、ATmega48驱动LM016L(鹰击长空,longsky2007@)★注:网上资料,仅供学习和参考★:仿真环境:1、仿真环境Proteus Pro7.4sp3ICC AVR 6.31a2、电路原理图外接1M晶振,熔丝位CLKDIV8无分频外接RC复位电路LM016L液晶3、程序参照刘海成《AVR单片机原理及测控工程应用:基于ATmega48/ATmega16》P1044、注意事项LM016L液晶资料:见/datasheet-pdf/pdf/146552/HITACHI/LM016L.htmlLM016L与1602区别:第一,忙标志的问题,仿真中LM016L的那一位为0是忙,实际中YJD1602A那一位为1是忙,仿真中也很好处理:while(LCD_Data_Pin&0x80)//asm("nop");return(LCD_Data_Pin);第二,使能EN的问题,仿真中LM016L是下降沿使能,实际中YJD1602A是上升沿使能,仿真中可以在宏定义这里更改:#define EN_Low LCD_Select_Port&=~(1<<LCD_EN)#define EN_High LCD_Select_Port|=(1<<LCD_EN)见/bbs/bbs_content.jsp?bbs_sn=3344211&bbs_page_no=6&bbs_id=1037/*main.c版本:ICC AVR6.25C,外接晶振1.00MHz, ATmega48驱动1602液晶*/#include<iom48v.h>#include"delay_me.h"#include"LCD1602.h"//#pragma data:codeconst unsigned char SMC1602[]={"-1602-"}; const unsigned char hello[]={"Can_I_help_you_?"}; //#pragma data:datavoid main(void){LCD1602_init();Delay_ms(5);LCD_write_string(5,0,SMC1602);LCD_write_string(0,1,hello);LCD_read_data();while(1);}/*delay_me.h,fosc=1MHz*/#ifndef_DELAY_ME_H_#define_DELAY_ME_H_void Delay_ms(unsigned int Time) {unsigned char n;while(Time>0){for(n=1;n<187;n++){//NOP();asm("nop");}Time--;}}void Delay_us(unsigned int Time2) {while(Time2>0){//NOP();asm("nop");Time2--;}}#endif/*LCD1602.h,fosc=1MHz*/#include"delay_me.h"/*a.数据、命令选择(RS)PB1*/#define RS_0PORTB&=~(1<<PB1)#define RS_1PORTB|=(1<<PB1)/*b.读写选择(RW)PB0*/#define RW_0PORTB&=~(1<<PB0)#define RW_1PORTB|=(1<<PB0)/*c.使能信号(E)PB2,下降沿使能*/#define EN_Low PORTB&=~(1<<PB2)#define EN_High PORTB|=(1<<PB2)//-------------------------------------------读状态--------------------------------------------------unsigned char LCD_read_status(void){DDRD=0x00;RS_0;RW_1;EN_High;//下降沿使能Delay_us(20);EN_Low;while(PIND&0x80)//PD7为高表示不忙return(PIND);}//-------------------------------------------读数据--------------------------------------------------unsigned char LCD_read_data(void){RS_1;RW_1;EN_High;Delay_us(20);EN_Low;DDRD=0x00;return(PIND);}//-------------------------------------------写指令--------------------------------------------------void LCD_write_com(unsigned char com,unsigned char BuysC){if(BuysC)LCD_read_status();DDRD=0xFF;RS_0;RW_0;PORTD=com;//d.8位数据由PD输出EN_High;Delay_us(20);EN_Low;}//-------------------------------------------写数据--------------------------------------------------void LCD_write_data(unsigned char data){LCD_read_status();DDRD=0xFF;RS_1;RW_0;PORTD=data;EN_High;Delay_us(200);EN_Low;}/*显示屏清空显示*/void LCD_clear(void){LCD_write_com(0x01,1);Delay_ms(5);}void LCD_write_char(unsigned char x,unsigned char y,unsigned char data);//-----------------------------------按指定位置显示一串字符------------------------------------------void LCD_write_string(unsigned char x,unsigned char y,const unsigned char*s){unsigned char Listlength=0;y&=0x01;x&=0x0F;while(s[Listlength]>0x20){if(x<=0x0F){LCD_write_char(x,y,s[Listlength]);Listlength++;x++;}}}//-----------------------------------按指定位置显示一个字符------------------------------------------void LCD_write_char(unsigned char x,unsigned char y,unsigned char data){y&=0x01;x&=0x0F;if(y)x|=0x40;x|=0x80;LCD_write_com(x,0);LCD_write_data(data);}/*显示屏初始化函数*/void LCD1602_init(void){DDRD=0xFF;/*I/O口方向设置*/PORTD=0x00;DDRB|=(1<<PB0)|(1<<PB1)|(1<<PB2);Delay_ms(15);LCD_write_com(0x38,0);/*显示模式设置:8位总线,双行显示,5×7点阵*/ Delay_ms(5);LCD_write_com(0x38,0);Delay_ms(5);LCD_write_com(0x38,0);Delay_ms(5);LCD_write_com(0x38,1);LCD_write_com(0x08,1);/*显示关闭*/LCD_write_com(0x01,1);/*显示清屏*/LCD_write_com(0x06,1);/*显示光标移动设置*/Delay_ms(5);LCD_write_com(0x0C,1);/*显示开及光标设置*/LCD_write_com(0x80,1);//起始位置:行1列1}。
LCD12864-LCD1602-LM0161中⽂资料价格相差40元12864LCD液晶显⽰屏中⽂资料1./WR:输⼊引脚,数据写引脚,低电平有效。
2./RD:输⼊引脚,数据读引脚,低电平有效。
3./CE:⽚选引脚,低电平有效。
4.C/D:指令数据通道。
1为指令通道,0为数据通道。
5./RST:复位信号,低电平有效。
6.DB0~DB7:数据线。
7.FS:字体选择,FS=1选8*6点阵,FS=0选8*8点阵。
8.FG:边框地,⽤于防静电。
9.Vss:数字地。
10。
Vdd:逻辑电源5V。
11.V0:对⽐度调节。
12.Vee:液晶驱动电源。
以上为pg12864引脚功能⼀、概述带中⽂字库的128X64是⼀种具有4位/8位并⾏、2线或3线串⾏多种接⼝⽅式,内部含有国标⼀级、⼆级简体中⽂字库的点阵图形液晶显⽰模块;其显⽰分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利⽤该模块灵活的接⼝⽅式和简单、⽅便的操作指令,可构成全中⽂⼈机交互图形界⾯。
可以显⽰8×4⾏16×16点阵的汉字. 也可完成图形显⽰.低电压低功耗是其⼜⼀显著特点。
由该模块构成的液晶显⽰⽅案与同类型的图形点阵液晶显⽰模块相⽐,不论硬件电路结构或显⽰程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
⼆、基本特性(1)低电源电压(VDD:+3.0--+5.5V)(2)显⽰分辨率:128×64点(3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)(4)内置 128个16×8点阵字符(5)2MHZ时钟频率(6)显⽰⽅式:STN、半透、正显(7)驱动⽅式:1/32DUTY,1/5BIAS(8)视⾓⽅向:6点(9)背光⽅式:侧部⾼亮⽩⾊LED,功耗仅为普通LED的1/5—1/10(10)通讯⽅式:串⾏、并⼝可选(11)内置DC-DC转换电路,⽆需外加负压(12)⽆需⽚选信号,简化软件设计(13)⼯作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃三、模块接⼝说明管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对⽐度(亮度)调整4 RS(CS)H/L RS=“H”,表⽰DB7——DB0为显⽰数据RS=“L”,表⽰DB7——DB0为指令数据5 R/W(SID) H/LR/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线9 DB2 H/L 三态数据线10 DB3 H/L 三态数据线11 DB4 H/L 三态数据线12 DB5 H/L 三态数据线13 DB6 H/L 三态数据线14 DB7 H/L 三态数据线15 PSB H/L H:8位或4位并⼝⽅式,L:串⼝⽅式(见注释1)16 NC - 空脚17 /RESET H/L 复位端,低电平有效(见注释2)18 VOUT - LCD驱动电压输出端19 A VDD 背光源正端(+5V)(见注释3)20 K VSS 背光源负端(见注释3)*注释1:如在实际应⽤中仅使⽤串⼝通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”⽤焊锡短接。
#include < reg51.h >#include < intrins.h >#define uchar unsigned char#define uint unsigned intsbit DQ = P2^7 ; //定义DS18B20端口DQvoid reset(); //DS18B20复位函数void write_byte(uchar val); //DS18B20写命令函数uchar read_byte(void); //DS18B20读1字节函数void read_temp(); //温度读取函数void work_temp(); //温度数据处理函数sbit BEEP=P2^5 ; //蜂鸣器驱动线bit presence ;sbit LCD_RS = P3^5 ;sbit LCD_RW = P3^6 ;sbit LCD_EN = P3^7 ;uchar code cdis1[ ] = {" SETTEMP: 50.C "} ;uchar code cdis2[ ] = {" TESTTEMP: . C "} ;uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;uchar code cdis4[ ] = {" PLEASE CHECK "} ;unsigned char data temp_data[2] = {0x00,0x00} ;unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;unsigned char code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;void beep() ;unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;/*******************************************************************/void delay1(int ms){unsigned char y ;while(ms--){for(y = 0 ; y<250 ; y++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;}}}/******************************************************************/ /*检查LCD忙状态*//*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/ /******************************************************************/bit lcd_busy(){bit result ;LCD_RS = 0 ;LCD_RW = 1 ;LCD_EN = 1 ;delayNOP() ;result = (bit)(P1&0x80) ;LCD_EN = 0 ;return(result) ;}/*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*//*******************************************************************/void lcd_wcmd(uchar cmd){while(lcd_busy()) ;LCD_RS = 0 ;LCD_RW = 0 ;LCD_EN = 0 ;_nop_() ;_nop_() ;P1 = cmd ;delayNOP() ;LCD_EN = 1 ;delayNOP() ;LCD_EN = 0 ;}/*******************************************************************//*写显示数据到LCD *//*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*//*******************************************************************/void lcd_wdat(uchar dat){while(lcd_busy()) ;LCD_RS = 1 ;LCD_RW = 0 ;LCD_EN = 0 ;P1 = dat ;delayNOP() ;LCD_EN = 1 ;delayNOP() ;LCD_EN = 0 ;}/* LCD初始化设定*//*******************************************************************/void lcd_init(){delay1(15) ;lcd_wcmd(0x01) ; //清除LCD的显示内容lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x38) ;delay1(5) ;lcd_wcmd(0x0c) ; //显示开,关光标delay1(5) ;lcd_wcmd(0x06) ; //移动光标delay1(5) ;lcd_wcmd(0x01) ; //清除LCD的显示内容delay1(5) ;}/* 设定显示位置*//*******************************************************************/void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量}/*自定义字符写入CGRAM *//*******************************************************************/void writetab(){unsigned char i ;lcd_wcmd(0x40) ; //写CGRAMfor (i = 0 ; i< 8 ; i++)lcd_wdat(mytab[ i ]) ;}/*******************************************************************/void Delay(unsigned int num){while( --num ) ;}/*初始化ds1820 *//*******************************************************************/Init_DS18B20(void){DQ = 1 ; //DQ复位Delay(8) ; //稍做延时DQ = 0 ; //单片机将DQ拉低Delay(90) ; //精确延时大于480usDQ = 1 ; //拉高总线Delay(8) ;presence = DQ ; //如果=0则初始化成功=1则初始化失败Delay(100) ;DQ = 1 ;return(presence) ; //返回信号,0=presence,1= no presence}/* 读一个字节*//*******************************************************************/ReadOneChar(void){unsigned char i = 0 ;unsigned char dat = 0 ;for (i = 8 ; i > 0 ; i--){DQ = 0 ; // 给脉冲信号dat >>= 1 ;DQ = 1 ; // 给脉冲信号if(DQ)dat |= 0x80 ;Delay(4) ;}return (dat) ;}/*******************************************************************/WriteOneChar(unsigned char dat){unsigned char i = 0 ;for (i = 8 ; i > 0 ; i--){DQ = 0 ;DQ = dat&0x01 ;Delay(5) ;DQ = 1 ;dat>>=1 ;}}/* 读取温度*//*******************************************************************/Read_Temperature(void){Init_DS18B20() ;WriteOneChar(0xCC) ; // 跳过读序号列号的操作WriteOneChar(0x44) ; // 启动温度转换Init_DS18B20() ;WriteOneChar(0xCC) ; //跳过读序号列号的操作WriteOneChar(0xBE) ; //读取温度寄存器temp_data[0] = ReadOneChar() ; //温度低8位temp_data[1] = ReadOneChar() ; //温度高8位}/* 数据转换与温度显示*//*******************************************************************/Disp_Temperature(){display[4]=temp_data[0]&0x0f ;display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;display[3]=display[4]/100+0x30 ;display[1]=display[4]%100 ;display[2]=display[1]/10+0x30 ;display[1]=display[1]%10+0x30 ;if(display[3]==0x30) //高位为0,不显示{display[3]=0x20 ;if(display[2]==0x30) //次高位为0,不显示display[2]=0x20 ;}lcd_pos(0x48) ;lcd_wdat(display[3]) ; //百位数显示lcd_pos(0x49) ;lcd_wdat(display[2]) ; //十位数显示lcd_pos(0x4a) ;lcd_wdat(display[1]) ; //个位数显示lcd_pos(0x4c) ;lcd_wdat(display[0]) ; //小数位数显示}/*******************************************************************//* 蜂鸣器响一声*//*******************************************************************/void beep(){unsigned char y ;for (y=0 ;y<100 ;y++){Delay(60) ;BEEP=!BEEP ; //BEEP取反}BEEP=1 ; //关闭蜂鸣器Delay(40000) ;}/* DS18B20 OK 显示菜单*/ /*******************************************************************/void Ok_Menu (){uchar m ;lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(cdis1[m] != '\0'){ //显示字符lcd_wdat(cdis1[m]) ;m++ ;}lcd_pos(0x40) ; //设置显示位置为第二行的第1个字符m = 0 ;while(cdis2[m] != '\0'){lcd_wdat(cdis2[m]) ; //显示字符m++ ;}writetab() ; //自定义字符写入CGRAMdelay1(5) ;lcd_pos(0x4d) ;lcd_wdat(0x00) ; //显示自定义字符}/* DS18B20 ERROR 显示菜单*//*******************************************************************/void Error_Menu (){uchar m ;lcd_init() ; //初始化LCDlcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;while(cdis3[m] != '\0'){ //显示字符lcd_wdat(cdis3[m]) ;m++ ;}lcd_pos(0x40) ; //设置显示位置为第二行的第1个字符m = 0 ;while(cdis4[m] != '\0'){lcd_wdat(cdis4[m]) ; //显示字符m++ ;}}/* 主函数*//************************************/void main(){Ok_Menu () ;do{Read_Temperature() ;Disp_Temperature() ;}while(!presence) ;Error_Menu () ;do {Init_DS18B20() ;beep() ;}while(presence) ;}。