STC89C52单片机LCD1602显示屏介绍与代码演示

这篇具有很好参考价值的文章主要介绍了STC89C52单片机LCD1602显示屏介绍与代码演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

LCD1602显示屏介绍

引脚介绍

内部结构框图

 存储器

 DDRAM储存器地址

 CGRAM与 CGROM的地址

时序介绍

LCD1602快捷指令 

LCD1602指令操作流程:

字符、字符串的显示

 各种进制的数字显示

在LCD1602上显示十进制数字

在LCD1602上显示十六进制数字

在LCD1602上显示二进制数字


LCD1602显示屏介绍

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

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

引脚介绍

STC89C52单片机LCD1602显示屏介绍与代码演示

内部结构框图

STC89C52单片机LCD1602显示屏介绍与代码演示

 存储器

DDRAM储存器地址

STC89C52单片机LCD1602显示屏介绍与代码演示

/**
* @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的地址

STC89C52单片机LCD1602显示屏介绍与代码演示

时序介绍

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

STC89C52单片机LCD1602显示屏介绍与代码演示

STC89C52单片机LCD1602显示屏介绍与代码演示

LCD1602快捷指令 

STC89C52单片机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]);//在模式设置的时候,光标会自动移动
	}
}

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

STC89C52单片机LCD1602显示屏介绍与代码演示

 各种进制的数字显示

在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文章来源地址https://www.toymoban.com/news/detail-476668.html

/**
  * @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显示屏介绍与代码演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 0.96寸 4针 OLED显示屏模块学习笔记(基于89C52单片机)

    一,OLED简介:(学习本模块之前建议先把IIC,SPI通信协议提前了解) OLED,即有机发光二极管( Organic Light Emitting Diode )。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,

    2023年04月08日
    浏览(17)
  • 【STC89C52】学习51单片机的必备电子电路知识基础

    电子电路是学习51单片机的基础, 如果能把以下几个模块弄清楚学习51单片机就不成问题啦。 目录 1.电平 2.单片机IO口 3.电阻 4.电容  5.电路原理图 ​编辑 6.单片机最小系统结构  7.单片机工作的基本时序 单片机是一种数字集成芯片,数字电路中只有高电平和低电平。 单片

    2023年04月26日
    浏览(27)
  • 单片机STC89C52倒计时、数码管和蜂鸣器控制

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 单片机选用STC89C52,实现倒计时60秒,控制两个数码管分别显示时间的十位和个位;当计时完毕时,显示\\\"-”,

    2024年02月04日
    浏览(16)
  • 初学51单片机(STC89C52)一个倒计时显示器和大家分享

      想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。   通过加一,减一,乘2三个操作,

    2024年02月10日
    浏览(20)
  • 基于STC89C52单片机的温度控制系统设计方案与软硬件实现

    目录 摘要 I Abstract II 第一章 前言 1 1.1 温度控制系统设计发展历史及意义 1.2 温度控制系统的目的 1.3 温度控制系统完成的功能 第二章 总体设计方案 2.1 方案一 2.2 方案二 3.1 DS18B20简介 3.1.1DS18B20封装与引脚 3.1.2 DS18B20的简单性能 3.2 DS18B20的工作原理 3.3 DS18B20的测温原理 3.3.1 测

    2024年02月12日
    浏览(17)
  • 免费开源51单片机个人课程设计--基于stc89c52及红外遥控的测温智能电风扇

    51单片机个人课程设计–基于stc89c52及红外遥控的测温智能电风扇 个人学校的课程设计-智能电风扇,包含proteus原理图与源代码。 代码部分由我个人写的也有普中实验中的代码块。 3.1 硬件设计 主要器件: 单片机 AT89C52 红外接收 HS0038 LCD1602 温度测量 DS18B20 驱动集成芯片 L298

    2023年04月10日
    浏览(27)
  • 单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

    目录 1.独立按键控制LED灯亮灭 2.独立按键控制LED灯状态 3.独立按键控制LED灯显示二进制 4.独立按键控制LED灯位移 5.附录 独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯

    2024年02月01日
    浏览(63)
  • STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度

    下面将介绍如何利用STC89C52单片机和DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度。以及各模块的使用方法。 利用DHT11温湿度模块测量温湿度,利用HC-08蓝牙模块将数据传到手机上。 1.1DHT11温湿度模块外观 1.2DHT11温湿度模块使用方法简介 1.2.1DHT11温湿度模块工作的过程 用户

    2024年02月02日
    浏览(23)
  • 基于单片机的智能循迹避障小车STC89C52红外对管L298N驱动PWM波控制速度

    wx供重浩:创享日记 对话框发送:单片机小车 免费获取完整无水印报告等 利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。 1.1智能

    2023年04月22日
    浏览(23)
  • 89C52RC普中单片机

    资料下载 普中科技--各型号产品资料下载链接 - STM8单片机 - 普中开源电子分享网 - Powered by Discuz! (prechin.net) 2023-06-28  1.开发板    2.软件 keil,stc-isp。 1.点亮led 89C52RC芯片LED模块是P2口。       2.led1一秒闪烁  3.LED流水灯  4.独立按键控制led亮灭(按下key1亮,松手灭) 5.独立按键

    2024年02月11日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包