LM016L的显示程序

合集下载

LCD1602和LM016l中文资料

LCD1602和LM016l中文资料

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字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

LM016L说明

LM016L说明

硬件原理图我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、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结构及功能

液晶模块简介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和LM016l中文资料)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为LCD1602和LM016l中文资料的全部内容。

LCD1602中文资料在日常生活中,我们对液晶显示器并不陌生.液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用晶液显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多.(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

一、液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

Proteus实现ARM7+LM016L液晶模块的仿真

Proteus实现ARM7+LM016L液晶模块的仿真

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结构及功能

LM016L结构及功能LM016L是一种16×2字符液晶模块,具有一系列的功能和特性,适用于各种电子设备和嵌入式系统。

这种显示模块采用了液晶显示技术,可以实现高清晰度、低功耗和长寿命的显示效果。

下面将详细介绍LM016L的结构和功能。

LM016L的结构包括控制器、液晶面板、背光源和接口电路。

控制器是模块的主要部分,负责接收来自主控芯片或者微控制器的命令和数据,并将其转换成电压信号以控制液晶面板的显示。

液晶面板是显示信息的主要组件,由数个液晶单元组成,每个液晶单元可以显示一个字符。

背光源是用来照亮液晶面板的光源,使得显示内容清晰可见。

接口电路是将模块与外部电路连接的部分,一般包括控制引脚、数据引脚和电源引脚等。

1.显示内容:LM016L可以显示16×2个字符,每个字符由一个5×8点阵组成,可以显示数字、字母、符号等内容。

用户可以通过控制模块的接口,向液晶面板发送要显示的内容,从而实现信息的显示。

2.显示模式:LM016L支持多种显示模式,包括光标显示、滚动显示、闪烁显示等。

用户可以通过发送相应的控制命令,调整显示模式以满足不同的显示需求。

3.液晶对比度调整:LM016L可以通过调整控制器的对比度设置,来改变液晶显示的对比度,使得显示内容更清晰、更易读。

4.背光控制:LM016L的背光源可以通过控制器的背光控制引脚进行控制,用户可以通过控制背光源的亮度和开关状态,来调整显示的亮度和适应不同环境的显示需求。

5.低功耗设计:LM016L采用了低功耗的设计方案,具有较低的工作电流和电压,能够有效减少功耗,延长模块的使用寿命。

6.广泛应用:LM016L适用于各种电子设备和嵌入式系统,包括计算机、仪器仪表、家用电器、通信设备等领域。

用户可以根据自己的需求,将LM016L模块集成到自己的产品中,实现信息的显示和交互功能。

总的来说,LM016L是一种功能强大、结构简单的液晶模块,适用于各种应用场景。

LCD1602 LM016l程序和使用说明

LCD1602 LM016l程序和使用说明
线段的显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:
显示质量高
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
数字式接口
液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
10.8.3.1硬件原理图
1602液晶显示模块可以和单片机AT89C51直接接口,电路如图10-60所示。
图10-60硬件原理图
10.8.3.2程序流程图

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时有任何疑问或遇到问题,可以查看产品手册或与厂家联系。

三、ATmega48驱动LM016L(1602)液晶

三、ATmega48驱动LM016L(1602)液晶

基于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中文资料

LCD12864-LCD1602-LM0161中文资料

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”⽤焊锡短接。

LCD汇编程序示例(lm016l)

LCD汇编程序示例(lm016l)

;----------逐字依次输入方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_AddMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1MOV COM,#80H ;设置DDRAM地址00HLCALL PR1MOV DPTR,#TABMOV R2,#12 ;显示前8位MOV R3,#00WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINSJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------逐字依次输入,两行显示方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#06H ;设置显示方式LCALL PR1MOV COM,#0fH ;清屏LCALL PR1MOV COM,#01H ;设置输入方式LCALL PR1MOV COM,#80H ;设置DDRAM地址00HLCALL PR1MOV DPTR,#TABMOV R2,#07 ;显示前8位MOV R3,#00HWRIN: MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINMOV COM,#0C0H ;设置DDRAM地址40HLCALL PR1MOV R2,#05H ;显示后4位WRIN1: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRIN1SJMP MAIN;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------光标左移输入,两行显示方式-----------COM EQU 20HDAT EQU 21HCW_ADD EQU 8000HCR_ADD EQU 8200HDW_ADD EQU 8100HDR_ADD EQU 8300HORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1MOV COM,#04H ;设置输入方式,减方式LCALL PR1MOV COM,#0C5H ;设置DDRAM地址44HLCALL PR1MOV DPTR,#TABMOV R2,#05 ;显示后5位MOV R3,#11 ;从第12位开始显示WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYDEC R3DJNZ R2,WRINMOV COM,#87H ;设置DDRAM地址07HLCALL PR1MOV R2,#08H ;显示前8位WRIN1: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYDEC R3DJNZ R2,WRIN1SJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------左滚动输入方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0EH ;设置显示方式LCALL PR1MOV COM,#07H ;设置输入方式,画面滚动LCALL PR1MOV COM,#8cH ;设置DDRAM地址07HLCALL PR1MOV DPTR,#TABMOV R2,#012 ;显示前7位MOV R3,#00WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINSJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;CursorDB 57H,72H,69H,74H,65H ;writeEND;----------自定义字符库方式-----------COM EQU 20HDAT EQU 21HCW_ADD EQU 8000HCR_ADD EQU 8200HDW_ADD EQU 8100HDR_ADD EQU 8300HORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1LCALL CG_WRITE ;调用自定义的字库子程序MOV COM,#80H ;设置DDRAM地址LCALL PR1MOV DPTR ,#TABDY ;设置字表首地址MOV R2,#08MOV R3,#00HLOOP1:MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2INC R3DJNZ R2,LOOP1MOV COM,#0C0H ;设置DDRAM地址LCALL PR1MOV R2,#08HLOOP2:MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2INC R3DJNZ R2,LOOP2SJMP $CG_WRITE:MOV COM,#40H ;编字库LCALL PR1MOV R2,#64MOV R3,#00HMOV DPTR,#CGTAB ;设置字模数据的首地址CG1:MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,CG1RET;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETCGTAB:DB 08H,0FH,12H,0FH,0AH,1FH,02H,02H ;"年"代码=00H DB 0FH,09H,0FH,09H,0FH,09H,11H,00H ;"月"代码=01H DB 1FH,11H,11H,1FH,11H,11H,1FH,00H ;"日"代码=02HDB 11H,0AH,04H,1FH,04H,1FH,04H,00H ;"$"代码=03HDB 0EH,00H,1FH,0AH,0AH,0AH,13H,00H ;"元"代码=04H DB 18H,18H,07H,08H,08H,08H,07H,00H ;"摄氏度"代码=05H DB 04H,0AH,15H,04H,04H,04H,04H,00H ;"↑"代码=06HDB 17H,15H,15H,15H,15H,15H,17H,00H ;"10"代码=07H TABDY:DB 57H,46H,48H,30H,36H,00H,34H,01H ;WFH06年4月DB 33H,02H,54H,3DH,32H,33H,05H,06H ;3日T=23摄氏度↑END。

LM016L说明

LM016L说明

硬件原理图我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、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结构及功能

LM016L结构及功能一、LM016L的结构1.显示屏:LM016L采用LCD(液晶显示器)技术,显示屏上有16x2排的字符空间用于显示字符和图形。

3.数据线:数据线用于将控制器与其他电路板或者处理器连接起来。

数据线一般包括数据引脚、时钟引脚、使能引脚等,用于传输数据和控制信号。

4.背光源:为了方便在低光环境下观察显示内容,LM016L在屏幕背后配备了背光源。

一般使用LED作为背光源。

5.控制按钮:LM016L上通常有几个控制按钮,用于控制显示屏的亮度、对比度、显示方向等参数。

二、LM016L的功能1.显示字符和图形:LM016L可以显示16x2的字符空间,每个字符由5x8个像素组成。

它可以显示ASCII字符集的大部分字符,如字母、数字和标点符号。

还可以通过一些特殊字符来显示简单的图形。

2.高对比度:LM016L采用液晶显示技术,具有高对比度的特点。

使得在不同光照条件下,用户都能清晰地看到屏幕上的内容。

3.多种显示模式:LM016L支持多种显示模式,如滚动显示模式、闪烁显示模式、光标显示模式等。

这些模式可以通过外部指令控制,并可以根据需要进行切换。

4.显示内容的更新:LM016L通过控制器接收外部指令,并根据指令来更新屏幕上的内容。

可以通过控制器发送不同的指令来更新显示的字符、光标位置等。

5.低功耗设计:LM016L具有低功耗的设计,只需要很少的电流就能正常工作。

这有利于延长电池的使用寿命,并减少电能的浪费。

6.广泛的应用:LM016L可以广泛应用于各种电子设备,如数码相机、手机、电视、计算器、家电等。

它能够显示字符和图形,提供简洁明了的界面给用户,因此在各种电子产品中都有应用。

同时,由于其结构简单、易于控制和集成,所以非常适合嵌入式系统的开发和应用。

总结起来,LM016L是一款16x2字符液晶显示器模块,它具有显示字符和图形、高对比度、多种显示模式、显示内容的更新、低功耗设计和广泛的应用等功能。

(完整版)LM016L的结构及功能

(完整版)LM016L的结构及功能

(完整版)LM016L的结构及功能液晶模块简介LM016L的结构及功能LM016L液晶模块采⽤HD44780控制器,hd44780具有简单⽽功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L 与单⽚机MCU通讯可采⽤8位或4位并⾏传输两种⽅式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显⽰数RAM(DDRAM),字符发⽣器ROMA(CGOROM)字符发⽣器RAM(CGRAM),地址计数器RAM(AC)。

IR⽤于寄存指令码,只能写⼊不能读出,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但愿,LM016L 液晶模块的引脚功能如下表所⽰:引脚说明1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全⼀样,其中:引脚符号功能说明1 VSS ⼀般接地2 VDD 接电源(+5V)3 V0 液晶显⽰器对⽐度调整端,接正电源时对⽐度最弱,接地电源时对⽐度最⾼(对⽐度过⾼时会产⽣“⿁影”,使⽤时可以通过⼀个10K的电位器调整对⽐度)。

4 RS RS为寄存器选择,⾼电平1时选择数据寄存器、低电平0时选择指令寄存器。

基于51单片机的ds1302与LM016L液晶时钟设计

基于51单片机的ds1302与LM016L液晶时钟设计

基于51单片机的时钟设计一.基本功能利用AT89c51作为主控器与时钟芯片DS1302组成一个时钟系统,并由LM016L液晶显示。

二.硬件设计图1.总设计图1.单片机最小系统1.1选用AT89C51的引脚功能图2. AT89C51XTAL1:单芯片系统时钟的反向放大器输入端。

XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。

RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

1.2复位电路如图所示,当按下按键时,就能完成整个系统的复位,使得程序从新运行。

图3.复位电路1.3时钟电路时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

此电路采用12MHz的石英晶体。

图4.时钟电路2.时钟芯片部分2.1 DS1302引脚说明图.51)Vcc1:后备电源,VCC2:主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

2)X1、X2:振荡源,外接32.768kHz晶振。

3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供终止单字节或多字节数据的传送手段。

LCD1602 LM016l程序和使用说明

LCD1602 LM016l程序和使用说明
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出

读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出

表10-15:基本操作时序表
读写操作时序如图10-55和10-56所示:
图10-55读操作时序
图10-56写操作时序
10.8.2 1602字符型LCD简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#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) ;}。

相关文档
最新文档