lcd1602液晶封装函数
LCD1602
![LCD1602](https://img.taocdn.com/s3/m/01f69fcaa1c7aa00b52acb8a.png)
PORT_A=0xff;
rs=0;
rw=1;
en=1;
PORT=0x00; //把8155A口由输出状态转为输入状态
while(PORT_A & 0x80);
PORT=0x03; //把8155A口由输入状态转为输出状态
}
void wri(uchar dat)//写指令
**********************************************************/
#include <INIF.h>
uchar qq;
bit flag=0;
/********************************************************
}
//LCD1602的初始化函数
void lcd1602init( )
{
wri(0x01);/*清除显示*/
wri(0x38);/*设置8位格式,2行,5*7*/
wri(0x06);/*设定输入方式,增量不移位*/
wri(0x0c);/*整体显示,关光标,不闪烁*/
}
//LCD1602的清屏函数
void lcd_clear()
{
wri( 0x01 );
}
/****************************************d lcd_string( uchar *p, uchar flag )
* 参数说明:无参数 *
* 3.函数名称:void lcd_string( uchar *p, uchar flag ) *
* 函数功能:1602LCD显示函数 *
LCD1602库函数
![LCD1602库函数](https://img.taocdn.com/s3/m/ef6f665e777f5acfa1c7aa00b52acfc789eb9fdb.png)
LCD1602库函数LCD1602 库函数This library allows an Arduino board to control LiquidCrystal displays (LCDs) based on the Hitachi HD44780 (or a compatible) chipset, which is found on most text-basedLCDs. The library works with in either 4- or 8-bit mode (i.e. using 4 or 8 data lines in addition to the rs, enable, and, optionally, the rw control lines).Function详细解释LiquidCrystal() LiquidCrystal类的构造函数,初始化LCDDescription描述Creates a variable of type LiquidCrystal. The display can be controlled using 4 or 8 data lines. If the former, omit the pin numbers for d0 to d3 and leave those lines unconnected. The RW pin can be tied to ground instead of connected to a pin on the Arduino; if so, omit it from this function's parameters.Syntax语法LiquidCrystal(rs, enable, d4, d5, d6, d7)LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)Parameters参数rs: the number of the Arduino pin that is connected to the RS pin on the LCD 数据/命令选择引脚rw: the number of the Arduino pin that is connected to the RW pin on the LCD (optional) 读写引脚enable: the number of the Arduino pin that is connected to the enable pin on the LCD 使能引脚d0, d1, d2, d3, d4, d5, d6, d7: the numbers of the Arduino pins that are connected to the corresponding data pins on the LCD. d0, d1, d2, and d3 are optional; if omitted, the LCD will be controlled using only the four data lines (d4, d5, d6, d7). 数据引脚,8个或4个Example⽰例#include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);void setup(){lcd.begin(16,1);lcd.print("hello, world!");}begin() 初始化LCD的界⾯,设置LCD尺⼨DescriptionInitializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display. begin()needs to be called before any other LCD library commands.Syntaxlcd.begin(cols, rows)Parameterslcd: a variable of type LiquidCrystalcols: the number of columns that the display has 列数rows: the number of rows that the display has ⾏数clear() 清屏,光标在左上⾓DescriptionClears the LCD screen and positions the cursor in the upper-left corner.Syntaxlcd.clear()Parameterslcd: a variable of type LiquidCrystalhome() 光标复位,定位于左上⾓DescriptionPositions the cursor in the upper-left of the LCD. That is, use that location in outputting subsequent text to the display. To also clear the display, use the function instead.Syntaxlcd.home()Parameterslcd: a variable of type LiquidCrystalsetCursor() 设置光标位置DescriptionPosition the LCD cursor; that is, set the location at which subsequent text written to the LCD will be displayed.Syntaxlcd.setCursor(col, row)Parameterslcd: a variable of type LiquidCrystalcol: the column at which to position the cursor (with 0 being the first column)row: the row at which to position the cursor (with 0 being the first row)write() 写⼀个字符到LCDWrite a character to the LCD.Syntaxlcd.write(data)Parameterslcd: a variable of type LiquidCrystaldata: the character to write to the displayReturnsbytewrite() will return the number of bytes written, though reading that number is optionalExample#include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);void setup(){Serial.begin(9600);}void loop(){if (Serial.available()){lcd.write(Serial.read());}}print() ⽂本输出到LCDDescriptionPrints text to the LCD.Syntaxlcd.print(data)lcd.print(data, BASE) 输出格式可以是⼆进制,⼗进制,⼋进制,⼗六进制Parameterslcd: a variable of type LiquidCrystaldata: the data to print (char, byte, int, long, or string)BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16).Returnsbyteprint() will return the number of bytes written, though reading that number is optionalExample#include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);void setup(){cursor() 显⽰光标DescriptionDisplay the LCD cursor: an underscore (line) at the position to which the next character will be written.Syntaxlcd.cursor()Parameterslcd: a variable of type LiquidCrystalnoCursor() 隐藏光标DescriptionHides the LCD cursor.Syntaxlcd.noCursor()Parameterslcd: a variable of type LiquidCrystalblink() 光标闪烁DescriptionDisplay the blinking LCD cursor. If used in combination with the () function, the result will depend on the particular display. Syntaxlcd.blink()Parameterslcd: a variable of type LiquidCrystalnoBlink() 光标不闪烁DescriptionTurns off the blinking LCD cursor.Syntaxlcd.noBlink()Parameterslcd: a variable of type LiquidCrystaldisplay() 开启LCD显⽰功能,DescriptionParameterslcd: a variable of type LiquidCrystalnoDisplay() 关闭LCD显⽰功能,但之前的显⽰内容不丢失DescriptionTurns off the LCD display, without losing the text currently shown on it.Syntaxlcd.noDisplay()Parameterslcd: a variable of type LiquidCrystalscrollDisplayLeft() 向左滚屏,LCD显⽰的内容往左移⼀格DescriptionScrolls the contents of the display (text and cursor) one space to the left.Syntaxlcd.scrollDisplayLeft()Parameterslcd: a variable of type LiquidCrystalscrollDisplayRight() 向右滚屏,显⽰的内容往右移⼀格DescriptionScrolls the contents of the display (text and cursor) one space to the right.Syntaxlcd.scrollDisplayRight()Parameterslcd: a variable of type LiquidCrystalautoscroll() ⾃动滚屏,输⼊时光标在⼀个固定位置,字符⾃动移动DescriptionTurns on automatic scrolling of the LCD. This causes each character output to the display to push previous characters over by one space. If the current text direction is left-to-right (the default), the display scrolls to the left; if the current direction is right-to-left, the display scrolls to the right. This has the effect of outputting each new character to the same location on the LCD.Syntaxlcd.autoscroll()Parameterslcd: a variable of type LiquidCrystalTurns off automatic scrolling of the LCD.Syntaxlcd.noAutoscroll()Parameterslcd: a variable of type LiquidCrystalleftToRight() ⽂本显⽰时的移动⽅向是从左往右,默认⽅向DescriptionSet the direction for text written to the LCD to left-to-right, the default. This means that subsequent characters written to the display will go from left to right, but does not affect previously-output text.Syntaxlcd.leftToRight()Parameterslcd: a variable of type LiquidCrystalrightToLeft() ⽂本显⽰时的移动⽅向是从右往左DescriptionSet the direction for text written to the LCD to right-to-left (the default is left-to-right). This means that subsequent characters written to the display will go from right to left, but does not affect previously-output text.Syntaxlcd.rightToLeft()Parameterslcd: a variable of type LiquidCrystalcreateChar() 建⽴⼀个⾃定义的图形字符DescriptionCreate a custom character (glyph) for use on the LCD. Up to eight characters of 5x8 pixels are supported (numbered 0 to 7). The appearance of each custom character is specified by an array of eight bytes, one for each row. The five least significant bits of each byte determine the pixels in that row. To display a custom character on the screen, () its number.NB : When referencing custom character "0", if it is not in a variable, you need to cast it as a byte, otherwise the compiler throws an error. See the example below.Syntaxlcd.createChar(num, data)Parameterslcd: a variable of type LiquidCrystalnum: which character to create (0 to 7)data: the character's pixel dataLiquidCrystal lcd(12, 11, 5, 4, 3, 2); byte smiley[8] = //微笑图案{B11011,B00000,B01010,B00000,B00000,B10001,B10001,B01110,};void setup(){lcd.createChar(0, smiley);lcd.begin(16, 2);lcd.write(byte(0));}void loop() {}。
15LCD1602液晶的基本驱动函数
![15LCD1602液晶的基本驱动函数](https://img.taocdn.com/s3/m/ba0aa24e767f5acfa1c7cd18.png)
51单片机进阶篇---LCD1602基本驱动函数本文作者:Cepark更新时间:2010/08/05作者博客:在本次课中我们将介绍LCD1602液晶的使用。
LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。
1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符(英文字符,不是汉字)。
这个就是LCD1602的全部来由。
液晶显示的使用广泛,现在LCD的价格已经很便宜了,被广泛的应用的各种显示场合。
下面是LCD1602的实物图。
接下来进入LCD1602使用的重点:操作时序。
操作时序永远使用是任何一片IC芯片的最主要的内容。
一个芯片的所有使用细节都会在它的官方器件手册上包含。
所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上有用的内容提取,掌握。
介于中国目前的芯片设计能力有限,所以大部分的器件都是主要外国几个IC巨头比如TI、AT、MAXIM这些公司生产的,器件资料自然也是英文的多,所以,英文的基础要在阅读这些数据手册时得到提高哦。
即便有中文翻译版本,还是建议看英文原版,看不懂时不妨再参考中文版,这样比较利于提高。
我们首先来看1602的引脚定义,1602的引脚是很整齐的SIP单列直插封装,所以器件手册只给出了引脚的功能数据表:我们只需要关注以下几个管脚:3脚:VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。
4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作。
命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。
值得一提的是,LCD1602的数据是8位的。
5脚:R/W,读写选择端。
当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。
lcd1602液晶显示函数流程设计
![lcd1602液晶显示函数流程设计](https://img.taocdn.com/s3/m/4f0bca2b178884868762caaedd3383c4bb4cb434.png)
lcd1602液晶显示函数流程设计下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在嵌入式系统中,液晶显示模块是一种常见的输出设备,而LCD1602液晶是其中一种常用的型号。
LCD1602液晶显示完全资料
![LCD1602液晶显示完全资料](https://img.taocdn.com/s3/m/e3ae773c31126edb6f1a10b1.png)
LCD1602液晶显示完全资料0x18 光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。
5.读写时序:时序图1602手册中有,这里不引用了。
时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。
二、LCD1602程序编写流程:LCD1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:1.定义LCD1602管脚,包括RS,R/W,E。
这里定义是指这些管脚分别接在单片机哪些I/O口上。
现举例如下:sbit EN=P3^4;sbit RS=P3^5;sbit RW=P3^6;2.显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:设置显示方式延时清理显示缓存设置显示模式通常推荐的初始化过程如下:延时15ms写指令38H延时5ms写指令38H延时5ms写指令38H延时5ms注:以上写38H指令可以看情况省略1~2步(以上都不检测忙信号)(以下都要检测忙信号)写指令38H写指令08H 关闭显示写指令01H 显示清屏写指令06H 光标移动设置写指令0cH 显示开及光标设置3.设置显示地址(写显示字符的位置)。
4.写显示字符的数据。
三、LCD1602各子程序模块及主程序编写:现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。
1.头文件,宏定义,定义管脚等:#include<reg52.h>#include <string.h>#define uchar unsigned char#define uint unsigned intsbit EN=P3^4;sbit RS=P3^5;sbit RW=P3^6;uchar code table0[]={"QQ:545699636"}; //此条语句为显示字符串时定义的字符串数组2.LCD1602基本初始化子程序:void LCD1602(){EN=0;RS=1;RW=1;P0=0xff; //这里P0为与LCD D0~D7相连的I/O口}3.读忙子程序:void read_busy(){P0=0xff;RS=0;RW=1;EN=1;while(P0&0x80); //P0和10000000相与,D7位若不为0,停在此处EN=0; //若为0跳出进入下一步;这条语句的作用就是检测D7位} //若忙在此等待,不忙跳出读忙子程序执行读写指令4.写指令写数据子程序:void write(uchar i,bit j){read_busy();P0=i; //其中i=0,写指令;i=1,写数据;RS=j;RW=0;EN=1;EN=0;}5.延时子程序:void delay(uint c) //功能为提供初始化等其他子程序中的延时1xc MS{uint a,b;for(a=0;a<c;a++)for(b=0;b<120;b++);}6.LCD1602初始化子程序:void init() //完全按照要求初始化流程来,中间省略了一步写指令38H{delay(15);write(0x38,0);delay(5);write(0x38,0);write(0x08,0);write(0x01,0);write(0x06,0);write(0x0c,0);}7.显示单个字符子程序:void display_lcd_byte(uchar y,uchar x,uchar z) //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码{if(y) //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句{x+=0x40; //第二行起始地址加上列数为字符显示地址}x+=0x80; //设置数据指针位置write(x,0);write(z,1); //写入数据}8.显示字符串子程序:void display_lcd_text(uchar y,uchar x,uchartable[]) //Y,X同上字符显示,table[]字符串数组{uchar z=0;uchar t;t=strlen(table)+x; // 求得字符串长度加上起始列位置 while(x<t) //功能为LCD显示到字符串最后一个字符,防止字符串{ //没有16个字符,从而不够位产生乱码; display_lcd_byte(y,x,table[z]); //逐位显示数组内字符x++;z++;}}9.主程序:主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。
LCD1602函数集
![LCD1602函数集](https://img.taocdn.com/s3/m/ae499b9e85868762caaedd3383c4bb4cf7ecb716.png)
LCD1602函数集LCD1602A函数集在这废话就不讲了,要知道LCD1602怎么使⽤,⾃⼰看数据⼿册去,在此本⼈仅写出⼀些函数集,望学习单⽚机的童鞋参考参考,在这⾥,我就以51单⽚机为例,对了,晶振为12M或11.0592M的情况下的参考程序,主要是注意延时问题,晶振不同相同的延时函数,延时不同,好了废话完毕;下⾯进⼊程序讲解:在这,我总结出了⼏个函数如下:延时函数static void delay01(unsigned char x)//延时函数{ unsigned char i,j;for(i=0;ifor(j=0;j<12;j++);}//LCD写指令函数:功能:向LCD写⼊⽤户指令;传⼊参数为CMD.void WR_CMD(unsigned char CMD)//LCD写命令函数{RS=0;RW=0;EAB=1;delay01(100);TPORT=CMD;delay01(100);EAB=0;}//LCD写数据函数:功能:向LCD写⼊⽤户指令;传⼊参数为DA T.void WR_DAT(unsigned char DA T)//LCD写数据函数{RS=1;RW=0;EAB=1;delay01(100);TPORT=DAT;delay01(100);EAB=0;}//LCD初始化函数:功能:初始化LCD;顺便说下,必须初始化成功后才可以使⽤液晶显⽰void LCD_init(void)//LCD初始化函数{WR_CMD(0x30);WR_CMD(0X30);WR_CMD(0x30);WR_CMD(0x38);WR_CMD(0x08);WR_CMD(0x01);WR_CMD(0x06);WR_CMD(0x0e);}//LCD在指定的位置写数据函数:功能:吧想要显⽰的数据输出到显⽰屏void WR_DATA(unsigned char line,unsigned char location,unsigned char DA TA)//LCD定位写数据函数{ static unsigned char i;delay01(100);if(line==0){ i=0x80+location;WR_CMD(i);}else{ i=0x80+0x40+location;WR_CMD(i);}delay01(100);WR_DAT(DA TA);i=0;}//指定在第⼏⾏第⼏列开始写数据:功能:指定从第⼏⾏第⼏列开始写数据void WR_str(unsigned char linex,unsigned char locationy,unsigned char *stri)//LCD定位写字符{ static unsigned char i; delay01(100);if(linex==0){ i=0x80+locationy;}else{ i=0x80+0x40+locationy;}delay01(100);while(*stri){WR_CMD(i);WR_DAT(*stri);i++;stri++;}i=0;}//创建⾃定义字符函数:功能:把点阵数据写⼊CGROM中void WRTE_SELF(unsigned char *s,unsigned char datcount)//s是字符表格⼀维数组;datcount 是字符个数写⼊⾃建字符最多8个{ unsigned char loc,i=0;loc=0x40;while(++i!=8*datcount){WR_CMD(loc);WR_DAT(*s);s++;loc++;}}//在指定的位置写你定义的第⼏个字符函数:功能:在你指定的位置显⽰出你的⾃定义字符//Selfaddr为第⼏个字数值为0~7,void WR_SELSTRING(unsigned char loca,unsigned char selfaddr,unsigned char lines)//在指定的位置写⾃定义字符{ unsigned char lao=0x80;if(lines==1){lao=loca+lao+0x40;}else if(lines==0){lao+=loca;}WR_CMD(lao);WR_DAT(selfaddr);}//在LCD写⼊字符串函数:与上⾯指定在第⼏⾏第⼏列开始写数据不同的是,该函数是从//每⾏的第⼀个位置开始显⽰字符void WR_STRINGS(unsigned char *str,unsigned char lin ){unsigned char l=0x80;if(lin==1){l=l+0x40;}else{l=0x80;}WR_CMD(l);while(*str){WR_DAT(*str);str++;l++;}}以上函数经本⼈验证绝对可以使⽤。
LCD1602说明
![LCD1602说明](https://img.taocdn.com/s3/m/74caf91afad6195f312ba646.png)
LCD1602是个两行显示,且每行能显示16个字符的液晶显示器其控制指令有如下组成控制指令--------设置指令(初始化设置LCD的工作状态,比如是两行显示,还是单行显示)以上就是在LCD显示器上的地址映射数据-----------就是要在对应位置上显示的数据其指令对应指令1 清显示,指令码01H,光标复位到地址00H位置。
指令2 光标复位,光标返回到地址00H。
指令3 光标和显示模式设置。
I/D:光标移动方向,1为右移动,0为左移动。
S:屏幕上所有文字是否左移或者右移。
1表示有效,0表示无效。
指令4 显示开关控制。
D:控制整体显示的开与关,1为开显示,0为关显示。
C:控制光标的开与关,1表示有光标,0表示无光标。
B:控制光标是否闪烁,1闪烁,0不闪烁。
指令5 光标或显示移位。
S/C:1时移动显示的文字。
0时移动光标。
指令6 功能设置命令。
DL:1时为4位总线,0时为8位总线。
N:0时为单行显示,1时为双行显示。
F:0时显示5x7的点阵字符,1时显示5x10的点阵字符。
指令7 字符发生器RAM地址设置。
指令8 DDRAM地址设置。
指令9 读忙信号和光标地址。
BF:为忙标志位,1时表示忙,此时模块不能接收命令或数据,如果为0表示不忙。
指令10 写数据。
指令11 读数据。
管脚说明RS 数据寄存器与指令寄存器的选择端口,RS=0,为指令寄存器,RS=1,为数据寄存器RW 为读写操作,RW=1,为读,RW=0,为写E 使能端,,下降沿使能LCD作用D0---D7 8位数据端口LCD的操作初始化LCD----数据操作----返回总的说来,就是先初始化LCD,在写入地址指令,在写入显示数据初始化LCD(设置LCD的工作状态,其指令如上面框图)参考程序如下(delay为延时,lcd_wcmd为写指令函数)void lcd_init(){ lcd_wcmd(0x38);delay(300);lcd_wcmd(0x0c);delay(300);lcd_wcmd(0x06);delay(300);lcd_wcmd(0x01);delay(300);}初始化完后就可以进行对LCD的操作,但是不管是写指令还是写数据,先要判断其状态(因为它是个慢显示)忙碌判断参考程序如下(da为八位数据口)bit lcd_bz(){ bit result;rs = 0;//选择指令寄存器rw = 1;//读操作ep = 1;delay(3);result = (bit)(da & 0x80);//读取忙碌标志ep = 0;//模拟一个下降沿,使能LCDreturn result;//返回忙碌标志}在写数据之前要先写入地址指令参考程序如下void lcd_wcmd(unsigned char cmd){while(lcd_bz()); //判断LCD忙碌rs = 0;//指令寄存器rw = 0;//写操作ep = 0;delay(3);da= cmd;//写入指令delay(3);ep = 1;delay(3);ep = 0;//模拟一个下降沿,使能LCD}注意初始化那写指令也是用的这个程序,但是区别在于写地址指令时候,cmd变量的最高位要恒为1 比如写03H这个地址指令,则cmd的值要为0x83,这样才会正确地显示地址指令写完后,就可以写入数据参考程序如下(dat为写入的数据)void lcd_wdat(unsigned char dat){while(lcd_bz()); //判断LCD忙碌rs = 1;//数据寄存器rw = 0;//写操作ep = 0;da = dat;//写入数据delay(3);ep = 1;delay(3);ep = 0;//模拟一个下降沿,使能LCD}注意 1. 初始化LCD只需在主程序中执行一次就可。
51单片机LCD1602液晶显示的接法
![51单片机LCD1602液晶显示的接法](https://img.taocdn.com/s3/m/7832b1d00b4c2e3f56276316.png)
51单片机综合学习之1602字符型液晶显示篇在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
基于51和PROTEUS的液晶显示屏LCD1602的使用
![基于51和PROTEUS的液晶显示屏LCD1602的使用](https://img.taocdn.com/s3/m/8cd8f630eefdc8d377ee3207.png)
液晶显示屏1602的使用一、L CD1602显示字符‘A’斧头帮2010-05-10Proteus仿真图C程序:/******************************************实例81:用LCD显示字符'A'*******************************************/#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
LCD1602液晶显示实验要点
![LCD1602液晶显示实验要点](https://img.taocdn.com/s3/m/8a6fce869fc3d5bbfd0a79563c1ec5da50e2d6fb.png)
LCD1602液晶显示实验要点一、液晶显示原理液晶显示屏是一种电场调制显示器件,通过激励电场使液晶分子的排列状态发生变化,从而控制光的透过程度,实现图像显示。
液晶显示器的基本结构是两块平行的玻璃基板夹层液晶,上面由导电涂层构成的液晶单元。
在液晶单元上方有一块透明电极玻璃,根据控制信号排列液晶分子,形成图像。
二、LCD1602液晶显示屏三、实验器材1. Arduino开发板2.LCD1602液晶显示屏3.面包板4.杜邦线等四、实验步骤1. 接线:将LCD1602液晶显示屏与Arduino开发板通过杜邦线连接。
将VCC接到5V电源、GND接到地、SCL接到A5口、SDA接到A4口。
2. 编写程序:打开Arduino开发环境,编写程序代码,实现液晶显示功能。
3. 初始化:使用LiquidCrystal库,编写代码进行液晶显示屏的初始化设置。
4. 显示字符:通过调用lcd.print(函数,将指定字符显示在液晶屏上。
5. 光标控制:调用lcd.setCursor(函数,设置光标所在位置。
6. 清屏:调用lcd.clear(函数,清除液晶屏上的字符。
7. 控制显示:通过调用lcd.noDisplay(和lcd.Display(函数,控制液晶屏的显示和关闭。
8. 自定义字符:通过调用lcd.createChar(函数,创建自定义字符并显示在液晶屏上。
五、实验注意事项1.液晶显示屏的类型应与编程语言库文件匹配。
2.接线时要确保正确连接,以免损坏LCD1602显示屏。
3.初始化液晶显示屏时,要设置液晶屏的列数和行数。
4.控制液晶显示屏时,要注意操作指令的执行顺序,以免出现误操作。
六、实验结果展示通过编写相应的程序,可以实现在液晶显示屏上显示指定字符、自定义字符,以及控制光标的移动和屏幕的清除等功能。
实验成功时,可以在液晶显示屏上看到所期望的字符和效果。
七、实验应用液晶显示屏广泛应用于各种电子设备和仪器仪表,如电子体温计、电子秤、数码相册、电视机等。
LCD1602_CGRAM
![LCD1602_CGRAM](https://img.taocdn.com/s3/m/aa2943abd1f34693daef3ecc.png)
1602字符液晶(2009-04-29 15:12:37)标签:杂谈1602字符液晶在实际的产品中运用的也比较多了,最近发现自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给像我一样的初学者带来一点指导,少走一点弯路。
呵呵呵简单的总结所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的00H地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM 的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。
LCD1602液晶显示总结
![LCD1602液晶显示总结](https://img.taocdn.com/s3/m/d07649ee04a1b0717fd5ddaf.png)
LCD1602液晶显示应用总结一、1602里面存储器有三种:CGROM、CGRAM、DDRAMCGROM保存了厂家生产时固化在LCM中的点阵型显示数据;CGRAM是留给用户自己定义点阵型显示数据的;DDRAM则是和显示屏的内容对应的。
1602内部的DDRAM有80字节,而显示屏上只有2行×16列,共32个字符,所以两者不完全一一对应。
默认情况下,显示屏上第一行的内容对应DDRAM中80H到8FH的内容,第二行的内容对应DDRAM 中C0H到CFH的内容。
DDRAM中90H到A7H、D0H到E7H 的内容是不显示在显示屏上的,但是在滚动屏幕的情况下,这些内容就可能被滚动显示出来了。
注:这里列举的DDRAM的地址准确来说应该是DDRAM地址+80H 之后的值,因为在向数据总线写数据的时候,命令字的最高位总是为1。
DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下:DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。
同样LCD1602共有80个字节的显存,即DDRAM。
但LCD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来。
这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。
为了在液晶屏幕上显示字符,就把字符代码送入DDRAM。
例如,如果想在屏幕左上角显示字符‘A’,那么就把字符‘A’的字符代码41H写入DDRAM的00H 地址处即可。
至于怎么写入,后面会有说明。
那么为什么把字符代码写入DDRAM,就可以在相应位置显示这个代码的字符呢?我们知道,LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据,看看下面的这个图就明白了:A的字模上图的左边就是字符‘A’的字模数据,右边就是将左边数据用“○”代表0,用“■”代表 1。
1602的常用函数
![1602的常用函数](https://img.taocdn.com/s3/m/a9512ab7960590c69ec37682.png)
delay_n40us(10);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
3
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
{ //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do //用了延时的方法,延时还是非常好用的。我试了一下,用
{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
LCD_RS=0; //要用200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
_nop_();
EN_CLR;
}
//********写指令函数************
void LCD_write_command(uchar dat)
{
delay_n40us(10);
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_DB=dat;
delay_n40us(10);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
DataPort= Data;
_nop_();
EN_CLR;
}
//********写数据函数*************
void LCD_write_data(uchar dat)
{
delay_n40us(10);
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_1602库函数
![LCD_1602库函数](https://img.taocdn.com/s3/m/e3a7320b6c85ec3a87c2c598.png)
/********************************************************************/ #include "stm32f10x.h"#include "LCD1602.h"#ifndef LCD1602_STM32_C#define LCD1602_STM32_C#endif/********************************************************************* *名称:LCD_busy()*功能:读LCD忙碌状态,直到LCD1602不忙为止*入口参数:无*出口参数:无符号字节类型,返回0表示LCD已经操作完毕,空闲。
*说明:一般在写入新命令或数据之前用while(LCD_busy())语句等待LCD就绪*********************************************************************/uint8_t LCD_busy(void){LCD_RS_0;delay_nus(1);LCD_RW_1;delay_nus(1);do{LCD_EN_0;delay_nus(200);LCD_EN_1;delay_nus(200);}while(GPIOD->IDR & 0x8000);//GPIO->IDR &10000000一直等到STA7为0即最高位表示允许进行读写操作LCD_EN_0;return (uint8_t)0;}/**********************************************************************功能:一直等待到LCD1602空闲*********************************************************************/void Wait_Leisure(void){LCD_busy();}/**********************************************************************功能:写入LCD初始化时的命令,不可以检测忙状态*********************************************************************/void LCD_WriteInitcmd(uchar cmd){LCD_RS_0;//delay_nus(1);LCD_RW_0;//delay_nus(1);DATAOUT = cmd;LCD_EN_0;//delay_nus(300);LCD_EN_1;delay_nus(300);LCD_EN_0;delay_nms(2);}/**********************************************************************名称:LCD_Writecmd()*功能:写指令到LCD1602,指令数据占一个字节*入口参数:cmd:待写入的指令*出口参数:无*********************************************************************/void LCD_Writecmd(uchar cmd){//while(LCD_busy()); //空闲的话返回值为0LCD_RS_0; //对同一个寄存器的两次写入,中间延时一会//delay_nus(1);LCD_RW_0;//delay_nus(1);LCD_EN_0;//delay_nus(300);//产生脉冲DATAOUT = cmd;LCD_EN_1;delay_nus(300);//必要的延时LCD_EN_0; //下降沿,LCD1602开始工作delay_nus(50);}/**********************************************************************名称:LCD_Writedata()*功能:写一字节数据到LCD1602*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符*出口参数:无*********************************************************************/void LCD_Writedata(uchar dat){//while(LCD_busy());//等待LCD1602空闲LCD_RS_1;//delay_nus(1);LCD_RW_0;//delay_nus(1);DATAOUT = dat;LCD_EN_1; //先拉高delay_nus(300); //很重要的延时,经调试,延时300us以上才可以LCD_EN_0; //下降沿,开始写入有效数据delay_nus(50);}/**********************************************************************名称:LCD_pos()*功能:设定显示位置*入口参数:pos:显示位置,值的范围如下:* 0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)* 0x40----------------0x4f 0x50-------0x67 第二行*出口参数:无*********************************************************************/void LCD_pos(uchar pos){LCD_Writecmd(pos | 0x80);}/**********************************************************************名称:LCD_Setpos()*功能:根据习惯设定显示位置*入口参数:row:行,row=1表示第一行,row=2表示第二行* col:列,0~15,用于指定显示的列,范围可以是0~40*出口参数:无*********************************************************************/void LCD_Setpos(uchar row,uchar col){if(row==1) LCD_Writecmd(col | 0x80); // 1000 0000第一行else LCD_Writecmd(col | 0xC0); //1100 0000 第二行}/**********************************************************************功能:显示一个字符*入口:ch:待显示的字符*********************************************************************/void LCD_DispChar(char ch){LCD_Writedata(ch);}/**********************************************************************功能:在指定位置显示一个字符*入口:row:行1或2 col:列,0~15* ch:待显示的字符*********************************************************************/void LCD_Setpos_DispChar(uchar row,uchar col,charch){LCD_Setpos(row,col);LCD_Writedata(ch);}/**********************************************************************名称:LCD_DispString()*功能:使LCD1602显示一个字符串,显示位置需提前设定*入口参数:str[]:待显示的字符串*出口参数:无*********************************************************************/void LCD_DispString(char str[]){uchar i=0;while(str[i] != '\0'){LCD_Writedata(str[i]);++i;}}/**********************************************************************名称:LCD_Setpos_DispString()*功能:使LCD1602从指定位置开始显示一个字符串*入口参数:row:显示行,1或2* col:显示列,0~15 (0~40)* str[]:待显示的字符串*出口参数:无*说明:指定位置是显示的初始位置,第一个字符显示的位置*********************************************************************/void LCD_Setpos_DispString(uchar row,ucharcol,char str[]){LCD_Setpos(row,col);LCD_DispString(str);}/**********************************************************************名称:LCD_Dispnum()*功能:显示一个不超过8位的整数,显示位置需提前设置*入口参数:num:待显示的整数,不超过8位*出口参数:无*********************************************************************/void LCD_Dispnum(uint32_t num){uint i=0,j,k=0,wei,q;char str[9];if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;str[k++]=num/q +'0';num %= q;}str[k] = '\0'; //添加字符串结束标志LCD_DispString(str);//显示字符串}/**********************************************************************名称:LCD_Setpos_Dispnum()*功能:在指定位置显示一个不超过8位的整数*入口参数:num:待显示的整数,不超过8位*出口参数:无*********************************************************************/void LCD_Setpos_Dispnum(uchar row,ucharcol,uint32_t num){LCD_Setpos(row,col);LCD_Dispnum(num);}/**********************************************************************名称:LCD_DispDecimal()*功能:显示一个有效位不超过8位的浮点数,显示位置需要提前设定*入口参数:num:待显示的浮点数放大后得到的整数,不超过8位* dot:小数点的位数*出口参数:无*********************************************************************/void LCD_DispDecimal(uint32_t num,uchar dot){uint i=0,j,k=0,wei,q;char str[10];if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;str[k++]=num/q +'0';num %= q;}str[k] = '\0'; //添加字符串结束标志for(i=8;i>0;i--){ if((str[i]>='0')&&(str[i]<='9')) break;}str[i+2]='\0'; //添加字符串结束符for(j=0;j<dot;j++,i--)//小数点后各位依次右移,准备插入{str[i+1]=str[i];}str[i+1]='.'; //插入小数点LCD_DispString(str);//显示浮点小数}/**********************************************************************名称:LCD_Setpos_DispDecimal()*功能:在指定位置显示一个有效位不超过8位的浮点数*入口参数:row:待显示的行1,2* col:待显示的列0~15* num:待显示的浮点数放大10的整数倍后得到的整数,不超过8位* dot:小数点的位数*出口参数:无*********************************************************************/void LCD_Setpos_DispDecimal(uchar row,ucharcol,uint32_t num,uchar dot){LCD_Setpos(row,col);LCD_DispDecimal(num,dot);}/**********************************************************************名称:LCD_DispDateTime()*功能:显示日历,显示日期与时间*入口参数:year:年,可以是任意值* month:月,1~12* day:日,1~31* hour:时,1~24 或1~12* min:分,0~59* sec:秒,0~59*出口参数:无*说明:使用前必须先宏定义USE_LCD_DISP_DATE,在包含文件之前定义有效*显示格式:Date:yyyy-mm-dd ** Time:hh:mm:ss **********************************************************************/void LCD_DispDateTime(uint32_t year,ucharmonth,uchar day,uchar hour,uchar min,uchar sec){LCD_Setpos(1,0);LCD_DispString("Date:");LCD_Dispnum((uint32_t)year);LCD_DispChar('-');LCD_Dispnum((uint32_t)month);LCD_DispChar('-');LCD_Dispnum((uint32_t)day);LCD_Setpos(1,15);LCD_DispChar('*'); //第一行结束符显示LCD_Setpos(2,0);LCD_DispString("Time:");LCD_Dispnum((uint32_t)hour);LCD_DispChar(':');LCD_Dispnum((uint32_t)min);LCD_DispChar(':');LCD_Dispnum((uint32_t)sec);LCD_Setpos(2,15);LCD_DispChar('*'); //第二行结束符显示}/**********************************************************************名称:LCD_DispStopWatch()*功能:显示秒表,显示时,分,秒,10毫秒,精确到10ms*入口参数:hour:时,1~24 或1~12* min:分,0~59* sec:秒,0~59* tenms:10ms计数值,如3表示30ms*出口参数:无*显示格式:Current Time: ** hh:mm:ss:tt **********************************************************************/void LCD_DispStopWatch(uchar hour,uchar min,ucharsec,uchar tenms){LCD_Setpos(1,0);LCD_DispString("Current Time:");LCD_Setpos(1,15);LCD_DispChar('*'); //第一行结束符显示LCD_Setpos(2,2);LCD_Dispnum((uint32_t)hour);LCD_DispChar(':');LCD_Dispnum((uint32_t)min);LCD_DispChar(':');LCD_Dispnum((uint32_t)sec);LCD_DispChar(':');LCD_Dispnum((uint32_t)tenms);LCD_Setpos(2,15);LCD_DispChar('*'); //第二行结束符显示}/************************************************* *********************名称:LCD_DispFreq()*功能:显示频率计,动态自动调整频率显示*入口参数:freq:可以显示8位整数表示的频率值,频率范围1Hz~99MHz*出口参数:无*说明:入口的频率值单位是Hz,显示函数自动选择合适的显示方式* freq>=1000000显示成6位小数的MHz* else freq>=1000 显示成3位小数的KHz* else freq>=0 默认显示单位是Hz (三个区间互斥)*********************************************************************/void LCD_DispFreq(uint32_t freq){LCD_Setpos(1,0);LCD_DispString("Current Freq:");LCD_Setpos(2,1); //显示位置if(freq>=1000000){LCD_DispDecimal(freq,6);LCD_DispString("MHz");}else if(freq>=1000){LCD_DispDecimal(freq,3);LCD_DispString("KHz");}else { LCD_Dispnum(freq);LCD_DispString("Hz");}LCD_Setpos(2,14);LCD_DispString("OK");}//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(){LCD_Writecmd(0x18);}//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void){LCD_Writecmd(0x1C);}//清屏,清除显示void LCD_CLEAR(void){LCD_Writecmd(0x01);}//使光标还回原点位置void LCD_Return(void){LCD_Writecmd(0x02);}//关显示void LCD_Close(void){LCD_Writecmd(0x08);}//开显示void LCD_Open(void){LCD_Writecmd(0x0C);}/**********************************************************************名称:LCD_FlickerChar()*功能:使指定位置字符闪烁,不显示光标*入口参数:row:行1,2* col:列0~15*出口参数:无*说明:写命令0x0D不显示光标的闪烁,写命令0x0F是显示光标的闪烁* 一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C*********************************************************************/void LCD_FlickerChar(uchar row,uchar col){LCD_Writecmd(0x0D);LCD_Setpos(row,col);}//关闭字符闪烁void LCD_CloseFlicker(void){LCD_Writecmd(0x0C);}//屏幕秒闪烁一次void LCD_FlickerScreen(void){LCD_Writecmd(0x08);//关显示delay_nms(500);LCD_Writecmd(0x0C);//开显示delay_nms(500);}/**********************************************************************名称:LCD_Init()*功能:初始化LCD1602*入口参数:无*出口参数:无*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us* 0x0C:开显示,关光标40us* 0x08:关显示,关光标40us* 0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右* 0x0F:字符闪烁,开光标* 0x06:写完数据自动右移光标,普通情形,从左向右显示40us* 0x04:写完数据自动左移光标,可以从右向左显示40us* 0x01:清除显示内容,即清屏 1.64ms* 0x02:使光标还回起始位置 1.64ms* 0x18:屏幕上所有字符同时左移一格,适合滚动显示40us* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示40us*********************************************************************/void LCD_Init(void){delay_nms(150); //延时15msLCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据0011 1000delay_nms(10);LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(5);LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(5);LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(5);//LCD_WriteInitcmd(0x0c);LCD_WriteInitcmd(0x08); //先关显示,后开显示1000 0000//delay_nms(5);//LCD_WriteInitcmd(0x01); //清除LCD的显示内容0000 0001//delay_nms(6);LCD_WriteInitcmd(0x06); //自动右移光标,0x04为左移光标0000 0110//delay_nms(5);LCD_WriteInitcmd(0x0c); //显示开,关光标;0x08为关显示0000 1100delay_nms(5);LCD_WriteInitcmd(0x01);}//#endif //防止多次编译。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
![基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))](https://img.taocdn.com/s3/m/f0717ed10408763231126edb6f1aff00bed570b4.png)
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
LCD1602液晶封装尺寸
![LCD1602液晶封装尺寸](https://img.taocdn.com/s3/m/2f529cf19e3143323968932e.png)
CONTROL LSI
■ MECHANICAL DATA (Nominal dimensions)0
V0 Vss
VR
Vdd (GND)
4
SEGMENT DRIVER X 1
Vdd-Vo:LCD driving voltage VR:10K-20K
Pin No. Symbol Lever Function module size------------------- 80.0Wx36.0Hx10.0D mm 1 Vss 0V Effective display area--------------- 64.5Wx13.8H mm 2 Vdd +5V Character size(5X8 dots) ----------- 3.0Wx5.5H mm 3 Vo Character pitch ---------------------- 3.52WX5.88H mm L:Instruction code input 4 RS H/L H:Data input Dot size----------------------------- 0.52Wx0.60H mm Weight ------------------------------------- about 40 g H/L H:Data read 5 R/W ■ ABSOLUTE MAXIMUM RATINGS min max H/L L:Data write Power supply for logic(Vdd-Vss) ----------- 0 7.0V 6 E H.H-L Enable singnal power supply for LCD drive(Vdd-V0) ---- 0 5.0V 7 D0 H/L Input voltage(Vi) -------------------------- Vss VddV 8 D1 H/L Operating temperature(Ta)------------(-10℃-- +60℃) 9 D2 H/L Stroage temperature(Tstg)-----------(-15℃-- +65℃) 10 D3 H/L Data bus line * ■ ELECTRICAL CHARACTERISTICS 11 D4 H/L Ta=25℃, Vdd=5.0V+0.5V 12 D5 H/L Input 'high' voltage(ViH) ---------------- 3.5Vmin. 13 D6 H/L Input 'low' voltage(ViL) ----------------- 0.55Vmax. 14 D7 H/L Output 'high' voltage(VoH)(-IoH+0.1mA) -- 3.75Vmin. 15 5V Power supply for LED LED+ Output 'low' voltage(VoL)(IoL=1.2mA) ----- 1.0Vmax. 16 0V Power supply for LED LEDPower supply current(Idd)(Vdd=5.0V) --- 2.0mAmax. * In case of 4 bits instruction,data is transferred Drive method ---------------------- 1/16Duty , 1/5bias. by twice using only 4 buses of D4-D7,and D0-D3 are not used, first operation is higher order 4 bits and second ■ BLOCK DIAGRAM is lower 4 bits of 8 bits ,but in case of 8 bits instruction, data is transferred by data by data bus of D0-D7. DB0 ■ POWER SUPPLY LCD PANEL