51单片机 LCD1602

2023-11-08

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);
			}
	
	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机 LCD1602 的相关文章

  • 关于pads生产文件的导出

    1 solder mask solder mask 是阻焊层出的是负片 它的设置一般如图所示 这个是一般常规设置 如果器件焊盘已经专门做了阻焊焊盘 则可以按如图所示设置 如果选择top层焊盘 设备设置可以选择缩放为4 如果选择solder
  • EVE-NG网卡桥接,带您走进更高级的实验

    原帖地址 http www mamicode com info detail 1819599 html 一 给EVE NG添加虚拟的物理网卡 不管什么样的网卡 方法都类似 为什么说是虚拟的物理网卡呢 这个VMnet1网卡本身就是虚拟出来的
  • 一篇文章让你了解大数据挖掘技术

    大数据如果想要产生价值 对它的处理过程无疑是非常重要的 其中大数据分析和大数据挖掘就是最重要的两部分 在前几期的科普中 小编已经为大家介绍了大数据分析的相关情况 本期小编就为大家讲解大数据挖掘技术 让大家轻轻松松弄懂什么是大数据挖掘技术 什
  • 01 Datafountain_云状识别_top1

    01 Datafountain 云状识别 top1 摘要 1 云状识别算法总体思路和架构 2 云状识别算法具体实现过程 2 1 图像增强 2 2 多图像尺寸训练 2 3 选用densenet161预训练模型进行fine tune 2 4 差

