LCD1602资料及单片机对其驱动
51单片机任意2个IO口驱动LCD1602

51单片机任意2个IO口驱动LCD1602相信大家对1602显示屏已经十分熟悉,驱动方式有8线制(需要11根线)和4线制(需要7根线),这里为大家推荐一种只需要2根线就能驱动1602的方法。
之前在网上见到Arduino通过IIC驱动1602的实例,本人完全不懂Arduino程序,看了一下驱动电路,发现PCF8574这个关键芯片,它就相当于一个桥梁,将IIC总线转换为8位准双向口。
思路1、单片机通过IIC与PCF8574进行通信。
首先写好IIC通信程序,网上到处都是IIC通信程序,很容易找。
PCF8574 的器件地址为40h,由于硬件地址引脚A0-A2可寻址8 个器件,所以器件地址并不唯一,具体说明大家去查查PCF8574芯片手册.2、单片机4线制驱动1602网上也有很多相关程序,我就不再多说。
4线制驱动方式需要7个IO口(RS、RW、E和4条数据线),而PCF8574提供了8位准双向口,所以管脚还有剩余。
3、IIC通信程序和1602的4线制驱动程序相结合4、51单片机任意2个IO口驱动1602成功!!!。
(我只是个业余爱好者,要是各位觉得太低端那就见谅了)驱动电路图效果图实物图Proteus仿真程序#include <reg52。
h>#include 〈intrins。
h〉sbit SCL = P3^0;sbit SDA = P3^1;bit ack;unsigned char LCD_data;unsigned char code digit[ ]={”0123456789"}; //定义字符数组显示数字//*****************延时************************void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i〈n;i++)_nop_();}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i,j;for (i=0;i<n;i++)for (j=0;j<1140;j++);}void nop4(){_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期}//***************************************void Start(){SDA=1;_nop_();SCL=1;nop4();SDA=0;nop4();SCL=0;_nop_();_nop_();}void Stop(){SDA=0;_nop_();SCL=0;nop4();//>4us后SCL跳变SCL=1;nop4();SDA=1;_nop_();_nop_();}//****************************************** void Write_A_Byte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt〈8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80) SDA=1; //判断发送位else SDA=0;_nop_();SCL=1; //置时钟线为高,通知被控器开始接收数据位 nop4();_nop_();SCL=0;}_nop_();_nop_();SDA=1; //8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;else ack=1; //判断是否接收到应答信号SCL=0;_nop_();_nop_();}bit Write_Random_Address_Byte(unsigned char add,unsigned char dat){Start(); //启动总线Write_A_Byte(add); //发送器件地址if(ack==0)return(0);Write_A_Byte(dat); //发送数据if(ack==0)return(0);Stop(); //结束总线return(1);}//********************液晶屏使能********************* void Enable_LCD_write(){LCD_data|=(1<<(3—1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1〈<(3-1));//E=0;Write_Random_Address_Byte(0x40,LCD_data);}//*************写命令****************************void LCD_write_command(unsigned char command){delay_nus(16);LCD_data&=~(1<<(1—1));//RS=0;LCD_data&=~(1<〈(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=command & 0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();command=command〈〈4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=command&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//*************写数据****************************void LCD_write_data(unsigned char value){delay_nus(16);LCD_data|=(1<〈(1-1));//RS=1;LCD_data&=~(1〈〈(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=value&0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();value=value〈〈4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=value&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//**********************设置显示位置*********************************void set_position(unsigned char x,unsigned char y){unsigned char position;if (y == 0)position = 0x80 + x;elseposition = 0xc0 + x;LCD_write_command(position);}//**********************显示字符串*****************************void display_string(unsigned char x,unsigned char y,unsigned char *s){set_position(x,y);while (*s){LCD_write_data(*s);s++;}}//*************液晶初始化****************************void LCD_init(void){LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);Enable_LCD_write();delay_nus(40);LCD_write_command(0x28); //4位显示!!!!!!!!!!!!!!!!!!LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(2);}void main(void){LCD_init();display_string(4,0,"imxuheng"); //显示一段文字display_string(2,1,”Hello Today!”); //显示一段文字while(1);}程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。
51单片机任意2个IO口驱动LCD1602

51单片机任意2个IO口驱动LCD1602相信大家对1602显示屏已经十分熟悉,驱动方式有8线制(需要11根线)和4线制(需要7根线),这里为大家推荐一种只需要2根线就能驱动1602的方法。
之前在网上见到Arduino通过IIC驱动1602的实例,本人完全不懂Arduino程序,看了一下驱动电路,发现PCF8574这个关键芯片,它就相当于一个桥梁,将IIC总线转换为8位准双向口。
思路1、单片机通过IIC与PCF8574进行通信。
首先写好IIC通信程序,网上到处都是IIC通信程序,很容易找。
PCF8574 的器件地址为40h,由于硬件地址引脚A0-A2可寻址8 个器件,所以器件地址并不唯一,具体说明大家去查查PCF8574芯片手册。
2、单片机4线制驱动1602网上也有很多相关程序,我就不再多说。
4线制驱动方式需要7个IO口(RS、RW、E 和4条数据线),而PCF8574提供了8位准双向口,所以管脚还有剩余。
3、IIC通信程序和1602的4线制驱动程序相结合4、51单片机任意2个IO口驱动1602成功!!!。
(我只是个业余爱好者,要是各位觉得太低端那就见谅了)驱动电路图效果图实物图Proteus仿真程序#include <reg52.h>#include <intrins.h>sbit SCL = P3^0;sbit SDA = P3^1;bit ack;unsigned char LCD_data;unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字//*****************延时************************void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)_nop_();}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i,j;for (i=0;i<n;i++)for (j=0;j<1140;j++);}void nop4(){_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期}//***************************************void Start(){SDA=1;_nop_();SCL=1;nop4();SDA=0;nop4();SCL=0;_nop_();_nop_();}void Stop(){SDA=0;_nop_();SCL=0;nop4();//>4us后SCL跳变SCL=1;nop4();SDA=1;_nop_();_nop_();}//******************************************void Write_A_Byte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80) SDA=1; //判断发送位else SDA=0;_nop_();SCL=1; //置时钟线为高,通知被控器开始接收数据位nop4();_nop_();SCL=0;}_nop_();_nop_();SDA=1; //8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;else ack=1; //判断是否接收到应答信号SCL=0;_nop_();_nop_();}bit Write_Random_Address_Byte(unsigned char add,unsigned char dat){Start(); //启动总线Write_A_Byte(add); //发送器件地址if(ack==0)return(0);Write_A_Byte(dat); //发送数据if(ack==0)return(0);Stop(); //结束总线return(1);}//********************液晶屏使能*********************void Enable_LCD_write(){LCD_data|=(1<<(3-1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1<<(3-1));//E=0;Write_Random_Address_Byte(0x40,LCD_data);}//*************写命令****************************void LCD_write_command(unsigned char command){delay_nus(16);LCD_data&=~(1<<(1-1));//RS=0;LCD_data&=~(1<<(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=command & 0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();command=command<<4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=command&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//*************写数据****************************void LCD_write_data(unsigned char value){delay_nus(16);LCD_data|=(1<<(1-1));//RS=1;LCD_data&=~(1<<(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=value&0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();value=value<<4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=value&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//**********************设置显示位置********************************* void set_position(unsigned char x,unsigned char y){unsigned char position;if (y == 0)position = 0x80 + x;elseposition = 0xc0 + x;LCD_write_command(position);}//**********************显示字符串*****************************void display_string(unsigned char x,unsigned char y,unsigned char *s){set_position(x,y);while (*s){LCD_write_data(*s);s++;}}//*************液晶初始化****************************void LCD_init(void){LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);Enable_LCD_write();delay_nus(40);LCD_write_command(0x28); //4位显示!!!!!!!!!!!!!!!!!!LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(2);}void main(void){LCD_init();display_string(4,0,"imxuheng"); //显示一段文字display_string(2,1,"Hello Today!"); //显示一段文字while(1);}程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。
液晶LCD1602的原理与应用单片机机械

液晶LCD1602的原理与应用单片机机械液晶(Liquid Crystal) 是一种有机液体,具有光学特性。
在没有电场作用下,液晶分子呈现无规则排列,无法透过光。
而当电场作用于液晶分子时,液晶分子会改变排列方向,使光能通过液晶层并显示出来。
LCD1602的液晶显示器由两个玻璃基板和夹在两基板之间的液晶层以及一系列对齐膜、电极、玻璃垫、色彩滤波器等组成。
液晶层上覆盖有很多个小孔,称为像素,每个像素对应一组液晶分子。
液晶分子的排列方式决定了是否透过光。
在工作时,液晶LCD1602上的字模存储器存储了一些常用的字符图案,单片机通过控制液晶控制器中的液晶驱动信号,对液晶层上的液晶分子施加不同的电场作用。
通过改变电场的方向和强度,液晶分子的排列方式也发生变化,从而改变液晶层的透光性,实现显示。
1.单片机应用:液晶LCD1602可以通过与单片机相连接,实现字符信息的显示。
单片机可以通过控制液晶控制器向液晶层施加不同的电场,以显示想要的字符,如温度、湿度、时间、日期等。
液晶LCD1602通常使用并行接口方式与单片机相连,需要通过读写信号、地址信号、数据信号等与单片机进行数据交互。
2.机械应用:液晶LCD1602还可以在机械领域中进行应用。
比如,可以将液晶LCD1602安装在机械设备上,通过显示不同的字符信息,监控和显示机械设备的运行状态,如电机的转速、压力、流量、温度等。
液晶LCD1602还可以与其他传感器相结合,实现对机械设备的控制和监测。
总结:液晶LCD1602是一种常用的字符型液晶模块。
通过对液晶层上的液晶分子施加电场,改变液晶分子的排列方式,实现字符信息的显示。
它在单片机和机械领域有广泛的应用,可以显示各种字符信息,并实现对机械设备的控制和监测。
LCD1602驱动编程(一)——LCD1602简介

LCD1602驱动编程(一)——LCD1602简介(一)基本概念1.液晶显示基本原理:(1)线段显示点阵图形式液晶由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)=FFH,……(00EH)=FFH,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
(2)字符显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
这样一来就组成某个字符。
但对内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
(3)汉字显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。
LCD1602中文资料程序和使用说明

