51单片机入门_江协科技_31~32_OB记录的自学笔记_LCD1602液晶显示屏

31. LCD1602

  • 31.1. LCD1602介绍
    •LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
    •显示容量:16×2个字符,每个字符为5*7点阵

  • 31.2. 引脚及应用电路
    接线D0~D7与单片机P口高低位对齐
    在这里插入图片描述

  • 31.3. 内部结构框图
    CGRAM CGROM类似段码表,RAM可写,ROM不可写;
    DDRAM用户可写,DDRAM40x2,比屏幕大,但是前16映射屏幕;多出来的可以移屏显示;
    AC光标位置,地址计数器,指令确定AC的位置

在这里插入图片描述

  • 31.4. 存储器结构
    举例A的索引码:0100 0001 B, 0x41,上方的索引码填入到左侧的xxxx中
    索引码同ASIC码

在这里插入图片描述

  • 31.5. 时序结构(写的时序结构)
    RS=1(数据);RS=0(指令)
    RW=0;
    DB0~DB7放好数据;
    E=1写入数据;
    E=0完成写入;
    在这里插入图片描述

  • 31.6. LCD1602指令集
    下表是指令的格式,指令集;
    原LCD1602程序中显示(行,列,xxx)就是在设置DDRAM地址,光标位置;

在这里插入图片描述

  • 31.7. LCD1602操作流程
    •初始化:
    发送指令0x38 //八位数据接口,两行显示,5*7点阵
    发送指令0x0C //显示开,光标关,闪烁关
    发送指令0x06 //数据读写操作后,光标自动加一,画面不动
    发送指令0x01 //清屏

    •显示字符:
    发送指令0x80|AC //设置光标位置//实际地址最高为必须置1代表是地址设置的指令
    发送数据 //发送要显示的字符数据
    发送数据 //发送要显示的字符数据
    ……

  • 31.8. 字符、字符串
    •字符:根据一定规则建立的数字到字符的映射(ASCII码表)
    例如:0x21=’!’,0x41=’A’,0x00=’\0’
    定义方法:char x=‘A’;(等效于char x=0x41;)
    •字符数组:存储字符变量的一个数组
    定义方法:char y[]={’A’, ’B’, ’C’};
    (等效于char y[]={0x41,0x42,0x43}; )
    •字符串:在字符数组后加一个字符串结束标志,本质上是字符数组
    定义方法:char z[]=”ABC”;(等效于char z[]={’A’, ’B’, ’C’, ’\0’};)

32. LCD1602显示模块编程

  • 32.1. 编程思路:

    • 需要编写LCD写数据模块和写命令模块
    • 编写LCD初始化模块
    • 编写LCD光标位设置模块
    • 编写LCD_ShowChar显示单字节模块
  • 32.2. LCD1602.c和LCD1602.h程序如下:

#include <REGX52.H>

sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0

/*定义一个1ms延时函数*/
void LCD_Delay(void)	//@12.000MHz, 1ms延时
{
	unsigned char data i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
/*LCD写命令函数*/
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_E=1;
	LCD_Delay();			//如果不延时会出错
	LCD_E=0;
	LCD_Delay();			//如果不延时会出错
}
/*LCD写数据函数*/
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();			//如果不延时会出错
}
/*LCD初始化函数*/
void LCD_Init(void)
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0c);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}
/*LCD光标位置设置函数*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1)+0x40); //0x40是根据表格进行的移位
	}
}
/*LCD显示一个字符函数*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
	LCD_SetCursor(Line,Column); //光标位置
	LCD_WriteData(Char);		//写入数据
}
/*LCD显示字符串函数*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[]) //String[]传递的是首地址和指针一致
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

/*定义一个次方函数*/
int LCD_Power(int X, int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}
/*LCD显示无符号数函数*/
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_Power(10,i-1)%10); //加'0'等于加0x30,对应码表,否则显示空
	}
}
/*LCD显示有符号数函数*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;		//借用Number1,防止-32768无法显示
	LCD_SetCursor(Line,Column);
	if(Number>=0)				//判断数字大于0加+号
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else						//判断数字小于0加-号
	{
		LCD_WriteData('-');
		Number1=-Number; //如果没有Number,char -32768会超出
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData('0'+Number1/LCD_Power(10,i-1)%10); //加'0'等于加0x30,对应码表,否则显示空
	}
}
/*LCD显示有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_Power(16,i-1)%16;
		if(SingleNumber<10)
		{
		LCD_WriteData('0'+SingleNumber); 
		}
		else
		{
		LCD_WriteData('A'+SingleNumber-10); //A的偏移对应10~16, A~F,-10对齐表格
		}
	}
}
/*LCD显示有2进制数函数*/
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_Power(2,i-1)%2); 
	}
}
#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);
void LCD_WriteCommand(unsigned char Command);


#endif
  • main主程序为:
#include <REGX52.h>
#include "LCD1602.h"
#include "delay_xms.h"

