发布时间:2023-02-24 10:30
一、LCD1602介绍
LCD1602 (Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
显示容量: 16x2个字符, 每个字符为5*7点阵
二、引脚及电路应用
三、内部结构框图
通过往DDRAM中写入数据,DDRAM在字模库里找到然后显示在屏幕上,屏幕只能显示16*2,但实际可以显示40*2,厂家其实并没有做出来。
四、存储结构
往这些地址中写入字符码,然后DDRAM会从CGROM中找到字符显示在屏幕上
通过十六进制,上边一行是高位,左边一列是低位,来找到所要显示的字符
ASCII码表
五、LCD1602时序结构及操作流程
六、代码
LCD1602.c
#include
//引脚配置:
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);//八位数据接口,两行显示,5*7点阵
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));//0x80是确定光标位置的指令,A0-A6是确定地址
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);//换行所以要加一个基地址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); //char x=‘A’;(等效于char x=0x41;)
}
/**
* @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[])
{
//这里用到指针的作用,String[]指针指向该字符组的第一个地址,依次显示出来,直到'\0'的出现
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)//x的y次方
{
unsigned char i;
int Result=1;
for(i=0;i0;i--)
{
LCD_WriteData(0x30+Number/LCD_Pow(10,i-1)%10);//将数字转化为ASCII码表
}
}
/**
* @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(0x30+Number1/LCD_Pow(10,i-1)%10);//将数字转化为ASCII码表
}
}
/*
输入0xA0 i
160/16%16 10 2 16^(2-1)
160/1%16 0 1 16^(1-1)
*/
/**
* @brief 在LCD1602指定位置开始以十六进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~0xFFFF
* @param Length 要显示数字的长度,范围:1~4
* @retval 无
*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)
{
unsigned char i;
unsigned char SingleNumber;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
SingleNumber=Number/LCD_Pow(16,i-1)%16;
//将16进制转化为ASCII码表,这里输入16进制,但进行计算的是十进制
if(SingleNumber<10)
{
LCD_WriteData('0'+SingleNumber);
}
else
{
LCD_WriteData('A'+SingleNumber-10);//这里的‘A’相当于是一个基地址
}
}
}
/**
* @brief 在LCD1602指定位置开始以二进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData(0x30+Number/LCD_Pow(2,i-1)%2);//将数字转化为ASCII码表
}
}
main.c实现LCD屏流动显示,其实就是对指令的操作
#include
#include "LCD1602.h"
#include "Delay.h"
void main()
{
LCD_Init();
LCD_ShowChar(2,3,'\\');//也可以直接写'A',A的ASCII码就是0x41,实际传输就是0x41
LCD_ShowString(1,3,"hello");
LCD_ShowNum(1,9,66,2);
LCD_ShowSignedNum(1,11,-88,2);
LCD_ShowHexNum(2,1,0xA0,2);
LCD_ShowBinNum(2,5,0xA5,8);
LCD_ShowChar(2,14,0xDF);
LCD_ShowString(1,16,"Welcome to China!");
while(1)
{
LCD_WriteCommand(0x18);
Delay(500);
}
}
Machine Learning - 第7周(Support Vector Machines)
【MQTT从入门到提高 | 05】MQTT3.1.1之PUBLISH发布工作流
HarmonyOS怎么样,华为EMUI正式更名为HarmonyOS,鸿蒙能成为全球第三大操作系统?...
SpringBoot系列——Security + Layui实现一套权限管理后台模板
【youcans 的 OpenCV 例程 200 篇】120. 击中-击不中变换
SpringCloud【OpenFeign】-服务间调用的利器
【图像增强】基于Frangi滤波器实现血管图像增强附matlab代码