LCD1602中文资料程序和使用说明一、硬件连接和初始化步骤:1.将LCD1602的16个引脚连接到MCU(单片机)的相应引脚上。
其中,VCC和GND分别接到电源正负极,VO接到可调电位器的中间引脚(用于调节背光亮度),RS、RW和E分别接到MCU的IO口上,D0-D7分别接到MCU的8个IO口上。
2.初始化LCD1602的操作包括设置显示模式、显示光标、输入模式等,具体步骤如下:a.将8位数据接口设置为并行输入模式,即设置D0-D3为输入模式。
b.设置显示模式为2行显示,5x8点阵字符,显示器不移动。
c.将显示光标设置为闪烁显示。
d.设置数据输入方式为向右移动,同时字符显示不移动。
e.清除显示内容,将光标位置设置为第一行第一列。
f.打开显示器和光标显示功能。
二、常用函数和操作方法:1. void lcd1602_init( 初始化LCD1602,包括上述硬件连接和初始化步骤。
2. void lcd1602_clear( 清除显示内容。
3. void lcd1602_setCursor(int row, int column) 设置光标位置,row表示行数(从0开始),column表示列数(从0开始)。
4. void lcd1602_print(String str) 在当前光标位置打印字符串str。
5. void lcd1602_shiftDisplayLeft( 将显示内容向左移动一位。
6. void lcd1602_shiftDisplayRight( 将显示内容向右移动一位。
7. void lcd1602_scrollDisplayLeft( 将整个显示内容向左滚动一格。
8. void lcd1602_scrollDisplayRight( 将整个显示内容向右滚动一格。
9. void lcd1602_noCursor( 关闭光标显示。
10. void lcd1602_cursor( 打开光标显示。
51单片机控制LCD1602液晶屏

51单片机控制LCD1602液晶屏本讲任务:了解液晶1602的相关知识,通过一个例程了解液晶1602的使用。
LCD1602简介:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。
它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。
例程:/****************LCD驱动基本代码 ******************单片机型号:STC89C52RC*开发环境:KEIL*名称:1602驱动基本代码*************************************************/#include<reg52.h>#include<intrins.h>#define LCD_Data P0#define Busy 0x80sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E=P2^5;unsigned char code welcome[]={"YOU ARE WELCOME"};unsigned char code mcu[]={"SL-51A"};void Delay5Ms(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); void Info_display(void);void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}void WriteCommandLCD(unsigned char WCLCD,BuysC) {if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}unsigned char ReadStatusLCD(void) {LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=1;while (LCD_Data & Busy);return(LCD_Data);}void LCDInit(void){LCD_Data=0;Delay5Ms();Delay5Ms();Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,0);Delay5Ms(); WriteCommandLCD(0x38,1);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;if(Y)X|=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;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}}void main(void){LCDInit();DisplayListChar(5,0,mcu);DisplayListChar(0,1,welcome);while(1){;}}。
单片机lcd1602工作原理

单片机lcd1602工作原理单片机LCD1602工作原理。
LCD1602是一种常见的字符型液晶显示屏,广泛应用于各种嵌入式系统中,如单片机开发、工业控制、仪器仪表等领域。
它具有显示内容丰富、功耗低、体积小等特点,因此备受青睐。
下面将介绍LCD1602的工作原理,帮助大家更好地理解和应用这种显示设备。
首先,LCD1602由液晶显示模块和驱动电路两部分组成。
液晶显示模块是由若干个液晶单元组成的矩阵结构,每个液晶单元可以显示一个字符。
而驱动电路则负责控制液晶单元的显示内容和显示位置。
在LCD1602中,液晶单元的显示原理是利用液晶分子在电场作用下的定向排列来改变光的透过性,从而实现显示效果。
当液晶单元受到电压作用时,液晶分子会发生定向排列,改变光的透过性,使得背光光源透过液晶单元时呈现出不同的亮暗状态,从而形成字符或图形的显示。
而驱动电路则是通过控制液晶单元的偏置电压和驱动信号来实现显示内容和显示位置的控制。
一般来说,液晶显示模块的每个像素点都需要对应的驱动电路来控制,而LCD1602的驱动电路则是将一些像素点组合在一起,形成字符显示。
在实际应用中,单片机通过与LCD1602连接的数据总线和控制总线来向LCD1602发送显示数据和控制指令,从而实现对LCD1602的控制。
单片机将需要显示的字符数据发送给LCD1602,同时发送控制指令来控制显示位置、显示模式等参数,从而实现对LCD1602的灵活控制。
总的来说,LCD1602的工作原理是通过液晶显示模块和驱动电路的协同工作,利用液晶分子的定向排列来改变光的透过性,从而实现字符显示。
而单片机则通过与LCD1602连接的数据总线和控制总线来实现对LCD1602的控制。
希望通过本文的介绍,能够帮助大家更好地理解和应用LCD1602,为嵌入式系统的开发和应用提供帮助。
单片机驱动LCD1602

LCD_DispStr(1,1,"LCD_Serial_test!");
利用传递参数x、y void LCD_DispStr(char x,char y,char *p) { 确定要显示的字符 if (x !=0x00 && y!=0x00) 串的位置 { switch(y) //数据指针=80h+地址码(0-27H,40-67H) { case 1:LCD_WriteCommand( 0x80 + x-1 );break; //第1行 case 2:LCD_WriteCommand( 0x80 + 0x40 + x-1 );break; //第2行 }
0 要写的数据内容 1 读出的数据内容
写命令时序和对应程序
void LCD_WriteCommand(unsigned char Com)
{ RS_SET_L; //命令总线 RW_SET_L; //写操作 P1=Com; _NOP(); //P1为8位二进制数据
_NOP();
E_SET_H;
// tsp1
LCD_WriteCommand(0x38); 显示模式设置
LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06);//显示光标移动设置 LCD_WriteCommand(0x0c); //开显示,不显示光标 LCD_WriteCommand(0x00); }
DelayNop(15); // tpw E_SET_L; //使能端下降沿沿写入
图中的延时是有最小限制的,相当 于1602的反应时间,所以单片机 引脚高低电平跳变不能太快
Delay(Delay_Count);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
技术支持:/bbs主 讲:wang1jinWang1jin 带您从零学单片机配套开发板:WJ-V4.0 AVR+51开发板第三章:LCD部分技术支持:/bbs主 讲:wang1jin单片机驱动LEDØLCD1602简介ØLCD1602硬件原理图ØLCD1602工作方式ØLCD1602时序及应用ØLCD1602显示应用流程Ø实例操作:在LCD1602上显示一个字符Ø实例操作:在LCD1602上显示一串字符Ø实例操作:在LCD1602上显示自定义图形这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里我们使用常用的2行16个字的LCD1602液晶模块来介绍它的编程方法。
技术支持:/bbs主讲:wang1jinLCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,其代码与标准的ASCII字符代码一致。
因此,我们只要写入显示字符的ASCII码即可,这种标准化的设计给使用带来很大的方便。
比如大写的英文字母“A”的ASCII代码是01000001B (41H),显示时单片机往液晶模块写入显示指令,模块就把地址41H中的点阵字符图形显示出来,我们就能在相应位置上看到字母“A”。
技术支持:/bbs主讲:wang1jin技术支持:/bbs主 讲:wang1jinLCD1602引脚图RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW 为读写信号线,高电平时进行读操作,低电平时进行写操作。
E 端为使能端。
D0~D7为8位双向数据线。
各厂家生产的LCD1602液晶屏显示器其引脚不一定相同,在使用的时候要注意查阅厂家提供的技术资料。
技术支持:/bbs主 讲:wang1jinLCD1602硬件应用图VCCVCC R491KLED26LED12P12VCCLCD1602U17LCD1602G N D 1V C C 2V L 3R S 4R W 5E 6D 17D 28D 39D 410D 511D 612D 713D 814B L +15B L -16R514.7R551K00P00P01P02P04P03P10P05P12P11P06P07这个是LCD1602的应用图.这是8位总线的工作方式.如果需要工作在4位总线的方式,则数据是从D4-D7输入到LCD 内部.把8位数据分成二次送入进D4-D7就可以.LCD 的3脚是对比度控制电阻,一般1K 就可以满足要求.如果大于4.7K 后,LCD 可能显示不清楚.在应用LCD1602的时候最好在背光上加一个限流电阻.技术支持:/bbs主 讲:wang1jinLCD1602操作时序技术支持:/bbs主 讲:wang1jinLCD1602指令表指令1:清显示,指令码01H,光标复位到地址00H 位置。
指令2:光标复位,光标返回到地址00H 。
指令3:光标和显示模式设置 I/D :光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:显示开关控制。
D :控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C :控制光标的开与关,高电平表示有光标,低电平表示无光标 B :控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C :高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL :高电平时为4位总线,低电平时为8位总线 N :低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM 地址设置。
指令8:DDRAM 地址设置。
指令9:读忙信号和光标地址 BF :为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
技术支持:/bbs主 讲:wang1jinLCD1602内部RAM地址LCD1602内部RAM 显示缓冲区地址的映射图,00~0F 、40~4F 分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM 地址写入要显示字符的ASCII 代码,就可以显示出来。
技术支持:/bbs主 讲:wang1jinLCD1602时序图我们关注的地方是中间的Valid Data 即有效数据区,在进行读或写,无非都是想进行数据的传送,在时序图中,为了看起来更清楚些,我们画上两根线,并标上A 、B 、C 、D 字样,注意这个位置各个引脚的状态,下面先来分析一下读操作时序。
技术支持:/bbs主 讲:wang1jin 在进行读操作的时候,RW 脚置于1,RS 脚则根据读的内容(状态或数据)置为1或0,注意看图中的A 和B 两根线,在A 位置,E 脚置为1,经过td 时间后,可以在数据口读到正确的数据,由于td 的时间极短(ns 级),我们的单片机操作一般是us 级,所以可以不考虑这个时间差,在将E 脚置为1之后,就可以紧跟着指令去读取数据,在读到数据后,再将E 脚置为0,经过THD2时间后,数据口上的数据失效。
Wang1jin 带您从零学单片机技术支持:/bbs主 讲:wang1jin LCD1602时序技术支持:/bbs主 讲:wang1jin在进行写操作的时候,RW 脚要置为0,RS 脚根据写的内容不同(指令或数据)置为1或0,同时,注意C 和D 两根线,我们在将E 脚置为1之前,要先将数据送到数据口上,然后,在C 位置,将E 脚置为1,经过tPW 延时后,再将E 脚置为0,在这个时间段内必须保证数据口上的数据稳定不变,为有效的数据。
同理,由于tPW 这些延时相对较短(ns 级),所以在单片里也不必考虑延时问题。
Wang1jin 带您从零学单片机技术支持:/bbs主 讲:wang1jin LCD1602显示流程1.设置显示模式2.写显示字符的位置3.写显示字符数据4.完成显示在对LCD1602进行操作的时候需要判断LCD1602是否处于忙的态.如果是处于忙的状态,就需要等LCD1602忙完,再对它进行读写作.技术支持:/bbs主 讲:wang1jin LCD1602自定义显示字符方法首先取得想要的中文或者图形的字模数组。
通过字模软件不能直接提取5*8点阵的字模数据,可以通过手动提取的方法。
如下图所示,对应一个字符显示区域。
每8个字节,组成一个点阵数组。
将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。
1602内部CGRAM 用于自定义的字符点阵的存储,总共64字节。
由上一步点阵提取可知,每一个字符由8个字节数据组成。
所以64字节CGRAM 存储器,能够存储8组自定义字符的点阵数组。
按照CGRAM 地址划分为 0-7为第一组,8-15为第二组,依次类推56-63为第8组数据。
CHARACTER CODE是数据的显示地址.0-7的范围.能存储8位自定义的显示数据.CGRAM ADDRESS是存储数据的地址,从0-63共64个字节.存储64个数据.我们写入的数据是0x40 – 0x7F,共128位.CGRAM DATA是写入字符的地址,每一个数对应有8个数据.内部常用字符显示时,显示编码是从0x20开始的。
0x00-0x0F是专门留给自定义字符显示的。
0x00-0x07和0x08-0x0F内容是一样的。
例如:调用0x01 位置和0x09位置,显示的内容是一样的。
技术支持:/bbs主讲:wang1jin技术支持:/bbs 主讲:wang1jin技术支持:/bbs主 讲:wang1jin LCD1602自定义显示字符方法1.设置向CGRAM 中存入这个数据.初始地址是0x40.然后存一位向后加8.总共能存8位自定义的字符2.然后可以把自定义的数据送入到LCD 的CGRAM 中.3.向LCD 写指令,送入需要显示数据的地址.4.向LCD 写指令,把显示的数据指向LCD 的CGRAM 存储的位置.显示出自定义字符.LCD1602自定义显示字符的方式共四步,如下面所示:技术支持:/bbs主 讲:wang1jin LCD1602自定义字符方法1.建立一个字符数组uchar LCD_Data1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00};2.设置CGRAM 地址,写指令.Write_LCD(0x40,0);3.把数据送入CGRAM 地址内.for(i = 0; i < 8 ; i ++ ){Write_LCD(LCD_Data1[i],1);}4.写需要显示的位置指令.Write_LCD(0x80,0);5.把CGRAM 的0位的数据送向LCD1602,显示数据存储的数据.Write_LCD(0x00,1);技术支持:/bbs 主 讲:wang1jin 课后作业:1.在LCD1602上面第一行上面显示电子爱好者 网址.在第二行上面显示一个变量从 0一直加到9999 9999 循环.并在第二行上面显示按下按键的值和长短按标志.2.把本章中的LCD1602八位总线方式程序改成四位总线方式显示.3.利用本章的LCD 自定义的显示方式,在LCD 上显示一个自己设计的图形.然后轮流切换做成一个LCD 动画.Wang1jin 带您从零学单片机技术支持:/bbs 主 讲:wang1jin 欢迎光临我们的论坛:/bbs Wang1jin 带您从零学单片机。