带你了解51单片机LCD1602液晶显示屏模块
本章带你了解51单片机中的LCD液晶屏模块
目录
1.LCD1602介绍
LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
显示容量:16×2个字符,每个字符为5*7点阵

2.引脚及应用电路


3.内部结构框图

4.存储器结构
DDRAM(数据显示区)

CGRAM+CGROM(字模库)


5.时序结构
读写流程:首先设置RS如果是数据就高低平,如果是指令就低电平;R/W,写都置低电平;之后把数据的8位送到数据端口,E置一个高电平再置一个低电平。一次写入完成
写数据/指令:

读时序:

6.LCD1602指令集



7.LCD1602操作流程
初始化:
发送指令0x38 //八位数据接口,两行显示,5*7点阵 发送指令0x0C //显示开,光标关,闪烁关 发送指令0x06 //数据读写操作后,光标自动加一,画面不动 发送指令0x01 //清屏
显示字符:
发送指令0x80|AC //设置光标位置 发送数据 //发送要显示的字符数据 发送数据 //发送要显示的字符数据 ……
8.字符、字符串
字符:
根据一定规则建立的数字到字符的映射(ASCII码表) 例如:0x21=’!’,0x41=’A’,0x00=’\0’ 定义方法:char x=‘A’;(等效于char x=0x41;)
字符数组:
存储字符变量的一个数组 定义方法:char y[]={’A’, ’B’, ’C’}; (等效于char y[]={0x41,0x42,0x43}; )
字符串:
在字符数组后加一个字符串结束标志,本质上是字符数组 定义方法:char z[]=”ABC”;(等效于char z[]={’A’, ’B’, ’C’, ’\0’};)


9.LCD1602功能代码
第一步:
看图进行引脚定义和P0为数据端口引脚



第二步:
写指令(看上节引脚指令图,可以知道1和0代表什么)

第三步:
写数据,跟上面一样改33行为1就可以了

第四步:
按这个表,进行初始化


第五步:
显示数据,光标地址


第六步:
显示字符串(写到显示屏里面显示出来)

第七步:
无符号整数显示(光标位置可以独立出来)




第八步:
显示有符号的数
![]()

第九步:
显示16进制数,取每一位除16

第十步:
显示二进制,对2取余

第十一步:
字符超出-移动,流动字幕。我们写一个超出屏幕范围(16*2)但没有超出DD ROM范围(40*2)的一个东西。我们要用到,向左移动指令。我们要用到指令就要在头文件声明LCD_WriteCommand函数。我们要导入Delay模块,因为指令调用太快了


最终代码:
模块:

LCD1602.c
#include <REGX52.H>
//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0
/**
* @brief LCD1602延时函数,12MHz调用可延时1ms
* @param 无
* @retval 无
*/
void LCD_Delay() //@12.000MHz 1ms
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
/**
* @brief LCD1602写命令
* @param Command 要写入的命令
* @retval 无
*/
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0;
LCD_RW=0;
LCD_DataPort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
/**
* @brief LCD1602写数据
* @param Data 要写入的数据
* @retval 无
*/
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;
LCD_RW=0;
LCD_DataPort=Data;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
/**
* @brief LCD1602初始化函数
* @param 无
* @retval 无
*/
void LCD_Init(void)
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
/**
* @brief LCD1602设置光标位置
* @param Line 行位置,范围:1~2
* @param Column 列位置,范围:1~16
* @retval 无
*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
/**
* @brief 在LCD1602指定位置上显示一个字符
* @param Line 行位置,范围:1~2
* @param Column 列位置,范围:1~16
* @param Char 要显示的字符
* @retval 无
*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
/**
* @brief 在LCD1602指定位置开始显示所给字符串
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param String 要显示的字符串
* @retval 无
*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
/**
* @brief 返回值=X的Y次方
*/
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
/**
* @brief 在LCD1602指定位置开始显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~65535
* @param Length 要显示数字的长度,范围:1~5
* @retval 无
*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
}
}
/**
* @brief 在LCD1602指定位置开始以有符号十进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:-32768~32767
* @param Length 要显示数字的长度,范围:1~5
* @retval 无
*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
unsigned int Number1;
LCD_SetCursor(Line,Column);
if(Number>=0)
{
LCD_WriteData('+');
Number1=Number;
}
else
{
LCD_WriteData('-');
Number1=-Number;
}
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
void LCD_WriteCommand(unsigned char Command);
void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
#endif
main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
void main()
{
LCD_Init(); //LCD初始化
LCD_ShowChar(1,1,'A'); //在1行1列显示字符A
LCD_ShowString(1,3,"Hello"); //在1行3列显示字符串Hello
LCD_ShowNum(1,9,66,2); //在1行9列显示数字66,长度为2
LCD_ShowSignedNum(1,12,-88,2); //在1行12列显示有符号数字-88,长度为2
LCD_ShowHexNum(2,1,0xA5,2); //在2行1列显示十六进制数字0xA5,长度为2
LCD_ShowBinNum(2,4,0xA5,8); //在2行4列显示二进制数字0xA5,长度为8
LCD_ShowChar(2,13,0xDF); //在2行13列显示编码为0xDF的字符
LCD_ShowChar(2,14,'C'); //在2行14列显示字符C
LCD_ShowString(1,16,"Welcome to China!");//流动字幕
while(1)
{
LCD_WriteCommand(0x18);
Delay(500);
}
}
更多推荐



所有评论(0)