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四位数据线接法的驱动硬件及驱动 2009-04-14 13:56:22 阅读480 评论0 字号:大中小订阅IO端口不够用是就可以接成6线接法:RS、E、DB4、DB5、DB6、DB7 可以任意用6根独立的IO线;这样就可以节省了5根IO线;程序如下://////////////////////////////////////根据自己的接线修改sbit LCD_DB0=P0^4;sbit LCD_DB1=P0^5;sbit LCD_DB2=P0^6;sbit LCD_DB3=P0^7;sbit LCD_RS=P2^0;sbit LCD_RW=P2^1; //只读数据而不写时可以直接接地sbit LCD_E=P2^2;////////////////////////////////////******定义函数****************/#define uchar unsigned char#define uint unsigned intvoid LCD_write_command(uchar command); //写指令函数void LCD_init_first(void);void LCD_init(void); //初始化函数void LCD_write_data(uchar dat); //写数据函数void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602显示字符串函数void LCD_pos(unsigned char x,unsigned char y );void delay_ms(unsigned int n) ;void delay_n10us(uint n);/////////////////////////////////////////////*-------------------------------------;首次初始化时要先运行此函数;/*************************************/void LCD_init_first(void){delay_ms(50);LCD_write_command(0x30);delay_ms(6);LCD_write_command(0x30);delay_ms(1);LCD_write_command(0x30);delay_ms(1);LCD_write_command(0x02);}/*--------------------------------------;模块名称:LCD_init();;功能:初始化LCD1602;占用资源:--;参数说明:--;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version);修改日期:--;修改说明:--;-------------------------------------*/void LCD_init(void){//LCD_write_command(0x38);//设置8位格式,2行,5x7LCD_write_command(0x28);//设置4位格式,2行,5x7LCD_write_command(0x0c);//整体显示,关光标,不闪烁LCD_write_command(0x06);//设定输入方式,增量不移位LCD_write_command(0x01);//清除屏幕显示delay_n10us(100); //延时清屏,延时函数,延时约n个10us}/*--------------------------------------;模块名称:LCD_write_command();;功能:LCD1602写指令函数;占用资源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E). ;参数说明:dat为写命令参数;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version) ;修改日期:--;修改说明:--;-------------------------------------*/ void LCD_write_command(uchar dat){LCD_RS=0;LCD_RW=0; //只读数据而不写时可以直接接地LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;}/*--------------------------------------;模块名称:LCD_write_data(); ;功能:LCD1602写数据函数;占用资源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E). ;参数说明:dat为写数据参数;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version);修改日期:--;修改说明:--;-------------------------------------*/void LCD_write_data(uchar dat){LCD_RS=1;LCD_RW=0; //只读数据而不写时可以直接接地LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;}/*-------------------------------------- ;模块名称:LCD_disp_char();;功能:LCD1602显示一个字符函数,在某个屏幕位置上显示一个字符,X(0-15),y(1-2)。
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中文资料程序和使用说明一、硬件连接和初始化步骤: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( 打开光标显示。
15LCD1602液晶的基本驱动函数
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工作原理LCD1602是一种常见的液晶显示模块,广泛应用于各种电子设备中。
它具有简单易用、显示清晰、功耗低等特点,因此备受电子爱好者和工程师的青睐。
那么,LCD1602是如何工作的呢?接下来,我们就来详细了解一下LCD1602的工作原理。
首先,LCD1602由液晶面板和驱动电路组成。
液晶面板是由一定数量的像素点组成的,每个像素点由液晶分子组成,通过控制液晶分子的排列来实现显示。
而驱动电路则负责控制液晶面板的工作,包括向液晶面板发送数据和控制信号,以及控制液晶面板的亮暗程度。
其次,LCD1602的工作原理主要涉及到两个方面,即液晶显示原理和驱动电路原理。
液晶显示原理是指液晶分子在电场的作用下改变排列状态,从而改变光的透过程度,实现显示。
而驱动电路原理则是指通过控制信号和数据信号,将需要显示的内容传输到液晶面板上,并控制液晶面板的亮暗程度,从而实现显示效果。
液晶显示原理中,液晶分子的排列状态是通过外加电场来改变的。
当电场作用于液晶分子时,液晶分子会改变排列状态,从而改变光的透过程度。
这就是为什么液晶显示需要背光源的原因,因为液晶本身并不会发光,需要外部光源来照亮。
而驱动电路原理则是通过发送数据信号和控制信号,来控制液晶面板的每个像素点的显示状态,从而实现整个画面的显示。
在LCD1602的驱动电路中,一般采用平行接口或串行接口来与微控制器或其他设备进行通信。
通过发送指令和数据,来控制液晶面板的工作。
在发送数据时,需要先发送指令或地址,然后再发送数据,通过这样的方式来控制液晶面板的显示内容。
同时,还需要控制液晶面板的亮暗程度,以及清除显示内容等操作。
总的来说,LCD1602的工作原理主要包括液晶显示原理和驱动电路原理两个方面。
液晶显示原理是通过改变液晶分子的排列状态来实现显示,而驱动电路原理则是通过发送指令和数据信号,来控制液晶面板的工作。
通过这些原理的相互作用,LCD1602能够实现清晰的显示效果,广泛应用于各种电子设备中。
LCD1602显示屏的驱动设置及例程
LCD1602显示屏的驱动设置及例程一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。
我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。
如图1所示:图1再来一张它的背面的,如图2所示:引脚号符号引脚说明引脚号符号引脚说明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 背光正极图2它的16条引脚定义如下:对这个表的说明:1. VSS接电源地。
2. VDD接+5V。
3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。
或同样阻值的RM065/RM063蓝白可调电阻。
见图3。
图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。
如果不需要进行读取操作,可以直接将其接VSS。
6. E,执行命令的使能引脚,接单片机的一个I/O。
7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。
如果接P0口,P0口应该接4.7K—10K的上拉电阻。
如果是4线并行驱动,只须接4个I/O 口。
8. A背光正极,可接一个10—47欧的限流电阻到VDD。
9. K背光负极,接VSS。
见图4所示。
8 D1 数据端口16 K 背光负极图4二.基本操作LCD1602的基本操作分为四种:1. 读状态:输入RS=0,RW=1,E=高脉冲。
输出:D0—D7为状态字。
2. 读数据:输入RS=1,RW=1,E=高脉冲。
第五次课LCD1602显示驱动电路基础.
8X8 点阵LED工作原理说明
P0 口
P2口
第7章 1602液晶的使用
第7章 1602液晶的使用
显示驱动技术讲义
专用液晶定制产业链
1.液晶面板设计与生产
门槛较高,投资较大
厂家:大连大显,深圳新深辉,瑞捷兴,河北冀雅
2.液晶驱动控制模块(LCM)的设计
门槛低,小公司多如牛毛, 厂家:西安海晶,陕西振远
3.含液晶显示模块的嵌入式开发应用
如:工业仪器仪表,专用手持式工控设备等
第7章 1602液晶的使用
显示驱动技术讲义
液晶显示器组成
第7章 1602液晶的使用
显示驱动技术讲义
压框:
第7章 1602液晶的使用
显示驱动技术讲义
背光电源安装方法
第7章 1602液晶的使用
显示驱动技术讲义
背光电源电特性
第7章 1602液晶的使用
显示驱动技术讲义
第7章 1602液晶的使用
显示驱动技术讲义
显示驱动技术讲义
2010年:条形码扫码系统 李光,关伟
第7章 1602液晶的使用
显示驱动技术讲义
流水线产品扫码系统
第7章 1602液晶的使用
显示驱动技术讲义
2011年:三相电能质量分析仪
第7章 1602液晶的使用
显示驱动技术讲义
1602字符液晶原理以及使用方法
知识点 :
⑴1602字符液晶显示器组 成及驱动电路(LCM)。 ⑵了解1602字符液晶显示 器接口。 ⑶编程实现显示功能。
第7章 1602液晶的使用
显示驱动技术讲义
北京航天金税技术有限公司
招聘职位: LCM开发工程师 招聘要求 1.应用电子技术或自动控制专业本科学历; 2.能熟练应Protel,POWERPCB或CADENCE等电子软件设计电路图和 PCB图; 3.从事过LCM设计或熟悉LCM原理者优先考虑; 4.能熟练阅读和翻译英文技术资料; 5.具有创新能力和良好的团队协作精神。 专业职责 1.负责产品的试制工作 2.负责编制试制总结报告及追踪具体落实情况 3.负责和试制产品信息交流,做好资源和产品标准化的协调 4.跟踪量产产品的生产状况
LCD1602的4、8线驱动
基于m128的LCD1602驱动(8线/4线)//*************************************************// 文件名: 1602.h// 作用: AVR的LCD1602 4/8线驱动// 作者: fjcqv// 最新修改: 2008年8月22日// 说明:使用GCC编程,1602提供4/8线驱动// 4线暂时高4位//*************************************************/#ifndef __1602_H_#define __1602_H_ 1//***头文件调用***//#include <avr/io.h>#include <util/delay.h>#include <avr/portpins.h>#include <compat/deprecated.h>//***定义uchar***//#ifndef uchar#define uchar unsigned char#endif//***本头文件增强功能设置***//#define _LCD_DEF 0 //使自定义功能实现,如不需要将其定义为0(#define _LCD_DEF 0)#define _LCD_BIT_IS_8 1 //定义4线或者8线/*控制针脚设置*/#define LCD_CZ PORTB#define LCD_CZDDR DDRB#define LCD_E 2#define LCD_RW 1#define LCD_RS 0#define LCDDATA PORTE#define LCDDDR DDRE#define LCDPIN PINE#define busy 7/*LCD命令定义*/#define E0() cbi(LCD_CZ,LCD_E)#define E1() sbi(LCD_CZ,LCD_E)#define RW0() cbi(LCD_CZ,LCD_RW)#define RW1() sbi(LCD_CZ,LCD_RW)#define RS0() cbi(LCD_CZ,LCD_RS)#define RS1() sbi(LCD_CZ,LCD_RS)#define nop() asm("nop")/*基本功能函数声明。
LCD1602驱动及显示计数值程序
1.6.3 数据指针设置 1.6.4 其它设置
5
1.7 外形
嵌入式应用软件园,版权所有,请勿转载/销售。
6
嵌入式应用软件园,版权所有,请勿转载/销售。
第 2 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机外接 2x2 (P3.7,P3.6 与 P3.0,P3.1)矩阵键盘,利用定时器 T0 的定时中断, 查询矩阵键盘。矩阵键盘被命名为 A、B、C、D。对键盘被按下的次数进行计数, 计数值会在 LCM 上显示。
LCM 与单片机的连接
7
嵌入式应用软件园,版权所有,请勿转载/销售。
第 3 章 程序代码
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
;******************************************************************************
9
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_DATA MOV A,#10001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 C: MOV A,#11000000B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#43H LCALL WRITE_DATA MOV A,#11000001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 D: MOV A,#11001001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#44H LCALL WRITE_DATA MOV A,#11001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;计数的循环,一直执行,永不跳出 START: MOV LCM_P,#10000010B ;数据指针(显示地址设置) MOV R0,#A4 LCALL DISP MOV LCM_P,#10001011B ;数据指针(显示地址设置) MOV R0,#B4 LCALL DISP MOV LCM_P,#11000010B ;数据指针(显示地址设置) MOV R0,#C4 LCALL DISP MOV LCM_P,#11001011B ;数据指针(显示地址设置) MOV R0,#D4 LCALL DISP LJMP START
(例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(); //闪烁效果}}。
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原理电路设计时,我们需要考虑到电路的基本工作原理、电路的构成以及相关的连接方法。
本文将对LCD1602原理电路设计进行详细的解释和说明。
一、LCD1602的基本工作原理LCD1602液晶显示屏采用了被动矩阵驱动方式。
其原理是通过液晶分子的扭曲来控制光的透射与反射,从而实现显示功能。
液晶分子的扭曲是通过在液晶层中加入电场来实现的。
LCD1602显示屏由16列、2行字符组成,每个字符由5x8个像素点组成。
二、LCD1602的电路构成LCD1602的电路构成主要包括以下几个部分:1. 控制电路:包括微处理器、控制芯片和逻辑电路。
微处理器负责向LCD1602发送指令和数据,控制芯片负责驱动液晶显示屏的各个部分。
2. 显示电路:包括液晶层、液晶驱动电路和背光电路。
液晶层通过液晶分子的扭曲来实现显示功能,液晶驱动电路负责向液晶层施加电场,背光电路负责提供背光光源。
3. 连接电路:包括数据线和控制线。
数据线用于传输数据,控制线用于传输指令和控制信号。
三、LCD1602的连接方法在进行LCD1602原理电路设计时,需要将LCD1602与其他电路元件进行正确的连接。
以下是LCD1602的常用连接方法:1. 数据线连接:LCD1602通过数据线与微处理器进行连接。
一般来说,LCD1602需要8根数据线来传输数据。
可以使用并行方式连接,也可以使用串行方式连接。
2. 控制线连接:LCD1602通过控制线与微处理器进行连接。
控制线包括使能信号线、读写信号线和RS信号线。
使能信号线用于使能LCD1602的读写操作,读写信号线用于控制数据的读写方向,RS信号线用于区分指令和数据。
3. 背光电路连接:LCD1602的背光电路需要连接一个适当的电源。
一般来说,背光电路需要使用稳压电路进行控制,以保证背光的稳定和亮度的可调。
LCD1602高手使用详解
LCD1602⾼⼿使⽤详解LCD1602⾼⼿使⽤详解前⾯总算⾛完了对AVR MEGA16这块单⽚机的⼀些基本的应⽤⽅式了,这时候⼤家对AVR的⼀些内部资源⽐如定时器,ADC,最主要的IO⼝的使⽤⽅式应该有了⼀个虽⽐较粗浅但是却⽐较形象的认识了。
这节我们来看使⽤单⽚机的另外⼀⼤主题,就是⽤单⽚机来实现芯⽚控制。
在前⾯的数码管显⽰⼀⽂中,就已经涉及到了⽤单⽚机来控制芯⽚为我们⼯作,CEPARK AVR开发板,为了达到增强驱动能⼒和节省IO⼝的作⽤,运⽤了移位寄存器74HC595来驱动两个四位⼋段数码管,是⼀个⼗分有创意的设计。
但是前⾯的内容重⼼还是集中于对AVR的IO⼝的控制,所以,我们从这节开始要正式逐渐深⼊的接触各种芯⽚了。
先做个引⼦。
单⽚机是⼀种微控制器,本⾝内部集成了数种资源⽐如CPU、内存、内部和外部总线系统,⽬前⼤部分还会具有外存。
他的主要任务是利⽤各种资源实现电平控制,可以以此控制与它相连的下级系统,⼴泛⽤于⼯业⾃动控制领域。
我们就从这句话出发,⾸先单⽚机⽤来做控制⽤的,⽽且是利⽤的是本⾝的内部资源。
但是,它的功能再强⼤,资源再丰富也总有⼀个上限,总有枯竭的⼀天。
所以我们常常利⽤单⽚机外接芯⽚来弥补或者增强单⽚机的功能来完成我们所需功能的电路。
⽐如程序存储器不⾜,可以外接外部存储器,⽐如单⽚机内部中断级不⾜,可以外接中断控制器等等。
⼤家可以从这个⾓度来理解芯⽚控制的意义罢。
今天我们⽤AVR单⽚机来实现对LCD1602液晶显⽰芯⽚的控制。
⾸先从这个名字讲起,LCD:英⽂全称为Liquid Crystal Display,即为液态晶体显⽰,也就是我们常说的液晶显⽰了。
(平时⽼说LCDLCD,可能⼤家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表⽰这个液晶⼀共能显⽰2⾏数据,每⼀⾏显⽰16个字符。
这个就是LCD1602的全部来由。
液晶显⽰的使⽤有多⼴泛我就不多说了,LCD1602好像10元左右就可以拿到了的,不算贵。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。
刚开始接触它的大多是单片机的初学者。
由于对它的不了解,不能随心所欲地对它进行驱动。
经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。
与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。
一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。
我手里这块LCD16 02的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。
如图1所示:图1再来一张它的背面的,如图2所示:图2它的16条引脚定义如下:3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。
或同样阻值的RM065/RM063蓝白可调电阻。
见图3。
图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。
如果不需要进行读取操作,可以直接将其接VSS。
6. E,执行命令的使能引脚,接单片机的一个I/O。
7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。
如果接P0口,P0口应该接4.7K—10K的上拉电阻。
如果是4线并行驱动,只须接4个I/O口。
8. A背光正极,可接一个10—47欧的限流电阻到VDD。
9. K背光负极,接VSS。
见图4所示。
图4二.基本操作LCD1602的基本操作分为四种:1. 读状态:输入RS=0,RW=1,E=高脉冲。
输出:D0—D7为状态字。
2. 读数据:输入RS=1,RW=1,E=高脉冲。
输出:D0—D7为数据。
3. 写命令:输入RS=0,RW=0,E=高脉冲。
输出:无。
4. 写数据:输入RS=1,RW=0,E=高脉冲。
输出:无。
读操作时序图(如图5):图5写操作时序图(如图6):图6时序时间参数(如图7):图7三.DDRAM、CGROM和CGRAMDDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下(如图8):图8DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。
同样LCD1602共有8 0个字节的显存,即DDRAM。
但LCD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来。
这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。
前面说了,为了在液晶屏幕上显示字符,就把字符代码送入DDRAM。
例如,如果想在屏幕左上角显示字符‘A’,那么就把字符‘A’的字符代码41H写入DDRAM的00H地址处即可。
至于怎么写入,后面会有说明。
那么为什么把字符代码写入DDRAM,就可以在相应位置显示这个代码的字符呢?我们知道,LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据,看看下面的这个图就明白了(如图9)。
图9上图的左边就是字符‘A’的字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。
从而显示出‘A’这个字形。
从下面的图可以看出,字符‘A’的高4位是0100,低4位是0001,合在一起就是0 1000001b,即41H。
它恰好与该字符的ASCII码一致,这样就给了我们很大的方便,我们可以在PC上使用P2=‘A’这样的语法。
编译后,正好是这个字符的字符代码。
在LCD1602模块上固化了字模存储器,就是CGROM和CGRAM,HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Gen erator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。
下图(如图12)说明了CGROM和CG RAM与字符的对应关系。
从ROM和RAM的名字我们也可以知道,ROM是早已固化在LCD1602模块中的,只能读取;而RAM是可读写的。
也就是说,如果只需要在屏幕上显示已存在于CGROM中的字符,那么只须在DDRAM中写入它的字符代码就可以了;但如果要显示CGROM中没有的字符,比如摄氏温标的符号,那么就只有先在CGRAM中定义,然后再在DDRAM中写入这个自定义字符的字符代码即可。
和CGROM中固化的字符不同,CGRAM中本身没有字符,所以要在DDRAM中写入某个CGR OM不存在的字符,必须在CGRAM中先定义后使用。
程序退出后CGRAM 中定义的字符也不复存在,下次使用时,必须重新定义。
图10上面这个图(如图10)说明的是5×8点阵和5×10点阵字符的字形和光标的位置。
先来说5×8点阵,它有8行5列。
那么定义这样一个字符需要8个字节,每个字节的前3个位没有被使用。
例如,定义摄氏温标的符号{0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}。
图11上面这个图(如图11)说明的是设置CGRAM地址指令。
从这个指令的格式中我们可以看出,它共有aaaaaa这6位,一共可以表示64个地址,即64个字节。
一个5×8点阵字符共占用8个字节,那么这64个字节一共可以自定义8个字符。
也就是说,上面这个图的6位地址中的DB5 DB4DB3用来表示8个自定义的字符,DB2DB1DB0用来表示每个字符的8个字节。
这DB5DB4DB3所表示的8个自定义字符(0--7)就是要写入DDR AM中的字符代码。
我们知道,在CGRAM中只能定义8个自定义字符,也就是只有0—7这8个字符代码,但在下面的这个表(如图12)中一共有16个字符代码(××××0000b--××××1111b)。
实际上,如图所示,它只能表示8个自定义字符 (××××0000b=××××1000b, ××××0001b=××××1001b……依次类推)。
也就是说,写入DDRAM中的字符代码0和字符代码8是同一个自定义字符。
5×10点阵每个字符共占用16个字节的空间,所以CGRAM中只能定义4个这样的自定义字符。
那么如何在CGRAM中自定义字符呢?在上面的介绍中,我们知道有一个设置CGRAM地址指令,同写DDRAM指令相似,只须设置好某个自定义字符的字模数据,然后按照上面介绍的方法,设置好CGRAM地址,依次写入这个字模数据即可。
我们在后面的例子中再进行说明。
图12四.LCD1602指令1.工作方式设置指令(如图13)图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。
LCD1602只能用并行方式驱动,不能用串行方式驱动。
而并行方式又可以选择8位数据接口或4位数据接口。
这里我们选择8位数据接口(D7—D0)。
我们的设置是8位数据接口,两行显示,5×8点阵,即0b00111000也就是0x38。
(注意:NF是10或11的效果是一样的,都是两行5×8点阵。
因为它不能以两行5×10点阵方式进行显示,换句话说,这里用0x38或0x3c 是一样的)。
2.显示开关控制指令(如图14)图14D=1:显示开,D=0:显示关。
C=1:光标显示,C=0:光标不显示。
B=1:光标闪烁,B=0:光标不闪烁。
说明:这里的设置是显示开,不显示光标,光标不闪烁,设置字为0x0 c。
3.进入模式设置指令(如图15、16)图15I/D=1:写入新数据后光标右移。
I/D=0:写入新数据后光标左移。
S=1:显示移动。
S=0:显示不移动。
图16说明:这里的设置是0x06。
4.光标或显示移动指令(如图17、18)图17图18说明:在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。
初始化时不使用这个指令。
5.清屏指令(如图19)图19说明:清除屏幕显示内容。
光标返回屏幕左上角。
执行这个指令时需要一定时间。
6.光标归位指令(如图20)图20说明:光标返回屏幕左上角,它不改变屏幕显示内容。
7.设置CGRAM地址指令(如图21)图21说明:这个指令在上面已经介绍过。
用法在后面例子中说明。
8.设置DDRAM地址指令(如图22)图22说明:这个指令用于设置DDRAM地址。
在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。
前面我们说过,DDRAM就是LCD1602的显示存储器。
我们要在它上面进行显示,就要把要显示的字符写入DDRAM。
同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。
9.读忙信号和地址计数器AC(如图23)图23说明:这个指令用来读取LCD1602状态。
对于单片机来说,LCD1602属于慢速设备。
当单片机向其发送一个指令后,它将去执行这个指令。
这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这新的指令,导致新的指令丢失。
因此这条读忙指令可以用来判断LCD1602是否忙,能否接收单片机发来的指令。
当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。
RS=0,表示是指令;RW=1,表示是读取。
这条指令还有一个副产品:即可以得到地址记数器AC的值(address counter)。
LCD1602维护了一个地址计数器A C,用来记录下一次读写CGRAM或DDRAM的位置。