51单片机-LCD1602

2023-05-16

目录

1.硬件设计

1.1.LCD1602介绍

1.2.原理图

2.软件设计

2.1.控制原理

2.2.控制时序

2.3.指令集

2.4.程序设计

3.知识点

3.1.宏定义

3.2.指针与数组

3.3.for语句


1.硬件设计

1.1.LCD1602介绍

  • LCD1602是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。
  • LCD1602主要用来显示数字、字母、图形以及少量自定义字符。可以显示2行16个字符,拥有16个引脚,其中8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节V0和背光源AK
  • 关于LCD的工作原理,结构堆叠等的介绍,可参考如下链接:https://lishiyi.blog.csdn.net/article/details/124106767?spm=1001.2014.3001.5502

1.2.原理图

2.软件设计

  • 硬件分析:分析原理图,了解每个引脚的作用,并配置引脚;
  • 控制原理:单片机是如何控制显示的,在哪个位置显示,显示什么内容?
  • 时序分析:执行的内容是数据,还是指令;是读,还是写....?
  • 指令集:整个程序在执行过程中,又会涉及哪些指令?
  • 实现逻辑:初始化,数据控制.....

2.1.控制原理

  • 通过控制DDRAM来控制数据显示的位置,通过控制CGRAM来控制数据显示的内容;如:在第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码 41H ;

  • 寻址:寻址的意思是在哪个位置去显示数据,控制器内部设有一个数据地址指针,通过它们可以访问内部的全部80个字节RAM(LCD1602的实际显示去只要32个字节),需要在哪个位置显示,就写入对应的RAM地址,其地址映射图如下:

  • 数据:在 LCD 模块上固化了字模存储器,就是CGROM (HD44780 内置了192 个常用字符的字模)和 CGRAM(另外还有 8 个可以自定义的字符产生RAM);所以需要显示什么数据,就可以通过如下字模关系表来选择

2.2.控制时序(写)

  • 写指令:RS=L,RW=L,E=H,D0~D7=指令(有效);
  • 写数据:RS=H,RW=L,E=H,D0~D7=数据(有效);代码如下:
//*写数据,Data为要写入的数据
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;//RS置高电平,代表的是写数据,而不是写指令
	LCD_RW=0;//RW置低电平,代表的是写数据,而不是读数据
	LCD_DataPort=Data;//P0口代表的是要写入的数据内容
	LCD_E=1;//使能,高电平有效
	LCD_Delay();
	LCD_E=0;//使能,低电平截止
	LCD_Delay();
}

2.3.指令集

2.4.程序设计

LCD1602.c文件

#include <REGX52.H>

//*引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0 //宏定义,直接将数据接口替换成P0接口

//*延时函数
void LCD_Delay()
{
	unsigned char i, j;

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

//*写指令,Command为要写入的指令
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;//RS置低电平,代表的是写指令,而不是写数据
	LCD_RW=0;//RW置低电平,代表的是写指令,而不是读指令
	LCD_DataPort=Command;
	LCD_E=1;//使能,高电平有效
	LCD_Delay();//高度电平的使能,转换太快,因此要进行延时
	LCD_E=0;//使能,低电平截止
	LCD_Delay();
}

//*写数据,Data为要写入的数据
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;//RS置高电平,代表的是写数据,而不是写指令
	LCD_RW=0;//RW置低电平,代表的是写数据,而不是读数据
	LCD_DataPort=Data;//P0口代表的是要写入的数据内容
	LCD_E=1;//使能,高电平有效
	LCD_Delay();//高度电平的使能,转换太快,因此要进行延时
	LCD_E=0;//使能,低电平截止
	LCD_Delay();
}

//*初始化
//*显示模式设置:0x38,八位数据接口,两行显示,5*7点阵
//*显示开关及光标设置:0x0C,显示开,光标关,闪烁关
//*输入方式设置:0x06,数据读写操作后,光标自动加一,画面不动
//*清屏设置:0x01,清屏
void LCD_Init(void)
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	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);//第1行,第N列,第1行的起始位置是0x00
	}
	else
	{
		LCD_WriteCommand(0x80|Column-1+0x40);//第2行,第N列,0x40是第2行的起始位置
	}
}

