单片机学习笔记---LCD1602功能函数代码

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

目录

LCD1602.c

模拟写指令的时序

模拟写数据的时序

初始化

显示字符

显示字符串

显示数字

显示有符号的数字

显示16进制数字

显示二进制数

LCD1602.h

main.c


上一篇讲了LCD1602的工作原理,这一节开始代码演示!

新创建工程:LCD1602功能函数代码

新创建main.c,LCD1602.c和LCD1602.h文件

开始代码讲解:

LCD1602.c

先根据原理图声明一下这三个控制引脚和八个数据引脚

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

#include <REGX52.H>

//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0

然后根据上一篇讲的时序逐个定义函数

模拟写指令的时序

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

首先是写指令

void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;//写指令是低电平
	LCD_RW=0;//写
	LCD_DataPort=Command;//将指令放在数据口Data port上
	LCD_E=1;//使能
	LCD_Delay();//延时1ms
	LCD_E=0;//关闭使能
	LCD_Delay();//延时1ms
}

由于E等于高电平是时间太快了,我们看到手册上的时序参数都是纳秒级的,单片机最低是微秒级的。

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

我们写指令得需要一定的执行时间,如果E的电平给高立马给低的话,如果太快的话可能读不过来

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

因此我们需要在E=1之后加一段延时,E=0之后也加一段延时。

我们在STC软件上生成一个1ms的延时函数

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

放在写指令的函数上方,将函数名改成LCD_Delay()

void LCD_Delay()		//@12.000MHz 1ms
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

这样我们就可以直接调用这个延时函数了

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

模拟写数据的时序

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

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();
}

接下来我们把这两个函数组合起来根据LCD1602的操作流程完成我们想要的功能!

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

初始化

void LCD_Init(void)
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0C);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}

显示字符

显示字符之前我们得设置光标位置

void LCD_SetCursor(unsigned char Line,unsigned char Column)//行,列
{
	if(Line==1)//如果是第一行
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else //如果是第二行
	{
		LCD_WriteCommand(0x80|(Column-1)+0x40);
	}
}

如果是第一行,用0x80或上列码-1

如果是第二行,用0x80或上列码-1,再+0x40

(如果不知道0x80是什么请看上一篇博客的解释)

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件设置好光标位置后开始写显示字符函数 

void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
                        //        行,                列,         显示的字符
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

但是显示字符在实际的应用中还是远远不够的,我们可以让它显示别的东西

比如

显示字符串

void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
//传过来的unsigned char*型指针代表字符串的首地址

{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)//遍历字符数组
	{
		LCD_WriteData(String[i]);
	}
}

显示数字

由于不能直接显示数字,得先转换成字符然后再显示,

比如传过来的数字是789,那么我们得对789进行转换成字符7,字符8,和字符9再显示

怎么转换呢?

先挨个位取出来数字7,数字8,数字9

789/100=7.89,对7.89取余7.89%10=7(取出来了高位)

789/10%10=8(取出来第二位)

789/1%10=9(取出来最低位)

我们按照这个方法从高位开始取

我们得弄个长度的变量 i,i 和取整时的除数的关系是:

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

于是我们可以先定义一个次方函数,通过这个函数我们就可以得到返回值等于x的y次方

int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;//如果Y=0,则下面的i<Y直接不成立,直接返回1,符合任何数的0次方等于1的规则
	for(i=0;i<Y;i++)
	{
		Result*=X;
    //如果Y=1,结果等于1*X就等于X的1次方
    //如果Y=2,结果等于1*X*X等于X的2次方
	}
	return Result;//返回值等于x的y次方
}

我们用这个规律Number/LCD_Pow(10,i-1)规律取出来的是数字,想要显示成字符的话,要将数字转换成对应的ASCII码值。怎么转换呢?

我们看着ASCII码表找规律

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

由此可见,我们想要将一个数字转换成对应的ASCII码值的话可以将它本身的二进制数值加上0x30,也就是字符'0"的ASCII码值就能得到它的ASCII码值了

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

于是就写成'0'+Number/LCD_Pow(10,i-1)%10

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);
        //Number/LCD_Pow(10,i-1) 10=X,i-1=Y
	}
}

显示有符号的数字

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;//变成正数范围是32768,为了保证范围则需要赋给一个无符号的int型
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
	}
}

显示16进制数字

如果是16进制了话就不是除以10除以100这样子了,而是除以16再对16取余

所以改成Number/LCD_Pow(16,i-1)%16;

而且16进制从0~F:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f

而A的ASCII码值不是紧接着9的,所以当数字大于等于10的话要用 if 判断一下

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

并且这时就不是加0x30了,要改成加上0x41,即 'A' 的ASCII码值

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

我们将取出来的单个数字(定义成SingleNumber)+‘A’,但是当取出来的SingleNumber大于等于10的话,我们将它+‘A’就会偏移10。

比如说SingleNumber=10,那么它的二进制数是0100 1010,加上‘A’的ASCII码0100 0001, 而我们想要SingleNumber是A的话就得减去10。

