LCD1602介绍: 是一个只能显示字母、数字、符号的点阵型液晶模块。一行可以显示16个字符,可以显示两行,所以叫做1602。
图片:
硬件分析:
1602一共有16个引脚,其各个引脚的功能如下所示
根据各个引脚的功能,需要设置如下电路(主芯片是AT89C52): 其中VO(VL)接的是一个电位器,你也可以接一个适当阻值的电阻连到GND。 RS-P26 RW-P25 E-P27 DB0~7接到P0~7 这十个引脚就是与1602通信的线路。
当硬件连接好后,就需要有配套的软件。
程序需要2步,缺一不可: 1、初始化1602,RS=0时发送初始化指令 2、将你要显示的数据发送给1602,此时RS=1;
程序发送数据是根据1602的驱动时序图来的,如图: 在控制方面,RS是决定你的发送内容是指令,还是数据,在初始化的时候RS=0,在显示数据的时候RS=1。RW脚为0(低电平),表示我要写数据。
根据上面的时序图,可以写出发送一个数据的函数,如下
void LcdWriteCom(uchar com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DATAPINS = com;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
LCD1602_DATAPINS定义的是P0端口,作用是根据com的值(8个bit)来给P0~7引脚赋予高低电平,通过高低电平发送给1602。
简单分析一下E这个引脚,准备发送数据时E=0,然后将数据赋给IO口,此时单片机的数据引脚已经是一个数据了。延时1ms等IO口稳定后,将E置1,告诉1602要读数据,延时5ms等1602读完,此时1602已经将数据存入内存里,最后将E脚置0。
1602的初始化 我这边初始化需要5条指令,来设置常用的功能。 1.功能设置指令
2.显示开关控制指令
3.模式设置指令
4.清屏指令
5.数据指针起点 我们发给1602数据后,他会保存在SDRAM里。(H是16进制的表示) 所以我们第一行的16个数据就是00H到0FH,共16个。 第二行的数据从40H到4FH,也是16个。 要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,例如第二行第一个字符的地址是 40H, 那么是否直接写入 40H 就可以将光标定位 在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)。 所以在程序里发送0x80来设置指针起点,0x00+0x80 = 0x80。
根据以上5条指令,就知道应该怎么初始化了,所以有如下程序:
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
初始化完成后,就开始显示数据了。
发送显示数据的函数为LcdWriteData(与LcdWriteCom不同之处在于RS脚)
void LcdWriteData(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
使用一个for循环发送数据
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
注意,你发送的数据必须是字符型的,如’1’, ‘a’ , ‘A’ , ’ ’ ,等。LCD会自动处理。 独立文件 lcd.c
#include "lcd.h"
void Lcd1602_Delay1ms(uint c)
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
#ifndef LCD1602_4PINS
void LcdWriteCom(uchar com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DATAPINS = com;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DATAPINS = com;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef LCD1602_4PINS
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
#else
void LcdInit()
{
LcdWriteCom(0x32);
LcdWriteCom(0x28);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
#endif
lcd.h
#ifndef __LCD_H_
#define __LCD_H_
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
void Lcd1602_Delay1ms(uint c);
void LcdWriteCom(uchar com);
void LcdWriteData(uchar dat) ;
void LcdInit();
#endif
main.c
#include "reg52.h"
#include "lcd.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 Disp[]=" Pechin Science ";
void main(void)
{
u8 i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1);
}
程序来自普中科技
附上完整工程 链接:https://pan.baidu.com/s/1q3HKwRNIsdu_qLvXDnGfGA 提取码:d1lq
|