//*显示字符
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
	LCD_SetCursor(Line,Column);//DDRAM地址设置
	LCD_WriteData(Char);//设置要写入的字符数据
}

//*显示字符串
//*这里有用到指针,*String等效于String[],指针指向该字符组的第一个地址,依次显示出来,直到'\0'(结束标志位)的出现
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);//光标位置
	for(i=0;String[i]!=0;i++)
	{
		LCD_WriteData(String[i]);
	}
}

//*次方函数
//*Y=0,返回值Result=1,相当于任何数字的0次方等于1
//*Y=2,for循环执行两次,Result=X*X=X^2
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}

//*显示无符号数字
//*如要显示123,其显示逻辑如下
//*123/10^2%10=1
//*123/10^1%10=2
//*123/10^0%10=3
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);
//*'0'相当于0x30,在Number...前面加上'0',目的就是和ASCII码表对应,显示出要显示的数字
	}
}

//*显示有符号数字
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;//数字大于0的时候,显示Number
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;//数字小于0的时候,显示-Number
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
	}
}

//*显示16进制
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)
		{
			LCD_WriteData('0'+SingleNumber);//小于10显示数字
		}
		else
		{
			LCD_WriteData('A'+SingleNumber-10);	//大于等于10显示字母
		}
	}
}

//*显示二进制
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__

//*以下是.h头文件需要调用的命令
void LCD_WriteCommand(unsigned char Command);//写指令
void LCD_WriteData(unsigned char Data);//写数据
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);//显示16进制
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_ShowChar(1,1,'A');//显示字符A
	LCD_ShowString(1,3,"ABC");//显示字符串ABC
	LCD_ShowNum(1,7,123,3);//显示无符号数字123
	LCD_ShowsignedNum(1,11,-123,3);//显示有符号数字-123
	LCD_ShowHexNum(2,1,0xA1,2);//显示16进制A1
	LCD_ShowBinNum(2,4,0xA1,8);//显示二进制0xA1(10100001)
	LCD_ShowChar(2,13,0xDF);//显示字符°
	LCD_ShowString(1,16,"ABCDEFGHIJKLMN");//显示字符串A~N,超过16位显示区
	
	while(1)
	{
		LCD_WriteCommand(0x18);//光标向左平移一个字符,但光标不动,移屏(流动字幕效果)
		Delay(1000);//防止光标移动速度过快,增加延时
	}
}

3.知识点

3.1.宏定义

  • 宏定义:是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
  • 宏定义和操作符的区别:宏定义是替换,不做计算,也不做表达式求解。宏定义又称为宏代换、宏替换,简称“宏”。在 C 语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。
  • 宏定义的格式:#DEFINE 标识符 字符串
  • 掌握"宏"概念的关键是“换”,一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”,即在对相关命令或语句的含义和功能作具体分析之前就要换。
//*引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0 //宏定义,直接将数据接口替换成P0接口

3.2.指针与数组

引用一个数组元素,可以用以下两种方法:

  • 下标法,如 a[i] 形式;
  • 指针法,如 *(a+i)或 *(p+i)。其中 a 是数组名,p是指向数组元素的指针变量,其初值为 p=a
//*显示字符串
//*这里有用到指针,*String等效于String[],指针指向该字符组的第一个地址,依次显示出来,直到'\0'(结束标志位)的出现
	unsigned char i;
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);//光标位置
	for(i=0;String[i]!=0;i++)
	{
		LCD_WriteData(String[i]);
	}

3.3.for语句

for (表达式1; 表达式2; 表达式3)

  • 表达式1:是初始化步骤,只执行一次
  • 表达式2:是控制表达式,控制循环的终止
  • 表达式3:在每次循环的最后被执行。
  • 执行步骤:首先执行表达式1进行初始化,然后判断表达式2的值是否为真,若为真,则执行循环体,然后执行表达式3;随后再次对表达式2的值进行判断,若为真,则再次执行循环体和表达式3,依次循环直到表达式2的值为0为止。
