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学习的主要内容,如果未能解决你的问题,请参考以下文章