51单片机 LCD1602

2023-09-16 18:40:12

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

应用

#include <REGX52.H>
#include "LCD1602.H"

#include "INTRINS.H"

void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--){
			_nop_();
			i = 2;
			j = 199;
			do
			{
				while (--j);
			} while (--i);
	}


}

int i=0;
void main(){
			LCD_Init();

		
			LCD_ShowString(1,3,"Hello World!");
		
			while(1){
				i++;
				Delay(1000);
				LCD_ShowNum(2,2,i,3);
			}
	
	
}
更多推荐

vue国际化教程

需求背景项目需求要做国际化,结果网上找了好几篇文章,没有一个可以一次性搞定,现在这里总结一下。首先,我们分为两部分处理,一个是前端页面的静态文字,这个由前端vue.json自行处理。第二部分就是后端的错误消息和日志部分,我们由springboot的拦截器来处理。i18n介绍i18n(其来源是英文单词internatio

说说hashCode() 和 equals() 之间的关系?

每天一道面试题,陪你突击金九银十!上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于“hashCode()和equals()之间的关系?”的面试题,本篇来解析一下这道基础面试题。先祭一张图,可以思考一下为什么?介绍equals()的作用是用来判断两个对象是否相

第二证券:算力概念强势拉升,竞业达涨停,南凌科技等大涨

算力概念20日盘中强势拉升,到发稿,竞业达涨停,南凌科技涨近10%,拓维信息涨近9%,亚康股份、神州数码涨约5%,青云科技涨逾4%。音讯面上,9月19日,国际大学生程序设计竞赛(ICPC)官网披露了华为创始人兼CEO任正非与ICPC基金会及金牌获得者的谈话纪要。任正非表明,我们行将进入波澜壮阔的第四次工业革命,其规划之

Denoising diffusion implicit models 阅读笔记

Denoisingdiffusionprobabilisticmodels(DDPMs)从马尔科夫链中采样生成样本,需要迭代多次,速度较慢。Denoisingdiffusionimplicitmodels(DDIMs)的提出是为了加速采样过程,减少迭代的次数,并且要求DDIM可以复用DDPM训练的网络。加速采样的基本思

许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?

所有商业战略的本质是围绕着竞争优势与竞争效率展开的。早期,所有品牌立足于从局部竞争优势出发。因此,品牌创建初期大多立足于单个品类。后期增长受限,就要跨品类持续扩大竞争优势,将局部竞争优势转化为长期竞争优势,如果固化不前很难获得增长,也无法成为“链主品牌”。当品类缩量,制造型企业要跨品类打造份额产品第一,聚焦的品类处于增

数据库设计步骤

一、数据库设计重点:有效存储、高效访问1、为什么要进行数据库设计:(1)减少数据冗余;(2)避免数据异常维护;(3)节约存储空间;(4)高效访问;二、数据库设计步骤1、需求分析;2、逻辑设计:ER图等建模;3、物理设计:根据每种数据库特点设计;4、维护优化;三、为什么要进行需求分析1、了解系统中所要存储的数据;2、了解

基于本地持久内存的并行一致性哈希文件系统CHFS

摘要CHFS是一个利用计算节点的持久内存的自适应并行文件系统。该设计完全基于高度可扩展的分布式键值存储,采用一致性哈希算法。CHFS通过消除专用元数据服务器、顺序执行和集中式数据管理,提高了并行数据访问性能和元数据性能的可扩展性。该实施利用了多核和多核CPU、高性能网络和Mochi-Margo库的远程直接内存访问。在一

操作系统备考学习 day3 (2.1.1 - 2.1.6)

操作系统备考学习day3二、进程与线程2.1进程与线程2.1.1进程的概念和特征2.1.2进程的状态与转换2.1.3进程的组织2.1.4进程控制2.1.5进程间通信(IPC)2.1.6线程和多线程模型二、进程与线程2.1进程与线程2.1.1进程的概念和特征进程:是动态的,是程序的一次执行过程。同一个程序多次执行会对应多

C++数据结构 -- 哈希表

目录一、哈希概念二、哈希冲突三、哈希函数四、减少哈希冲突常用的方法4.1闭散列4.1.1闭散列的开放定址法的增容4.1.2闭散列的开放定址法的哈希结构的实现4.3开散列4.3.1开散列概念4.3.2插入元素4.3.2删除元素4.3.3开散列的哈希桶的增容4.3.4开散列的哈希桶(拉链法)代码实现4.3.5关于开散列的思

过拟合和欠拟合:机器学习模型中的两个重要概念

文章目录🍋引言🍋过拟合和欠拟合的概念🍋过拟合和欠拟合的影响与危害🍋过拟合和欠拟合的原因与解决方法🍋过拟合和欠拟合的研究现状与发展趋势🍋过拟合&欠拟合---案例🍋总结🍋引言在机器学习模型中,过拟合和欠拟合是两种常见的问题。它们在模型训练和预测过程中扮演着重要的角色。了解过拟合和欠拟合的概念、影响、解决方法

【SQL】S0 系列博文大纲

系列博文大纲SQL学习环境建议系列博文相关书籍系列博文大纲阶段进展SQL学习环境建议对于SQL语言的学习,博主本地使用:MySQL+DataGrip;MySQL提供本地数据库服务;DataGripIDE,承担编程运行测试任务;DataGrip与Pycharm同属于Jetbrains公司开发IDE产品,个人感觉非常好用,

热文推荐