//*次方函数
//*Y=0,返回值Result=1,相当于任何数字的0次方等于1
//*Y=2,for循环执行两次,Result=X*X=X^2
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机-LCD1602 的相关文章

  • 最简单的 DRM 应用 & drm设备不工作

    https zhuanlan zhihu com p 341895843 https zhuanlan zhihu com p 75321245 编写最简单的 DRM 应用 主程序 xff1a int main int argc char
  • spi通信

    特点 常规四线通信方式 一根片选线 xff0c 一根时钟线 xff0c 两根数据线 xff1a 一根是主进从出线 xff0c 一根主出从入线 同步 xff0c 全双工 xff0c 通信方式 和谁通信就将谁的片选线拉低 xff0c 每增加一个
  • FreeRtos任务通信之消息队列

    入队阻塞 xff1a 往队列写数据时 xff0c 队列满时的阻塞 当阻塞结束时 xff0c 优先级最高的任务优先进入就绪态 xff0c 同 优先级时 xff0c 阻塞时间最长的进入就绪态 出队阻塞 xff1a 读队列时 xff0c 队列为空
  • STM32F103C8T6 ADC功能

    12位逐次逼近型ADC 1us转换时间 输入电压0 3 3v和转化范围0 2 12 1 xff08 0 4095 xff09 成线性关系 2个ADC资源 xff0c ADC1和ADC2 xff0c 10个外部通道 有两种转换单元组 xff1
  • stm32串口实验

    目录 xff08 一 xff09 STM32 串口简介 二 软件设计 xff08 三 xff09 效果 xff1a 1 实现功能 xff1a STM32 通过串口和上位机的对话 xff0c STM32 在收到上位机发过来的字符串后 xff0
  • 基于stm32的GPS解析数据

    目录 1 GPS模块 2 GPS发送的数据格式 3 软件设计 3 1配置好串口 3 2然后写串口中断函数 效果 1 GPS模块 2 GPS发送的数据格式 GPRMC lt 1 gt lt 2 gt lt 3 gt lt 4 gt lt 5
  • 大疆遥控控制M3508电机二(基于HAL库)

    接上一篇文章 xff0c 话不多说直接开始 一 打开我们创建的工程文件 xff0c 先就建立一个文件夹用来存放我们写的子文件 xff08 不建立也行 xff09 xff0c 然后建立pid h xff0c pid c存入我们建立的文件夹中
  • aruco_ros 在相机图像中显示的坐标轴姿态与TF发布的姿态不一致 解决方法

    aruco ros 在相机图像中显示的坐标轴姿态与TF发布的姿态不一致 解决方法 运行环境问题描述解决方案 运行环境 系统版本 xff1a Ubuntu 16 04 ROS版本 xff1a Kinetic 问题描述 在进行手眼标定过程中 x
  • 安装vscode的时候没有勾选快捷方式用vscode打开文件,如何用vscode快速打开文件或者文件夹

    1 需要在注册表里面添加内容可以实现 xff0c 下面有一种简单的方式来完成这个操作 2 需要在电脑桌面新建一个Open File With VS code reg 文件然后用打开文件 xff0c 将以下代码复制 Windows Regis
  • C语言学习笔记->const和define区别

    1 define 是预编译指令 xff0c 而const 是普通变量的定义 define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量在编译运行中使用 2 const定义的是变量 xff0c 而define定义的是常量
  • 基于栈、寄存器的优缺点

    基于栈的优点 xff1a 对硬件的依赖不高 xff0c 跨平台性 缺点 xff1a 使用的指令集高基于寄存器的优点 xff1a 相对于栈来说 xff0c 寄存器的性能高 xff0c 使用的指令集少 Java代码执行流程 xff1a java
  • Makefile文件的编写(实例详解)

    1 什么是Makefile xff1f 一个工程中的源文件不计其数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c Makefile定义了一系列的规则来指定哪些文件需要先编译 xff0c 哪些文件需要后编译 xff0c 哪
  • 用C语言实现万年历的代码及思路(详细教程)

    万年历程序要求 xff1a 1 当选择1的时候 xff0c 输入年 xff0c 打印输入的这一年12月的日历 2 当选择2的时候 xff0c 输入年 月 xff0c 打印输入这一年这一月的日历 实现效果 xff1a 选择1时 span cl
  • 有符号数和无符号数参与运算时的问题

    陷阱题目 xff1a 下面的代码输出是 xff08 xff09 span class token macro property span class token directive hash span span class token di
  • 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一 UDP的概念1 1 UDP1 2 UDP特点 二 采用UDP实现多人聊天室原因三 多人聊天室项目功能四 实现多人聊天室项目流程分析4 1 前期准备4 1 1 定义结构体4 1 2 定义链表 4 2 多人聊天室服务器4 2 1
  • 【C++】C向C++的知识过度(上)

    文章目录 一 C与C 43 43 的区别1 1 C是面向过程的1 2 C 43 43 是面向对象的1 3 编译器的区别 二 C与C 43 43 默认代码的不同三 命名空间3 1 关键字 96 namespace 96 去定义自己的名字空间
  • 【C++】四种类型转换 | C++异常处理机制 | C++11新特性之右值引用和移动构造

    文章目录 一 C 43 43 中的四种类型转换1 1 静态类型转换1 1 1 C 43 43 中内置类型的转换1 1 2 C 43 43 中的有继承关系存在的场景下的类型强转 1 2 动态类型转换1 3 常类型转换1 4 解释类型转换 二
  • 【Linux操作系统】进程详解(上)

    文章目录 一 进程的定义二 进程的特征三 进程的组成及其作用四 进程控制块4 1 进程控制块定义4 2 task struct的内容 五 进程与程序的区别六 进程与线程的区别七 进程的种类八 PID8 1 PID定义8 2 特殊PID的进程
  • 【Linux操作系统】进程详解(下)

    文章目录 前言一 父子进程共用光标问题1 1 验证1 2 规避共用光标问题使用多进程拷贝同一个文件 二 进程相关函数2 1 getpid getppid函数2 2 exit exit函数2 3 wait waitpid函数 三 守护进程3
  • git补丁操作(git diff、git format-patch、git apply、git am)

    https blog csdn net qq 42138454 article details 119058431 实际使用补丁用的 xff1a patch p1 lt device nuwa diff 一 打补丁的两种方法 Git 提供了