void main()
{
	LCD_Init();
	LCD_ShowChar(1,1,'A');	//索引码A=0x41; \反斜杠用于转义,如'\'';'\\'标准ASIC是反斜杠,中文是钱币符号
	LCD_ShowString(1,3,"Hello");
	LCD_ShowNum(1,9,66,2);
	LCD_ShowSignedNum(1,12,-88,2);
	LCD_ShowHexNum(2,1,0xA5,2);
	LCD_ShowBinNum(2,4,0xA5,8);
	LCD_ShowChar(2,13,0xdf); //直接输入码表地址0xdf,0xe0=@
	LCD_ShowChar(2,14,'C'); //直接输入码表地址0xdf,0xe0=@

	LCD_ShowString(1,16,"Welcome to China!");
	while(1)
	{
		LCD_WriteCommand(0x18); //流动字幕效果的移屏命令地址
		delay_xms(500);
	}
	
}

Proteus测试无误
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Redis实现全局唯一ID

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 在分布式系统中&am…

插入排序动态展示3(Python可视化源代码)

修改了“开始”命令按钮&#xff0c;每次单击“开始”&#xff0c;都重新排序。 Python代码 import tkinter as tk import random import timeclass InsertionSortVisualizer:def __init__(self, root, canvas_width800, canvas_height400, num_bars10):self.root rootself.…

【软考中级】21 真题整理

选择题 1、在CPU中&#xff0c;用&#xff08; &#xff09;给出将要执行的下一条指令在内存中的地址。 (A) 程序计数器 (B) 指令寄存器 (C) 主存地址寄存器 (D) 状态条件寄存器 试题答案&#xff1a;A 试题解析&#xff1a; A 选项程序计数器PC&#xff1a;存储下一条要执行指…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么&#xff1f;安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

每日一题:计数质数

给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3&#…

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

【Linux 杂货铺】进程间通信

1.进程为什么要通信呢&#xff1f; ①&#x1f34e; 为了进程之间更好的协同工作&#xff0c;举个例子&#xff0c;在学校&#xff0c;学院的管理人员给教师安排课程的时候&#xff0c;必须事先知道该教师平常的上课情况&#xff0c;不然会将教师的课程安排到一起造成麻烦&…

YetnotherrokenKeoard

问题描述: 思路:用vector存储数据,一个l用来存放小写的部分的下标,一个u来存放大写的部分的下标,删的时候删除下标即可,然后按照顺序输出即可 #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; in…

Linux驱动开发——(一)设备树的基本属性及其应用

目录 一、常见基本属性 1.1 compatible属性 1.2 status属性 1.3 reg属性 1.4 #address-cells属性和#size-cells属性 二、基本属性在设备树的表现 三、基本属性在驱动代码的表现 3.1 驱动代码 3.2 驱动代码中的OF函数 3.2.1 of_find_node_by_path 3.2.2 of_find_prope…

nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务

一、本文中使用的工具: Vs2022使用.NET 8.0开发基于ASP.NET Core WebApi的gRPC服务; Nginx:1.25.5,下载地址:http://nginx.org/en/download.html 二、gRPC介绍: 由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在vs2022中可以直接创建gRP…

随机森林(Random Forests)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个随机森林&#xff08;Random Forests&#xff09;模型程序,最后打印5个条件分别的影响力。 ChatGPT 下面是一个使…

数据赋能(63)——要求:IT部门职责

“要求&#xff1a;IT部门职责”是作为标准的参考内容编写的。 在数据赋能中&#xff0c;IT部门职责在于以提供原始数据核心&#xff0c;确保提供原始数据是真实、及时和完整性&#xff0c;以支持业务赋能的实现。 在数据赋能中&#xff0c;IT部门职责涉及多个方面&#xff0c…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 一、简单介绍 二、简单人脸检测添加戴眼镜效…

【Linux学习】Linux编辑器vim的配置

文章目录 &#x1f526;vim的配置&#x1f526;vim的配置文件&#x1f526;添加配置的方法&#x1f526;手动添加相关特性配置&#xff1a;&#x1f526;自动化配置 &#x1f526;vim的配置 &#x1f526;vim的配置文件 在目录 /etc/ 下面&#xff0c;有个名为vimrc的文件&…

SpringMVC Controller 层没有使用 @ResponseBody 注解引发的血案(api访问404)

问题现象&#xff1a; 项目组的一个同事发现在请求该接口时候&#xff0c;总是报 404 错误&#xff0c;又找不到错误日志&#xff0c;一时之间不知道该如何去着手解决问题&#xff0c;我帮他排查问题的时候&#xff0c;发现该接口两次经过拦截器的 preHandle 方法&#xff0c;…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求&#xff0c;返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析&#xff0c;…

目标检测算法演变:从R-CNN到Faster R-CNN【AI写作一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

车载以太网DoIP 协议,万字长文详解

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…