如果说SingleNumber=11,那么它的二进制数是0100 1011,加上‘A’的ASCII码0100 0001, 而我们想要SingleNumber是B的话就得减去10。

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

因此'A'+SingleNumber-10

void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned 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;//取出单个数值
		if(SingleNumber<10)//如果单个数值小于10
		{
			LCD_WriteData('0'+SingleNumber);
		}
		else //如果单个数值大于等于10
		{
			LCD_WriteData('A'+SingleNumber-10);
		}
	}
}

显示二进制数

二进制的话就改成除以2和%2,Number/LCD_Pow(2,i-1)%2

取出来之后加上'0'的ASCII码就是对应的字符了

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

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('0'+Number/LCD_Pow(2,i-1)%2);
	}
}

LCD1602.h

然后声明一下这些函数

#ifndef __LCD1602_H__
#define __LCD1602_H__

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
	while(1)
	{
	}
}

效果请看视频:

LCD1602液晶显示屏

补充:

如果想要做流动字幕的效果的话,我们可以调用这个指令码0x18

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

将写指令的函数声明为外部可调用函数

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

然后在主程序中调用这个函数,传这一个移屏指令过去,放在while循环里面,调用一次,移一次

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

但是这样太快了,我们可以把我们之前讲过的Delay的模块化程序添加进来,每移一次就Delay 500ms

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

单片机学习笔记---LCD1602功能函数代码,51单片机学习笔记,单片机,学习,笔记,51单片机,mcu,物联网,嵌入式硬件

效果请看视频:

LCD1602液晶屏显示流动字幕

以上就是本节内容,源码会放在评论区,如有问题可评论区留言! 文章来源地址https://www.toymoban.com/news/detail-827544.html

到了这里,关于单片机学习笔记---LCD1602功能函数代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 单片机lcd1602的显示

    首先,你需要了解LCD1602的引脚功能。LCD1602有16个引脚,其中包括: Gnd:电源地脚 Vcc:5V电源正极 VL:液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高 RS:寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器 RW:读写信号线,高电平(

    2024年01月17日
    浏览(39)
  • 51单片机LCD1602的使用

    本篇文章将为大家讲解LCD1602的使用方法。 LCD1602是一种常用的液晶显示器,它的原理是通过液晶分子的振荡来控制显示内容的。液晶分子在电场的作用下,会发生振荡,从而改变液晶分子的极性,从而控制显示内容。液晶显示器的控制电路会根据输入的信号,控制电场的强度

    2024年02月06日
    浏览(37)
  • 五一单片机之LCD1602

    👻1.LCD1602的介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模板,是一种字符型液晶显示模板,可以显示ASCll码的标准字符和其他的一些内置特殊字符还可以有8个自定义字符 显示容量:16*2个字符,每一个字符是5*7的点阵 (对于字符,其实每一个像素点是有

    2024年02月04日
    浏览(46)
  • 【【51单片机LCD1602模块介绍】】

    显示容量16x2 每个字符是5x7的点阵 VDD 是电源正极 4.5-5.5v VO 是对比度调节电压 RS 数据/指令 选择 1为数据0为指令 RW 读写选择1是读 0为写 E 使能 1为数据有效 下降沿执行命令 D0-D7 数据输入输出 A 背光电源正极 K 背光电源负极 LCD1602的操作流程 1.初始化: 发送0x38//八位数据接口,

    2024年02月15日
    浏览(35)
  • 51单片机LCD1602调试工具

    参考视频:江协科技51单片机 LCD1602头文件代码 LCD1602 C语言文件 LCD1602主函数文件

    2024年01月24日
    浏览(54)
  • 51单片机矩阵键盘——LCD1602显示

    本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86404949 使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用

    2023年04月09日
    浏览(42)
  • 51单片机(五)LCD1602调试工具

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2023年04月27日
    浏览(57)
  • MCU-51:单片机LCD1602详解

    LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:16×2个字符,每个字符为5*7点阵 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应

    2023年04月09日
    浏览(85)
  • 51单片机 | LCD1602 液晶显示实验

      在前面章节,我们已经学习过几种显示装置,例如静态数码管、动态数码管、 8*8LED 点阵、串口通信。使用它们可以直观显示一些字符数据,但是它们也有各种局限性,比如显示字符数据太少,硬件设计复杂、代码编写难度大等。这一章就来介绍一种非常简单且常用的显

    2023年04月11日
    浏览(60)
  • 【单片机】16-LCD1602和12864和LCD9648显示器

    (1)显示器,常见显示器:电视,电脑 (2)LCD(Liquid Crystal Display),液晶显示器,原理介绍 (3)LCD应用领域:手机,电脑 (4)将来取代LCD:LED,OLED【全面屏---软性】 1.像素(分辨率) 显示单元【液晶分子】 但是实际上: 像素!=分辨率 比如:出厂时电脑的像素已经确

    2024年02月08日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包