目录

LCD1602显示屏介绍

引脚介绍

内部结构框图

存储器

DDRAM储存器地址

CGRAM与 CGROM的地址

时序介绍

LCD1602快捷指令

LCD1602指令操作流程:

字符、字符串的显示

各种进制的数字显示

在LCD1602上显示十进制数字

在LCD1602上显示十六进制数字

在LCD1602上显示二进制数字


LCD1602显示屏介绍

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符

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

引脚介绍

内部结构框图

存储器

DDRAM储存器地址

/**
* @brief  LCD1602设置光标位置(将行,列转换为地址)* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16(Column-1)* @retval 无*/
//DB7置1进行DDRAM设置
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));//00H,01H,,,27H}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));//40H,41H,,,67H}
}

CGRAM与 CGROM的地址

时序介绍

赋值数据的时候直接将16进制数据赋值给P^0端口即可,不必和之前的I2C以及单线通信一样,用“&”一位一位的移位赋值。

LCD1602快捷指令

常用的指令主要是,移屏,光标移动(常用的已经用红色标识)

LCD1602指令操作流程:

初始化:

发送指令0x38      //八位数据接口,两行显示,5*7点阵

发送指令0x0C      //显示开,光标关,闪烁关

发送指令0x06      //数据读写操作后,光标自动加一,画面不动

发送指令0x01      //清屏

#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}
/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}

显示字符:

发送指令0x80|AC //设置光标位置

发送数据              //发送要显示的字符数据

发送数据              //发送要显示的字符数据

/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}

字符、字符串的显示

字符:根据一定规则建立的数字到字符的映射(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’};)

从上面的解释我们也发现了,在字符数组与字符串的区别在与两者等价于带有花括号的形式时,后者系统会自动补 ’\0’而前者不会。所以我们在设计显示字符串的函数时就可以遍历数组,最后以’\0’为标志停止循环即可

/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
//用指针传递数组的首地址
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0; String[i]!='\0'; i++)//字符串在字符数组后面加上一个字符串结束的标志{LCD_WriteData(String[i]);//在模式设置的时候,光标会自动移动}
}

但是对于一些特殊的符号,比如说单引号,在应用的时候,计算机可能不知道到底哪个单引号和哪个单引号是一对的,从而报错。这时候就要用到转译符号

各种进制的数字显示

在LCD1602上显示十进制数字

通过之前字符显示的学习,我们可以触类旁通的联想到:把一个多位数字的每一位拆分出来,然后转化为字符的形式进行显示(我们在CGRAM与 CGROM的地址中发现,相应的数字确实要加上‘0’才能显示,也进一步验证了我们的猜想)

/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;//解决Y=0的情况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(Number/LCD_Pow(10,i-1)%10+'0');}//将数字表示为ASCLL表的形式,原因是(子模库)中是以ASCLL表的形式对应
}

我们也看到了,这个Number只能最大显示65535,那么如果我们想显示更大的数呢:实现的思路和之前定时器高位低位赋值相同。设高位为Number1,低位为Number2他们共同构成Number

那么在第一个显示函数上Number1=(Number/65535),在第二个显示函数上Number2=(Number%65535)这样就可以显示大于65535的数。

在LCD1602上显示十六进制数字

和显示十进制数字的方法大致相同,只是十六进制的每一位要判断是否大于10,大于10就用0~9的阿拉伯数字表示,大于10就用A,B,C,D,E,F来表示

