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

news2024/11/27 16:41:03

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测试无误
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VIC水文模型】准备工作:平台软件安装

VIC水文模型所需平台软件安装 1 Arcgis安装2 Cygwin安装&#xff08;Linux系统&#xff09;3 Matlab/R/Fortran的安装Notepad 4 VIC模型程序代码获取参考 由于VIC模型的编程语言为C语言&#xff0c;交互方式为控制台输指令&#xff0c;需要在Linux系统上运行。Windows 上使用 …

Linux--进程间的通信-命名管道

前文&#xff1a; Linux–进程间的通信-匿名管道 Linux–进程间的通信–进程池 命名管道的概念 命名管道是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;运行不同进程之间进行可靠的、单向或双向的数据通信。 特点和作用&#xff1a; 跨平台性&#xff1a;在W…

Vanna-ai 大模型开源项目 基于RAG的TextToSql框架 安装和使用教程

github项目地址&#xff1a;vanna-ai/vanna: &#x1f916; 与 SQL 数据库聊天&#x1f4ca;。通过 LLMs使用RAG进行准确的TextToSQL的生成工作 &#x1f504; 。 Vanna 是 MIT 许可的开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关…

锐捷云桌面的安装

按下 <DEL> 键进入 BIOS setup 界面&#xff08;初始密码为 admin &#xff09;。 输入密码之后就进入 BIOS 的 Main 界面 设置服务器 BMC IP 地址。 a 云服务器启动后&#xff0c;在 BIOS 的主页面&#xff0c;把光标移到 [Server Mgmt] 项。 b 选择 [BMC Network C…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…

腾讯AI Lab:“自我对抗”提升大模型的推理能力

本文介绍了一种名为“对抗性禁忌”&#xff08;Adversarial Taboo&#xff09;的双人对抗语言游戏&#xff0c;用于通过自我对弈提升大型语言模型的推理能力。 &#x1f449; 具体的流程 1️⃣ 游戏设计&#xff1a;在这个游戏中&#xff0c;有两个角色&#xff1a;攻击者和防守…

【七 (2)FineBI FCP模拟试卷-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

SpringCloud(一)

微服务框架 一、分布式架构 分布式架构︰根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为一个服务。 优点: 降低服务耦合有利于服务升级拓展 微服务是一种经过良好架构设计的分布式架构方案&#xff0c;微服务架构特征: 单一职责:微…

源码解读——SplitFed: When Federated Learning Meets Split Learning

源码地址 1. 源码概述 源码里一共包含了5个py文件 单机模型&#xff08;Normal_ResNet_HAM10000.py&#xff09;联邦模型&#xff08;FL_ResNet_HAM10000.py&#xff09;本地模拟的SFLV1&#xff08;SFLV1_ResNet_HAM10000.py&#xff09;网络socket下的SFLV2&#xff08;SF…

MySQL的内外连接

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容主要介绍了MySQL中的内外连接 文章目录 MySQL的内外连接…

如何用ChatGPT进行论文撰写?

原文链接&#xff1a;如何用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384e6…

C语言——字符函数和字符串函数

1.assert断言&#xff08;判断程序运行时是否符合条件&#xff09; <assert.h>头文件定义了宏assert&#xff08;&#xff09;&#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报 错终⽌运⾏。这个宏常常被称为“断⾔”。 assert() …

带缓存的输入输出流(I/O)

文章目录 前言一、带缓冲的输入输出流是什么&#xff1f;二、使用方法 1.BufferedInputStream与BufferedOutputStream类2.BufferedReader与BufferedWriter类总结 前言 输入输出流可以视为&#xff0c;从A点把货物搬运至B点。那么带缓冲的意思可以视为用货车把A点的货物搬运至B点…

Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在品牌故事业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…

象棋教学辅助软件介绍

背景 各大象棋软件厂商都有丰富的题目提供训练&#xff0c;但是其AI辅助要么太弱&#xff0c;要么要付费解锁&#xff0c;非常不适合我们这些没有赞助的业余棋手自行训练&#xff0c;于是我需要对其进行视觉识别&#xff0c;和AI训练&#xff0c;通过开启这个辅助软件&#xf…

学习了解大模型的四大缺陷

由中国人工智能学会主办的第十三届吴文俊人工智能科学技术奖颁奖典礼暨2023中国人工智能产业年会于2024年4月14日闭幕。 会上&#xff0c;中国工程院院士、同济大学校长郑庆华认为&#xff0c;大模型已经成为当前人工智能的巅峰&#xff0c;大模型之所以强&#xff0c;是依托了…

【iOS开发】(二)react Native基础语法+样式+布局20240417

【IOS开发】 前言&#xff1a;&#xff08;一&#xff09;我们已经搭建好了基础环境&#xff0c;和iOS环境&#xff0c;并创建和在模拟器上成功运行了一个app&#xff0c;mywdm。 目录标题 一&#xff0c; 如何进行模拟器调试二&#xff0c;基础语法&#xff1a;1 掌握reactjs…

spring boot: 使用MyBatis从hive中读取数据

一、hive表&#xff1a; 启动hiveserver2 二、添加mybatis starter和hive依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

微信小程序展示倒计时

html <view class"countdown"> <text>倒计时&#xff1a;</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…

Table表格(关于个人介绍与图片)

展开行&#xff1a; <el-table :data"gainData" :border"gainParentBorder" style"width: 100%"><el-table-column type"expand"><template #default"props"><div m"4"><h3>工作经…