随机推荐

  • Kotlin-Retrofit2和Rxjava2的网络封装,展示Github的用户信息

    目录 开始 1 先添加依赖 2 封装请求类 3 RESTful API请求响应的处理 4 线程与生命周期 5 使用 效果如下 开始 1 先添加依赖 Retrofit相关 implementation com squareup okhttp3
  • git did not exit cleanly (exit code 128) 的解决办法

    问题描述 在新建一个空的本地git仓库后 打算将远程仓库中的代码Pull到本地时异常 具体异常内容如下 git exe pull progress v no rebase origin masterPOST git upload pack
  • CRC-16校验原理

    1 循环校验码 CRC码 是数据通信领域中最常用的一种差错校验码 其特征是信息字段和校验字段的长度可以任意选定 2 生成CRC码的基本原理 任意一个由二进制位串组成的代码都可以和一个系数仅为 0 和 1 取值的多项式一一对应 例如 代码10
  • 【LeetCode】349. 两个数组的交集

    题目 给定两个数组 编写一个函数来计算它们的交集 示例 1 输入 nums1 1 2 2 1 nums2 2 2 输出 2 示例 2 输入 nums1 4 9 5 nums2 9 4 9 8 4 输出 9 4 说明 输出结果中的每个元素一定
  • Go语言面试题--基础语法(14)

    文章目录 1 切片 a b c 的长度和容量分别是多少 2 下面代码中 A B 两处应该怎么修改才能顺利编译 3 下面代码输出什么 1 切片 a b c 的长度和容量分别是多少 func main s 3 int 1 2 3 a s 0 b
  • 【科普向】谁都能看懂的CRC(循环冗余校验)原理

    CRC原理 简介 CRC基本原理 模二运算 二进制系数多项式 CRC算法 示例 CRC算法的数学描述 常用CRC版本 CRC算法的编程实现 简介 循环冗余校验 Cyclic Redundancy Check CRC 是一种根据网络数据包或计
  • MySQL - MySQL 8.0(二)基本操作:用户

    文章目录 前言 查看当前登录用户 一 创建用户 1 语法介绍 2 创建 dbadmin 用户 仅做了解 二 授予和撤销用户的访问权限 1 授予权限 2 检查授权 3 撤销权限 题外话 修改 mysql user 表 三 修改密码 身份验证插
  • 浅显易懂的GCC使用教程——初级篇

    浅显易懂的GCC使用教程 初级篇 2018 12 17天气暖 属于冬日里出太阳 最近在学习使用gvim 想着抛弃对IDE的依赖同时也是想了解编译的过程 但除了学习gvim繁多的指令外还得先学习使用gcc编译程序 这篇文章将会用浅显易懂的方式
  • [IDEA] 异常 Configuration is still incorrect. Do you want to edit it again? Error: module not specifie

    在Idea打开项目出现 Configuration is still incorrect Do you want to edit it again 的错误提示 点Edit 出现 Error module not specifie 问题 产生
  • el-input使用clearable,:title,MessageBox弹框外部关闭,el-Dropdown 下拉菜单详细举例,el-table的show-overflow-tooltip是什么?

    近期在工作中改测试提出的一些bug 有时候同样一个bug却忘了上一次怎么改的 特此总结分享 1 关于el input使用clearable属性即可得到一个可清空的输入框 2 由于clearable属性引发的一个小bug 如例图 蓝色部分后面
  • OpenCV:判断读取图片是否成功

    摘要 当用imread 读取图片时 如果图片路径错了 或者图片名称 又或者后缀格式错误 程序都会报错 基于这个问题 有时候我们不知道是读取图片失败而报错 会误以为是其它行代码出错了 所以 经常读取图片后 会进行判断图片是否读取成功 如果读出
  • iOS-对于把图片渲染成蓝色的修改方法

    在之前开发的过程中 遇到过这样一个小问题 给button设置一张图片 图片是灰色 美工做的图肯定没有问题 给button设置图片的方法也很简单 一句代码搞定 但是运行的时候却发现 图片无缘无故变成了蓝色 后来自己研究了一下发现 在给一些控件
  • cuDNN下载

    cuDNN下载网址 https developer nvidia com rdp cudnn download 按顺序点击可以看到与cuda相对应版本 点击对应cuda版本的cuDNN下载 例如CUDA11 4对应的版本
  • C语言入门初识(中)

    C语言入门初识 中 常量 常量的分类 1 字面常量 2 const修饰的常变量 3 define 定义的标识符常量 4 枚举常量 字符串 转义字符 注释 字符串 C常用格式转换说明符 转义字符 注释 选择语句与循环语句 选择语句 循环语句
  • 第四次作业

    作业要求 https edu cnblogs com campus hljkj CS201801 homework 2523 预习 1 数组视频全看了 2 学到了一维数组和二维数组 如何定义使用数组 3 数组的排序 不能熟练使用二维数组 只
  • 微信小程序 七天签到组件

    组件效果 组件gitee地址 https gitee com liu bao yi sign in 使用 1 将dk calendar文件夹放进components文件夹内 2 页面json文件引入该组件 usingComponents d
  • 【深入理解Kafka系列】第五章 日志存储

    前几章已经讲解了kafka的基本知识 我们已经能较好的用kafka来完成基本的开发任务 接下来了解一下内部的一些细节 便于知道相关的原理 本章主要讲kafka日志存储相关的知识 1 文件目录布局 回顾之前所学的知识 Kafka 中的消息是以
  • 在ESP32/ESP8266上使用MicroPython利用MQTT发布BME280传感器数据(温度,湿度和压力)

    了解如何使用MicroPython对ESP32或ESP8266板进行编程 以通过MQTT将BME280传感器读数 温度 湿度和压力 发布到支持MQTT或任何MQTT客户端的任何平台 例如 我们将传感器读数发布到Node RED仪表板 注意
  • 神州交换机路由器AC和AP基本配置

    交换机部分 两层和三层交换机清除所有配置的命令 Set default 清除配置 Write 保存 Reload 重启 交换机打开网站管理 http 两层 config ip http server config Web user xxx
  • 51单片机 LCD1602

    LCD1602 H ifndef LCD1602 H define LCD1602 H 用户调用函数 void LCD Init void LCD ShowChar unsigned char Line unsigned char Colu