随机推荐

  • 三、C++ 链接器 linker

    cilinking 从C 43 43 源码到可执行二进制的过程 compile文件之后进行链接 xff0c 找到每个符号 函数的位置 xff0c 并将其链接在一起 每个文件被编译成一个独立的 obj文件作为translation unit
  • 五、C++中的头文件 Header Files

    头文件 Header Files传统上用于声明某些函数类型 xff0c 以便可以用于整个程序中 例如 xff1a 在一个文件1中创建函数 xff0c 然后想在另一个文件2中使用 xff0c 尝试编译此文件2时 xff0c C 43 43 不
  • 六、如何使用VS调试代码、条件语句

    how to use Visual Studio to debug our code 查看程序断点 调试程序 1 设置断点 断点 xff0c 调试器将中断 xff0c break xff0c 程序调试是将会中断 xff0c continue
  • 七、如何设置C++项目 set up C++ project

    Visual Studio设置项目文件目录 组织项目文件 打开Visual Studio Start Page 起始页 xff0c 新建项目 New Project xff0c C 43 43 下的General Empty Project
  • 八、C++中的循环 for while do...while及控制流语句

    xff08 1 xff09 for while do while循环 简单来讲 xff0c 循环就是多次执行同样的代码 例 xff0c 如何输出重复内容多次 xff1a 代码复制多次 xff1b 写个函数调用多次 xff1b 写循环重复执行
  • 九、C++ 指针 pointer 引用 Reference

    原始指针 raw pointer 非智能指针 smart pointer 指针是一个整数 xff0c 一个数字 xff0c 它存储一个内存地址 创建指针 xff1a void ptr 61 0 void指针表明不关心指针存储地址的数据类型
  • 基础电路-电子电路

    1 1 电流 xff1a 在导体的两端加上电压 xff0c 导体的电子就会在电场的作用下做定向运动 xff0c 形成电子流 xff0c 称之为 电流 xff1b 电流方向和电子移动方向相反 xff1b 电流有直流和之分 1 2 电压 xff
  • CTP工作原理及结构

    1 工作原理 自容TP xff1a 自电容的扫描方式是进行逐行扫描 xff0c 所有通道既是感应通道也是驱动信号通道 xff0c 通过对比触摸前后电容量的变化来判定X Y方向坐标 xff0c 然后组合成触摸点的坐标 互容TP xff1a 互
  • LCD工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 LCD堆叠结构 xff1a 背光 xff0c 下偏光片 xff0c TFT Glass xff0c CF Glass
  • OLED工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 OLED堆叠结构 xff1a 相比LCD xff0c OLED没了背光和下偏光片 4 OLED发光原理 xff1a
  • Git Fork操作与配置

    https blog csdn net Lu Ca article details 128612125 我理解的git fork xff1a 将别人 xff08 张三 xff09 仓库包括文件 xff0c 提交历史 xff0c issues
  • 背光的工作原理及结构

    1 什么是背光 xff1a LCD本身是不发光的 xff0c 因此它需要一个外部面光源系统来帮助其显示 xff0c 即背光源 xff08 Backlight xff09 xff1b 2 背光的种类 xff1a 从发光类型来分 xff0c 可
  • Microled简介及关键工艺(巨量转移)

    1 什么是Microled xff1f 通俗来讲 xff0c 将作为发光器件LED用作显示屏的像素 xff0c 固这种LED的尺寸就得做得很小 xff08 约 xff1c 100 m xff09 xff0c 这种技术就是Microled x
  • 数字电路基础-逻辑门电路

    1 门电路的概念 实现基本逻辑运算和复合运算的单元电路称为门电路 xff0c 常用的门电路有非门 与非门 或非门 与非门 与或非门等 2 基本逻辑门电路 a 与门 xff1a 全1出1 xff0c 有0出0 工作原理 xff1a 输入A B
  • 51单片机-控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 点亮一颗LED灯 2 2 LED闪烁 2 3 LED流水灯 3 知识点 3 1 while函数的应用 3 2 常用数据类型 3 3 延时函数的自动生成 1 硬件设计 通过原理图分析 xff0c LE
  • 51单片机-74HC595移位寄存器

    目录 1 74HC595芯片介绍 1 1 引脚定义 1 2 工作原理 2 实际应用 2 1 控制数码管 2 2 点阵屏显示图形 2 3 点阵屏显示动画 3 知识点 3 1 位变量 xff08 sbit bit xff09 3 2 字模提取
  • 51单片机-独立按键控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 独立按键控制LED闪烁 2 2 独立按键控制LED状态 2 3 独立按键控制LED显示二进制 2 4 独立按键控制LED移位 3 知识点 3 1 if语句的运用 3 2 常用运算符 1 硬件设计 轻
  • 51单片机-控制数码管

    目录 1 硬件设计 1 1 LED数码管介绍 1 2 原理图设计 2 软件设计 2 1 静态数码管显示 2 2 动态数码管显示 2 3 模块化编程 xff08 头文件 xff09 3 知识点 3 1 数组 3 2 子函数 3 3 switc
  • LCD的制作工艺

    目录 1 LCD简介 2 LCD制程 2 1 Array制程 2 1 1 像素电路 2 1 2 制程简介 2 2 Cell制程 2 3 Module组装 3 总结 1 LCD简介 LCD是目前显示领域的重要组成部分 xff0c 可通过如下链
  • 51单片机-LCD1602

    目录 1 硬件设计 1 1 LCD1602介绍 1 2 原理图 2 软件设计 2 1 控制原理 2 2 控制时序 2 3 指令集 2 4 程序设计 3 知识点 3 1 宏定义 3 2 指针与数组 3 3 for语句 1 硬件设计 1 1 L