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);}程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。
LCD1602资料及单片机对其驱动
技术支持:/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液晶屏显示器其引脚不一定相同,在使用的时候要注意查阅厂家提供的技术资料。
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工作原理的详细介绍下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!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驱动程序
}
/*------------------------------------------------
lcd1602写入命令函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
bit result; //修改了判忙函数
DataPort= 0xFF;
RS=0;
RW=1;
EN=1;
_nop_();
result=(bit)(DataPort & 0x80);
EN=0;
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else //否则就是第二行,就是必须y==2
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
#include <reg52.h>
#include<intrins.h>
/*----------------------------------------------------
lcd1602
----------------------------------------------------*/
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
单片机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);
51单片机驱动1602液晶(4线串行)
51单片机驱动1602液晶(4线串行) 2015-06-26 12:04:01 来源:51hei关键字:51单片机1602液晶4线串行/*单片机I/O 口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。
废话少说,进入正题。
显示器件多见的是LED数码管,LCD液晶屏等。
一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。
LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。
总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。
这再很多应用场合是不大可取的。
所以很有必要减少连接数。
从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。
其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;下面给出驱动源程序*/#include <reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define TRUE 1#define FALSE 0#define nop _nop_()#define PtData P0 //定义连接口线,#define PtContr P3sbit RS="PtContr"^0;sbit RW="PtContr"^1;sbit E="PtContr"^2;void InitialLcd();void WriteLcdInstr(uchar);void WriteLcdData(uchar);void CheckLcdBusy();uchar HexToDdram(uchar);void Delay(unsigned int);main(){Delay(1000);InitialLcd();WriteLcdInstr(0x80); WriteLcdData('e');WriteLcdData('l');WriteLcdData('k');WriteLcdData('e');WriteLcdData('l');WriteLcdData('i');WriteLcdData('k');WriteLcdData('e');WriteLcdInstr(0xc0); WriteLcdData('L');WriteLcdData('C');WriteLcdData('D');WriteLcdData('1');WriteLcdData('6');WriteLcdData('0');WriteLcdData('2');while(1){WriteLcdInstr(0x0f);Delay(30000);WriteLcdInstr(0x08);Delay(40000);}}//----------------LCD1602函数---------------------////---初始化void InitialLcd(){Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过RS=0;RW=0;nop;E=0;nop;E=1;nop;PtData=0x20;//nop;E=0;Delay(200);//延时应大于4.1msE=1;nop;PtData=0x20;//nop;E=0;Delay(5);//延时应大于100usE=1;nop;PtData=0x20;//nop;E=0;//设置4位操作;WriteLcdInstr(0x01);//清屏WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8WriteLcdInstr(0x02);//光标归位WriteLcdInstr(0x06);//AC自动加1,画面不动WriteLcdInstr(0x0f);//0x0f:光标闪烁开;}//---写指令void WriteLcdInstr(uchar Temp){CheckLcdBusy();RS=0;RW=0;E=0;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---写数据void WriteLcdData(uchar Temp) {CheckLcdBusy();RS=1;RW=0;E=0;nop;E=1;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---查忙void CheckLcdBusy(){uchar Temp,t;PtData=0xff;RW=1;RS=0;nop;E=0;nop;do{nop;E=1;nop;Temp=PtData;nop;nop;nop;E=0;nop;nop;t=PtData;nop;nop;nop;E=0;nop;nop;Temp&=0x80;}while(Temp==0x80);}//---delayvoid Delay(unsigned int N) {unsigned int i;for(i=0;i<N;i++){i=i;}}。
(例11)LCD1602驱动
//头文件#include <reg51.h>#include <INTRINS.H>//宏定义#define uchar unsigned char#define uint unsigned intsbit LCD_RS=P1^0;//定义引脚 L指令和H数据sbit LCD_RW=P1^1; //H读L写sbit LCD_E=P1^2; //串行时钟输入sbit LCD_PSB =P1^3; /*LCD_PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,LCD_PSB=1*/sbit LCD_RST =P1^4; //程序没有用上/*LCD_PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,LCD_PSB=1复位信号低电平有效*/#define LCD_Data P0#define Busy 0x80 //用于检测LCD状态字中的Busy标识//函数声明void WriteDataLCD(unsigned char WDLCD); //写数据void WriteCommandLCD(unsigned char WCLCD,BuysC);//写指令unsigned char ReadDataLCD(void);//读数据unsigned char ReadStatusLCD(void); //读状态void LCDInit(void); //初始化void LCDClear(void); //清屏void LCDFlash(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 DisplayImage (unsigned char code *DData);//图形显示128*64void Delay5Ms(void);void Delay400Ms(void);//写数据void WriteDataLCD(unsigned char WDLCD){//ReadStatusLCD(); //检测忙LCD_RS = 1;LCD_RW = 0;LCD_Data = WDLCD;LCD_E = 0;Delay5Ms();LCD_E = 1;}//写指令void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{//if (BuysC)//ReadStatusLCD(); //根据需要检测忙LCD_RS = 0;LCD_RW = 0;LCD_Data = WCLCD;LCD_E=0;Delay5Ms();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); //检测忙信号LCD_E = 0;return(LCD_Data);}//LCM初始化void LCDInit(void){WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); // 显示光标移动设置WriteCommandLCD(0x0C,1); // 显示开及光标设置}//清屏void LCDClear(void){WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x34,1); // 显示光标移动设置WriteCommandLCD(0x30,1); // 显示开及光标设置}//闪烁效果void LCDFlash(void){WriteCommandLCD(0x08,1); //显示清屏Delay400Ms();WriteCommandLCD(0x0c,1); // 显示开及光标设置Delay400Ms();WriteCommandLCD(0x08,1); //显示清屏Delay400Ms();WriteCommandLCD(0x0c,1); // 显示开及光标设置Delay400Ms();WriteCommandLCD(0x08,1); //显示清屏Delay400Ms();}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {if(Y<1)Y=1;if(Y>4)Y=4;X &= 0x0F; //限制X不能大于16,Y不能大于1switch(Y){case 1:X|=0X80;break;case 2:X|=0X90;break;case 3:X|=0X88;break;case 4:X|=0X98;break;}WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}//按指定位置显示一串字符,用到void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength,X2;ListLength = 0;X2=X;if(Y<1)Y=1;if(Y>4)Y=4;X &= 0x0F; //限制X不能大于16,Y在1-4之内switch(Y){case 1:X2|=0X80;break; //根据行数来选择相应地址case 2:X2|=0X90;break;case 3:X2|=0X88;break;case 4:X2|=0X98;break;}WriteCommandLCD(X2, 1); //发送地址码while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0x0F) //X坐标应小于0xF{WriteDataLCD(DData[ListLength]); //ListLength++;X++;Delay5Ms();}}}//图形显示128*64void DisplayImage (unsigned char code *DData){unsigned char x,y,i;unsigned int tmp=0;for(i=0;i<9;){ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开for(x=0;x<32;x++){ //32行WriteCommandLCD(0x34,1);WriteCommandLCD((0x80+x),1);//列地址WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88WriteCommandLCD(0x30,1);for(y=0;y<16;y++)WriteDataLCD(DData[tmp+y]);//读取数据写入LCDtmp+=16;}i+=8;}WriteCommandLCD(0x36,1); //扩充功能设定WriteCommandLCD(0x30,1);}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}void main(void){//Delay400Ms(); //启动等待,等LCD讲入工作状态LCDInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)LCD_PSB = 1;//并口输出0为串口输出while(1){LCDClear();DisplayListChar(2,1,"绿盾电子"); //显示字库中的中文数字DisplayListChar(0,2," ");Delay400Ms();Delay400Ms();Delay400Ms();Delay400Ms();LCDFlash(); //闪烁效果}}。
lcd1602a51全功能驱动(12m晶振) (1)
//LCD若采用四线传输方式,MCU口的高四位和LCD数据口的
//高四位相连,传输数据时先发送高四位,再发送低四位数据
#define LCD_DB_Port P0 //lcd数据口
if(row == 1)
lcd_wcmd(col | 0x80 | 0x40);
}
/*************************************************************/
/* */
/* 显示字符串 */
/* */
/*************************************************************/
/* */
/*************************************************************/
static bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_DB_Port&0x80);
// 调用lcd_wdat(0x02)就能显示
//******************LCD1602 命令字 ******************//
#ifdef LCD_8DB
#define LCD_MODE LCD_CMD_8DB
#endif
#ifdef LCD_4DB
#define LCD_MODE LCD_CMD_4DB
LCD1602四线驱动的方法
LCD1602四线驱动的方法一、硬件连接:见下图,图图中LCD1602的高四位DB7-DB4和RS、E端接到单片机的6个I/O 口,R/W 接地。
这种连接方法只能向LCD写入指令和数据,而不能从LCD中读出数据。
单片机引脚的接法可以根据要求改变。
二、驱动说明:1、当E = 0时,数据位和RS位和P4~P7位可以改变2、当E = 1时,数据位内容被写入LCD3、当RS = 0时,写入的为指令4、当RS = 1时,写入的为数据(地址)三、驱动流程:1、写入指令:1)EN = 0 (LCD使能禁止)2)短延时3)RS = 0 (准备写入指令)4)DATA = 指令的高4位(A TA代表D7、D6、D5、D4,下同)5)短延时6)EN = 1 (LCD使能允许,指令写入)7)短延时8)EN = 0 (LCD使能禁止)9)DATA = 指令的低4位10)短延时11)EN = 1 (LCD使能允许,指令写入)12)短延时13)EN = 0 (LCD使能禁止)14)短延时2、写入数据:1)EN = 0 (LCD使能禁止)2)短延时3)RS = 1 (准备写入数据)4)DATA = 数据的高4位5)短延时6)EN = 1 (LCD使能允许,数据写入)7)短延时8)EN = 0 (LCD使能禁止)9)DATA = 数据的低4位10)短延时11)EN = 1 (LCD使能允许,数据写入)12)短延时13)EN = 0 (LCD使能禁止)14)短延时四、指令的格式:。
单片机控制的lcd1602字符液晶滚动电路功能说明
单片机控制的lcd1602字符液晶滚动电路功能说明功能说明:单片机控制的LCD1602字符液晶滚动电路该电路是由单片机控制的LCD1602字符液晶显示屏的滚动功能。
通过单片机的程序控制,可以实现字符的滚动显示,从而达到信息展示的目的。
具体功能说明如下:1. 显示屏控制:该电路使用LCD1602字符液晶显示屏作为显示器,通过单片机的控制,可以控制显示屏上的字符显示。
显示屏具有2行16列的字符显示区域。
2. 滚动显示:通过单片机的程序控制,可以实现字符的滚动显示。
滚动显示可以从左向右或者从右向左进行,可以设置滚动速度和滚动内容。
3. 单片机控制:该电路使用单片机作为控制核心,通过单片机的GPIO口控制显示屏的数据和控制信号。
单片机可以根据用户的需求,通过编程实现不同的滚动效果。
4. 滚动速度调节:用户可以通过调节单片机程序中的延时参数,来控制滚动速度。
延时时间越短,滚动速度越快;延时时间越长,滚动速度越慢。
5. 滚动内容设置:用户可以通过编程将需要滚动显示的内容存储在单片机的内存中,然后通过单片机控制,将内容逐个字符地显示在LCD1602字符液晶显示屏上。
6. 滚动方向选择:用户可以通过编程设置滚动的方向,可以选择从左向右滚动或者从右向左滚动。
7. 硬件连接:该电路需要将单片机的GPIO口与LCD1602字符液晶显示屏的数据和控制信号引脚连接起来,通过连接线进行数据传输和控制。
总结:该电路通过单片机控制LCD1602字符液晶显示屏的滚动功能,可以实现字符的滚动显示,从而达到信息展示的目的。
用户可以通过编程设置滚动速度、滚动内容和滚动方向,灵活控制滚动效果。
这种电路在信息展示、广告宣传等领域有着广泛的应用。
LCD1602.H51单片机LCD1602显示驱动程序
LCD1602.H(51单片机LCD1602显示驱动程序)/*无敌高氯酸修改函数功能delay_ms(time) 延时time毫秒LCD_init() 初始化清空LCD屏LCD_print(x,y,str)在(x,y)坐标上显示str字符0=;0;i--)for (j=0;j<1140;j++);}/************************************************ *********************函数名称:LCD_print()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无************************************************* *********************/void LCD_print(uchar x,uchar y,uchar *str){LCD_gotoxy(x,y);while(*str!='\0'){LCD_wdata(*str);str++;}}/************************************************** *******************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无************************************************* ********************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rw = 0;En = 0;En = 0;En = 1;}/************************************************ *********************函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无************************************************* ********************/void LCD_wdata(uchar wdata){Rstatus();Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时}/************************************************ *********************函数名称:LCD_rdata()功能描述:LCD读数据入口参数:无返回值:所读数据************************************************* ********************/uchar LCD_rdata(void){Rs = 1;Rw = 1;En = 0;En = 0;En = 1;return Port;}/************************************************ *********************函数名称:Rstatus()功能描述:LCD读忙状态入口参数:无返回值:若忙,则等待,不忙则返回Port************************************************* ********************/uchar Rstatus(void){Port = 0xFF;Rs = 0;Rw = 1;En = 0;En = 0;En = 1;while (Port & 0x80); //检测忙信号,不忙则退出等待return(Port);}/************************************************ *********************函数名称:LCD_init()功能描述:LCD初始化入口参数:无返回值:无************************************************* ********************/void LCD_init(void){Port = 0;LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号LCD_wcommand(0x08,1); //关闭显示LCD_wcommand(0x01,1); //显示清屏LCD_wcommand(0x06,1); // 显示光标移动设置LCD_wcommand(0x0C,1); // 显示开及光标设置}/************************************************ *********************函数名称:LCD_gotoxy()功能描述:定位到(x,y)位置入口参数:x为行(0~1),y为列(0~15)返回值:无************************************************* ********************/void LCD_gotoxy(uchar x, uchar y){x &= 0x1; //限制x不能大于1,y不能大于15y &= 0xF;if(!x) LCD_wcommand(0x80|y,1);else LCD_wcommand(0xC0|y,1);}。
LCD1602驱动编程(二)——驱动程序编写
switch( y) {
case 1:LCD_WriteCommand(0x80+x-1);break; //第一行 case2:LCD_WriteCommand(0x80+0x40+x-1); break; //第二行
7. 初始化 void LCD_Initial( void ) { LCD_WriteCommand(0x38); //4 位总线,5*10 点阵字符 LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06); //显示光标,光标右移 LCD_WriteCommand(0x0c); //开显示 }
8. 滚动字符 Void Character_move( void ) { LCD_WriteCommand(0x18); //字符左移 LCD_WriteCommand(0x1C); //字符右移 }
{
P0=0x00;
RS_SET_C; //数据总线
RW_SET_W; //操作
EN_SET_L;
_NOP( );
//tps1
EN_SET_H; //拉高使能端
while(P0&0x80); } 4. 清屏 Void LCD_Clear( void ) {
Read_busy( ); //判忙 LCD_WriteCommand(0x01) ; DelayMs(5); } 5. 显示字符串
{
Read_busy( ); //判忙
RS_SET_C; //命令总线
RW_SET_R; //写操作
单片机驱动LCD1602A程序
LCALL WRITE_DATA
RET
;******************************************************************************
;函数名:DISP_CGRAM
;输 入:
;
R5---->自选图形数据个数
;
R4---->自选图形序号
;
R3---->自选图形显示位置
9
嵌入式应用软件园,版权所有,请勿转载/销售。
;调 用:无
;描 述:查询忙碌标志信号
;******************************************************************************
CHECK_BUSY:
PUSH ACC
BUSY_LOOP:
CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_7
CLR E
JB
ACC.7,BUSY_L
;****************************************************************************** ;函数名:WRITE_COM ;输 入:A ;输 出:无 ;调 用:无 ;描 述:写指令到 LCM ;****************************************************************************** WRITE_COM:
;****************************LCM 与 89C51 接口定义******************************
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从这个指令的格式中我们可以看出,它共有 aaaaaa 这 6 位,一共可以表示 64 个地址,即 64 个字节。一个 5×8 点阵字符共占用 8 个字节,那么这 64 个字节 一共可以自定义 8 个字符。也就是说,上面这个图的 6 位地址中的 DB5DB4DB3 用来表示 8 个自定义的字符, DB2DB1DB0 用来表示每个字符的 8 个字节。这 DB5DB4DB3 所表示的 8 个自定义字符(0--7)就是要写入 DDRAM 中的字 符代码。我们知道,在 CGRAM 中只能定义 8 个自定义字符, 也就是只有 0—7 这 8 个字符代码,但在下面的这个 表(如图 12)中一共有 16 个字符代码 (××××0000b--×× ;××1111b)。实际上,如图所示,它只能表 示 8 个自定义字符 (××××0000b=×× ××1000b, ××××0001b=××& times;×1001b……依次类推)。也就 是说,写入 DDRAM 中的字符代码 0 和字符代码 8 是同一个 自定义字符。 5×10 点阵每个字符共占用 16 个字 节的空间,所以 CGRAM 中只能定义 4 个这样的自定义字符。
那么如何在 CGRAM 中自定义字符呢?在上面的介绍 中,我们知道有一个设置 CGRAM 地址指令,同写 DDRAM
指令相似,只须设置好某个自定义字符的字模数据,然 后按照上面介绍的方法,设置好 CGRAM 地址,依次写入 这个字模数据即可。我们在后面的例子中再进行说明。
图 12 四.LCD1602 指令 1.工作方式设置指令(如图 13)
图 20 说明:光标返回屏幕左上角,它不改变屏幕显示内 容。 7.设置 CGRAM 地址指令(如图 21)
图 21 说明:这个指令在上面已经介绍过。用法在后面例
子中说明。 8.设置 DDRAM 地址指令(如图 22)
图 22 说明:这个指令用于设置 DDRAM 地址。在对 DDRAM
进行读写之前,首先要设置 DDRAM 地址,然后才能进行 读写。前面我们说过,DDRAM 就是 LCD1602 的显示存储器。 我们要在它上面进行显示,就要把要显示的字符写入 DDRAM。同样,我们想知道 DDRAM 某个地址上有什么字符, 也要先设置 DDRAM 地址,然后将它读出到单片机。
图 13 ×:不关心,也就是说这个位是 0 或 1 都可以,
一般取 0。 DL:设置数据接口位数。 DL=1:8 位数据接口(D7—D0)。 DL=0:4 位数据接口(D7—D4)。 N=0:一行显示。 N=1:两行显示。 F=0:5×8 点阵字符。 F=1:5×10 点阵字符。 说明:因为是写指令字,所以 RS 和 RW 都是 0。
9.读忙信号和地址计数器 AC(如图 23)
图 23 说明:这个指令用来读取 LCD1602 状态。对于单片
图2 它的 16 条引脚定义如下:
引脚号 符号 引脚说明 引脚号 符号 引脚说明 1 VSS
电源地 9 D2 数据端口 2 VDD 电源正极 10 D3 数据端口 3 VO 偏压信号 11 D4 数据端口 4 RS 命令/数据 12 D5 数据端口
5 RW 读/写 13 D6 数据端口 6 E 使能 14 D7 数据端口 7 D0 数据端口 15 A 背光正极 8 D1 数据端口 16
2.显示开关控制指令(如图 14)
图 14 D=1:显示开,D=0:显示关。 C=1:光标显示,C=0:光标不显示。 B=1:光标闪烁,B=0:光标不闪烁。 说明:这里的设置是显示开,不显示光标,光标不
闪烁,设置字为 0x0c。 3.进入模式设置指令(如图 15、16)
图 15 I/D=1:写入新数据后光标右移。 I/D=0:写入新数据后光标左移。 S=1:显示移动。 S=0:显示不移动。
图8 DDRAM 相当于计算机的显存,我们为了在屏幕上显
示字符,就把字符代码送入显存,这样该字符就可以显 示在屏幕上了。同样 LCD1602 共有 80 个字节的显存,即 DDRAM。但 LCD1602 的显示屏幕只有 16×2 大小,因 此,并不是所有写入 DDRAM 的字符代码都能在屏幕上显 示出来,只有写在上图所示范围内的字符才可以显示出 来,写在范围外的字符不能显示出来。这样,我们在程 序中可以利用下面的“光标或显示移动指令” 使字符慢慢移动到可见的显示范围内,看到字符的移动 效果。
图 10 上面这个图(如图 10)说明的是 5×8 点阵和
5×10 点阵字符的字形和光标的位置。先来说 5×8 点阵,它有 8 行 5 列。那么定义这样一个字符 需要 8 个字节,每个字节的前 3 个位没有被使用。例如, 定义摄氏温标的符号 {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}。
LCD1602 只能用并行方式驱动,不能用串行方式驱动。 而并行方式又可以选择 8 位数据接口或 4 位数据接口。这
里我们选择 8 位数据接口(D7—D0)。我们的设置是 8 位数据接口,两行显示,5×8 点阵,即 0b00111000 也就是 0x38。(注意:NF 是 10 或 11 的效果 是一样的,都是两行 5×8 点阵。因为它不能以两 行 5×10 点阵方式进行显示,换句话说,这里用 0x38 或 0x3c 是一样的)。
LCD1602 的单片机驱动详解
一.接口
LCD1602 是很多单片机爱好者较早接触的字符型液 晶显示器,它的主控芯片是 HD44780 或者其它兼容芯片。 刚开始接触它的大多是单片机的初学者。由于对它的不 了解,不能随心所欲地对它进行驱动。经过一段时间的 学习,我对它的驱动有了一点点心得,今天把它记录在 这里,以备以后查阅。与此相仿的是 LCD12864 液晶显示 器,它是一种图形点阵显示器,能显示的内容比 LCD1602 要丰富得多,除了普通字符外,还可以显示点 阵图案,带有汉字库的还可以显示汉字,它的并行驱动 方式与 LCD1602 相差无几,所以,在这里花点时间是值 得的。
前面说了,为了在液晶屏幕上显示字符,就把字符 代码送入 DDRAM。例如,如果想在屏幕左上角显示字符 ‘A’,那么就把字符‘A’的字 符代码 41H 写入 DDRAM 的 00H 地址处即可。至于怎么写入, 后面会有说明。那么为什么把字符代码写入 DDRAM,就 可以在相应位置显示这个代码的字符呢?我们知道, LCD1602 是一种字符点阵显示器,为了显示一种字符的 字形,必须要有这个字符的字模数据,什么叫字符的字 模数据,看看下面的这个图就明白了(如图 9)。
无。 4. 写数据:输入 RS=1,RW=0,E=高脉冲。输出:
无。 读操作时序图(如图 5):
图5 写操作时序图(如图 6):
图6 时序时间参数(如图 7):
图7 三.DDRAM、CGROM 和 CGRAM
DDRAM(Display Data RAM)就是显示数据 RAM,用来 寄存待显示的字符代码。共 80 个字节,其地址和屏幕的 对应关系如下(如图 8):
图4 二.基本操作 LCD1602 的基本操作分为四种: 1. 读状态:输入 RS=0,RW=1,E=高脉冲。输出:
D0—D7 为状态字。 2. 读数据:输入 RS=1,RW=1,E=高脉冲。输出:
D0—D7 为数据。 3. 写命令:输入 RS=0,RW=0,E=高脉冲。输出:
图 16 说明:这里的设置是 0x06。 4.光标或显示移动指令(如图 17、18)
图 17
图 18 说明:在需要进行整屏移动时,这个指令非常有用,
可以实现屏幕的滚动显示效果。初始化时不使用这个指 令。
5.清屏指令(如图 19)
图 19 说明:清除屏幕显示内容。光标返回屏幕左上角。
执行这个指令时需要一定时间。 6.光标归位指令(如图 20)
片机的 P0—P3 任意的 8 个 I/O 口。如果接 P0 口, P0 口应该接 4.7K—10K 的上拉电阻。如果是 4 线并 行驱动,只须接 4 个 I/O 口。
8. A 背光正极,可接一个 10—47 欧的限流电 阻到 VDD。
9. K 背光负极,接 S。见图 4 所示。
图9 上图的左边就是字符‘A’的字模数据,
右边就是将左边数据用“○”代表 0,用 “■”代表 1。从而显示出‘A’ 这个字形。从下面的图可以看出,字符‘A’ 的高 4 位是 0100,低 4 位是 0001,合在一起就是 01000001b,即 41H。它恰好与该字符的 ASCII 码一致, 这样就给了我们很大的方便,我们可以在 PC 上使用