/*** @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,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;//和10进制不一样的是,16进制数除16求余16得到不同位if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else//10以上显示的是ABCDEF,所以要先减去10{LCD_WriteData(SingleNumber-10+'A');}}
}

在LCD1602上显示二进制数字

和显示十进制数字的方法大致相同,只是进制为每2进1

/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16
* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111(注意在c语言中不能直接写2进制数据,所以写16进制替换)* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(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(Number/LCD_Pow(2,i-1)%2+'0');//和10进制不一样的是,2进制数除2求余2得到不同位}
}

综合上述,将代码整合在一起有:

#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{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_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @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 if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,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,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(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @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,long 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(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @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,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(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,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

STC89C52单片机LCD1602显示屏介绍与代码演示相关推荐

  1. STC89C52单片机AD/DA介绍与代码演示

    目录 AD/DA介绍 硬件电路模型 硬件电路图 运算放大器 运放电路 AD原理 DA原理 AD/DA性能指标 XPT2046的使用介绍与配置 XPT2046的时序 代码解释 AD/DA介绍 AD(An ...

  2. STC89C52单片机数码管介绍以及代码示例

    目录 一,数码管介绍 二,数码管引脚定义 我们首先对单个引脚进行说明: 其次,我们对多个引脚管进行说明: 最后我们来详细说说如何进行位选还有段选 接着是段选 三,数码管段码表 四,数码管驱动方式 五, ...

  3. linux下的fgetc()与fputc()函数详细介绍及代码演示

    linux下的标准I/O的fgetc()与fputc()函数详细介绍及代码演示 文章目录 前言 一.fgetc()用法介绍 二.fputc()用法介绍 代码演示 总结 前言 在C语言中,读写文件比较灵 ...

  4. STC89C52单片机I2C通信以及AT24C02介绍使用代码演示

    目录 AT24C02引脚介绍与使用 AT24C02介绍 ​I2C通信介绍 I2C通信时序 起始条件与终止条件 发送一个字节(主机发送到从机) 接受一个字节(从机发送到主机) 发送应答与接受应答 I2C ...

  5. PipedInputStream类 和 PipedOutputStream类 的简单介绍和代码演示

    PipedOutputStream类 和PipedInputStream 类为管道输出流 和管道输入流.通常都是以管道输出流作为管道的起始端,通常管道输出流和管道输入流通过connect方法连接起来, ...

  6. 4.11 51单片机-LCD1602显示屏

    4.11 LCD1602显示屏 4.11.1 原理图介绍 图4-11-1 图4-11-2 根据原理图得知: LCD1602的数据脚接P0口. RD(RS)引脚接P2.6 WR(RW)引脚接P2.5 L ...

  7. OpenCV卡尔曼滤波介绍与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 卡尔曼滤波原理 卡尔曼滤波最早可以追溯到Wiener滤波,不同的是 ...

  8. STC89C52单片机红外遥控中断以及代码显示

    目录 红外遥控简介 硬件电路 基本发送与接收 NEC通信协议 简单的叙述一下代码思路: 遥控建码 51单片机的外部中断 STC89C52的外部中断有两种触发方式: 下降沿触发和低电平触发 外部中断寄存 ...

  9. 超声波测距系统(stc89c52单片机+lcd1602+srf04超声波传感器+DS18B20温度传感器+无源蜂鸣器)

    求赞,它是我写博客的动力,请鼓励鼓励我,谢谢 基于超声波测距的倒车报警系统. 计划通过超声波传感器测距,温度传感器校正误差,lcd1602显示结果,距离小于某一值时将蜂鸣报警. 总体设计思路 HC-S ...

最新文章

  1. word2vec_文本相似度
  2. BUU[SCTF2019]Who is he
  3. 端口可以随便设置吗_驱动可以随便更新吗?
  4. 【报告分享】2020年创新报告-埃森哲.pdf(附下载链接)
  5. iOS WKWebView和JS交互的两种方式
  6. oracle将字符串转成数组_【算法打卡】上升下降字符串
  7. axure 抖音部件库_原型技巧:如何用Axure画出抖音APP页面色彩风格(干货技能)...
  8. Linux下bochs的安装与使用
  9. STM32F407ZET6音乐播放器
  10. 数据源EPMSSqlDataSource的使用
  11. 瑞吉外卖项目 基于spring Boot+mybatis-plus开发 超详细笔记,有源码链接
  12. 转载:Python 的关键字 yield 有哪些用法和用途?
  13. 游戏出海正当时,突破文化壁垒或成为关键
  14. 利用Python爬虫爬取指定天猫店铺全店商品信息
  15. 1对多业务,数据库水平切分架构一次搞定 | 架构师之路
  16. 怎样做优化才能提升网站的SEO排名?
  17. arctanx麦克劳林公式推导过程_考研高数公式知识点整理
  18. 反光衣穿戴识别检测系统 OpenCV
  19. 关于MIT6.828_HW9_barriers xv6 homework9的一些问题
  20. js获取当前时间的前一天/后一天 ,前一月/后一月

热门文章

  1. GSMS六合一软件(U盘版)ISO文件下载
  2. Analys 版本历史
  3. BiasFinder: Metamorphic Test Generation to Uncover Bias for Sentiment Analysis Systems阅读
  4. 【报错】IE下使用js隐藏元素display='none'不生效
  5. html+css3 制作太阳系行星运动动画
  6. 20170114经济学人封面文章Lifelong Learning
  7. 无穷大无穷小的表示方法
  8. jetson tx2 安装pycuda
  9. 2021-05-28 2021年ICSE中与Android相关的论文分享
  10. canvas实现刮刮卡,vue3实现