首页 > 其他分享 >51单片机之LCD1602调试工具

51单片机之LCD1602调试工具

时间:2024-08-18 20:54:12浏览次数:14  
标签:Column 51 unsigned char 单片机 LCD LCD1602 Line

一、LCD1602介绍

使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。

LCD1602是一种能够同时显示16x02(2行16列)即32个字符的液晶显示屏,也被称为1602字符型液晶。

38e277bd537c449fbc311688a81d3c79.jpeg

本篇文章提供的LCD1602代码属于模块化的代码,使用者只需要知道所提供函数的作用和使用方法就可以很容易的使用LCD1602。

02ac18b2b61f4a0eab5af2bd3dcf88ef.jpeg

二、 LCD1602的接法

将LCD1602插到开发板短的排孔上

63202a8e419c456da13dbcd7f60afe02.jpeg

插好后屏幕上显示如下图标,上面一排灯全亮,下面全部熄灭

6951bbb39e6c478c8291e902a41ef06a.jpeg

用螺丝刀调节排孔下面的蓝白色的电位器可以改变屏幕的亮度。

 三、LCD1602原理图

d44c175a4c334b3fa48579259e5dedeb.png

  • GND:地电源。
  • VCC:接5V正电源。
  • VO:液晶显示器对比度调整端,通过外接电位器调整对比度。
  • RS:寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
  • RW:读写信号线,高电平时进行读操作,低电平时进行写操作。
  • E:使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。
  • D0~D7:8位双向数据线,用于数据传输。

 

bf6d1f3fdabf439eacd0629ac2664abf.png 由以上两张原理图可知,LCD1602的引脚和LED、数码管有冲突,有的LED灯会亮,数码管会有显示,不用管就可以了,只要屏幕上的显示是正确就没问题。

四、 LCD1602使用

4.1 LCD1602驱动代码

所需要的.c和.h文件如下

LCD1602.h:

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,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

LCD1602.c: 

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

直接复制粘贴分别添加进工程就可以使用了。

09be19afbe604963a70d0023eca2c126.png

4.2 代码示例

#include <REGX52.H>
#include "LCD1602.h"
int main()
{
	LCD_Init();
	LCD_ShowChar(1,1,'A');
	LCD_ShowString(1,3,"Hello");
	LCD_ShowNum(1,9,123,3);
	LCD_ShowSignedNum(1,13,-66,2);
	LCD_ShowHexNum(2,1,0xA8,2);
	LCD_ShowBinNum(2,4,0xAA,8);
	while(1)
	{

	}
}

对应的实验现象:

3371a9cf8591404488fc0581e5aa6f86.jpeg 

 

 

标签:Column,51,unsigned,char,单片机,LCD,LCD1602,Line
From: https://blog.csdn.net/2302_77770138/article/details/141190605

相关文章

  • Leetcode每日一题 20240818 551.学生出勤记录Ⅰ
    题目描述给你一个字符串s表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:‘A’:Absent,缺勤‘L’:Late,迟到‘P’:Present,到场如果学生能够同时满足下面两个条件,则可以获得出勤奖励:按总出勤计,学生缺勤(‘A’)严......
  • 551.学生出勤记录Ⅰ
    1.题目描述给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:'A':Absent,缺勤'L':Late,迟到'P':Present,到场如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:按 总出勤 计,学生缺勤('A')严格 ......
  • P5176 公约数
    P5176公约数\[ans=\sum_{i=1}^{m}\sum_{j=1}^{m}\sum_{k=1}^{p}gcd(ij,jk,ik)\timesgcd(i,j,k)\times(\frac{gcd(i,j)}{gcd(i,k)\timesgcd(j,k))}+\frac{gcd(j,k)}{gcd(i,k)\timesgcd(i,j)}+\frac{gcd(i,k)}{gcd(i,j)\timesgcd(j,k)})\]$\quad$《这东......
  • 代码随想录算法训练营day09|151.翻转字符串里的单词,卡码网:55.右旋转字符串,28.实现 str
    151.翻转字符串里的单词题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/暴力removeExtraSpaces:voidremoveExtraSpaces(string&s){for(inti=s.size()-1;i>0;i--){if(s[i]==''&&s[i]=......
  • 51单片机学习记录-12-直流电机(PWM脉冲宽度调制)
    1直流电机介绍直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转直流电机主要由永磁体(定子)、线圈(转子)和换向器组成除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等2电机驱动电路(1)大功率器......
  • P8518 [IOI2021] 分糖果 题解
    DescriptionKhong阿姨正在给附近一所学校的学生准备\(n\)盒糖果。盒子的编号分别为\(0\)到\(n-1\),开始时盒子都为空。第\(i\)个盒子\((0\leqi\leqn-1)\)至多可以容纳\(c[i]\)块糖果(容量为\(c[i]\))。Khong阿姨花了\(q\)天时间准备糖果盒。在第\(j\)天......
  • 世微AP5125 外置MOS管5-150V 8A平均电流型LED降压恒流驱动器 SOT23-6 手电筒与车灯方
    产品描述AP5125是一款外围电路简单的Buck型平均电流检测模式的LED恒流驱动器,适用于8-100V电压范围的非隔离式大功率恒流LED驱动领域。芯片采用固定频率140kHz的PWM工作模式,利用平均电流检测模式,因此具有优异的负载调整率特性,高精度的输出电流特性。AP5125......
  • [ABC351F] Double Sum
    原题链接题解方法一:双重循环,\(O(n^2)\)方法二:顺序遍历\(i\),然后查找目前所有比\(a_i\)小的数,这是一个比较经典的树状数组的运用时间复杂度\(P(n\logA)\)考虑优化,由于\(A\)可以达到\(1e8\),而\(n\)只有\(4e5\),所以我们可以对数据做离散化处理code#include<bi......
  • 1289、仿真-51单片机垃圾分类处理电机控制手自动模式蜂鸣器报警设计
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、Proteus仿真三、程序源码四、资料包括一、设计功能1、单片机型号:STC89C52/51、AT89C52/51、AT89S52/51都可通用。2、分为手动模式和自动模式,通过按键“模式”切换。 3、当在手动模式下,按下......
  • 1290、仿真-51单片机mlx90614传感器非接触红外测温计
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、Proteus仿真三、原理图四、程序源码五、资料包括一、设计功能1、单片机型号:STC89C52/51、AT89C52/51、AT89S52/51都可通用。2、通过mlx90614传感器实现红外测温(由于proteus仿真软件上没有该......