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);
	}
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值