LCD 1602学习

Posted Heavy sea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LCD 1602学习相关的知识,希望对你有一定的参考价值。

一、LCD 1602介绍

LCD1602 液晶显示屏是一种字符型显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊符号。

显示容量:16 X 2 个字符,每个字符为5*7的点阵

1.引脚说明

引脚功能
VCC正极(4.5V~5.5V)
VO对比度调节电压
RS数据、指令选择,1为数据,0为指令
RW读写选择,1为读,0为写
E使能,1为数据有效,下降沿执行命令
DB0~DB7数据输入、输出
BG VCC背光灯电源正极
BG GND背光灯电源负极

VO是接入滑动变阻器来调节电压,我们可以直接将VO接地,虽然效果不是很好,但侧着看LCD屏幕仍能观察到实验结果。

2.DDRAM(数据显示区)

DDRAM 就是显示数据 RAM,用来寄存待显示的字符代码。

要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的 00H 地址写入“A”字的代码 41H 就行了,可 41H 这一个字节的代码如何才能让 LCD 模块在屏幕的阵点上显示“A”字呢?同样,在 LCD 模块上也固化了字模存储器,这就是 CGROM 和 CGRAM。HD44780 内置了 192 个常用字符的字模, 存于字符产生器 CGROM(Character Generator ROM)中,另外还有 8 个允许用户自定义的字符产生 RAM,称为 CGRAM(Character Generator RAM)。

3.CGRAM + CGROM(字模库)

4.LCD 字符型液晶显示模块指令集

AC表示光标位置

二、读写时序图

读操作时序图

写操作时序图

三、LCD1602 常用操作

参考LCD 字符型液晶显示模块指令集可得出常用操作所需的指令

1.初始化
发送指令0X38 八位数据接口,两行显示,5*7点阵
发送指令0X0C 显示开,光标关,闪烁关
发送指令0X06 数据读写操作后,光标自动加1,画面不动
发送指令0X01 清屏

2.显示字符
发送指令0X80|AC 设置下一个要存入数据的DDRAM的地址
发送数据 发送要显示的字符数据

四、实例

main.c

#include "reg52.h"
#include "LCD1602.h"

void main()

	 LCD_init();
	 LCD_Showchar(2,1,'A');
	 LCD_Showstring(2,3,"hello");
	 LCD_Shownum(1,2,789,3);

   	while(1)
	
	
	

LCD1602.h

#ifndef _LCD1602_H_
#define	_LCD1602_H_

void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_init();
void LCD_Showchar(unsigned int row,unsigned int column,unsigned char Char);
void LCD_Showstring(unsigned int row,unsigned int column,unsigned char *string);
void SetCursor(unsigned int row,unsigned int column);
int LCD_Pow(int x,int y);
void LCD_Shownum(unsigned int row,unsigned int column,unsigned int num,unsigned int length);

#endif

LCD1602.c

#include "reg52.h"
#include "LCD1602.h"
#include <intrins.h> 

sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E	= P2^7;

#define LCD_Port P0

void Delay1ms()		//@11.0592MHz

	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	
		while (--j);
	 while (--i);


// 写指令操作
void LCD_WriteCommand(unsigned char Command)

	  LCD_RS = 0;	//指令操作
	  LCD_RW = 0;	// 写
	  LCD_Port = Command;
	  LCD_E = 1;
	  Delay1ms();
	  LCD_E = 0;
	  Delay1ms();


// 写数据操作
void LCD_WriteData(unsigned char Data)

	  LCD_RS = 1;	// 数据操作
	  LCD_RW = 0;   // 写
	  LCD_Port = Data;
	  LCD_E = 1;
	  Delay1ms();
	  LCD_E = 0;
	  Delay1ms();


// 设置光标位置
void SetCursor(unsigned int row,unsigned int column)

   if(row == 1)
		LCD_WriteCommand(0x80 | (column-1));
	
	else
		LCD_WriteCommand(0x80 | (column-1)+0x40);
	

	


// 初始化LCD屏幕
void LCD_init()

	  LCD_WriteCommand(0x38);	    // 八位数据接口 两行显示
	  LCD_WriteCommand(0x0c);		// 显示开 光标关 闪烁关
	  LCD_WriteCommand(0x06);		// 光标自动加1
	  LCD_WriteCommand(0x01);		// 清屏


// 显示字符
void LCD_Showchar(unsigned int row,unsigned int column,unsigned char Char)

	SetCursor(row,column);

	LCD_WriteData(Char);


// 显示字符串
void LCD_Showstring(unsigned int row,unsigned int column,unsigned char *string)

	unsigned char i;

	SetCursor(row,column);

	 for(i=0;string[i]!='\\0';i++)
	 	LCD_WriteData(string[i]);
	 


int LCD_Pow(int x,int y)

	unsigned char i;
	int ret = 1;

	for(i=0;i<y;i++)
		ret = ret*x;
	

	return ret;


// 显示数字
void LCD_Shownum(unsigned int row,unsigned int column,unsigned int num,unsigned int length)

	unsigned int i;
	SetCursor(row,column);

	for(i=length;i>0;i--)
	
		 LCD_WriteData('0'+num/LCD_Pow(10,i-1)%10);
	

以上是关于LCD 1602学习的主要内容,如果未能解决你的问题,请参考以下文章

C51 LCD1602的使用

LCD学习

lcd1602如何自定义汉字(verilog)

lcd1602如何与arduino进行连接

Wio Terminal LCD 中文显示

Wio Terminal LCD 中文显示