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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车4S集团数据分析

派可数据分析--汽车4S集团。 派可数据汽车4S集团数据分析概述。派可数据汽车4S集团分析主题全面涵盖行业内各板块业务分析&#xff0c;具体包括&#xff1a;保险业务分析、客户关系分析、汽车保养情况分析、售后维修主题分析、整车销售分析、整车库存分析、装具销售分析、配件…

Zynq 7000 系列中的JTAG和DAP子系统

Zynq 7000系列SoC器件通过标准JTAG调试接口提供调试访问。在内部&#xff0c;SoC设备器件在处理系统&#xff08;PS&#xff09;内部实现了一个Arm调试访问端口&#xff08;DAP&#xff09;&#xff0c;同时在可编程逻辑&#xff08;PL&#xff09;内部实现了一个标准的JTAG测试…

二叉树高频题目下

下 最近公共祖先 包含 分了两树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* lowestCommo…

使用Redis实现全局唯一ID

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

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析&#xff08;Software Composition Analysis&#xff0c;SCA&#xff09;是一种用于识别和分析软件内部组件及其关系的技术&#xff0c;旨在帮助开发人员更好地了解和管理其软件的构建过程&#xff0c;同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展…

安装mysql的流程

安装mysql的步骤 安装流程 [rootlocalhost z]# cd /mnt/share/share[rootlocalhost share]# ll[rootlocalhost share]# cp mysql157-community-release-el7-10.noarch.rmp /usr/localcp: cannot stat ‘mysql157-community-release-el7-10.noarch.rmp’: No such file or direc…

小红书电商运营实战课,从0打造全程实操(65节视频课)

课程内容&#xff1a; 1.小红书的电商介绍 .mp4 2.小红书的开店流程,mp4 3.小红书店铺基础设置介绍 ,mp4 4.小红书店铺产品上架流程 .mp4 5.客服的聊天过程和子账号建立 .mp4 6.店铺营销工具使用和后台活动参加 .mp4 7.小红书产品上架以及拍单教程,mp4 8.小红书如何选品…

3d渲染的必备工具-渲染100,渲染100邀请码1a12

之前我陆续介绍了3D渲染的基本原理和流程、概念和技术&#xff0c;以及类型和方法等&#xff0c;想必大家学会了很多&#xff0c;今天我推荐一个在使用3D渲染时必不可少的工具&#xff0c;网渲平台-渲染100&#xff0c;这篇文章就带大家简单了解下。 渲染100官网&#xff1a;ht…

Docker Compose 的安装和使用详解

Docker Compose 是 Docker 官方开源的容器编排(Orchestration)项目之一,用于快速部署分布式应用。本文将介绍 Docker Compose 的基本概念、安装流程及使用方法。 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker C…

算法课程笔记——STL键值对map

map当下标无限的数组 重点是对应关系&#xff0c;一般不修改compare 类比set 没有lowerbound&#xff0c;因为遍历是无序的 ; map不能用sort函数排序 但可用vector转化为map使用 std::set<std::pair<TKEY, mutable TVAL> > ≈ std::map<TKEY, TVAL>

【Java基础】23.接口

文章目录 一、接口的概念1.接口介绍2.接口与类相似点3.接口与类的区别4.接口特性5.抽象类和接口的区别 二、接口的声明三、接口的实现四、接口的继承五、接口的多继承六、标记接口 一、接口的概念 1.接口介绍 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xf…

使用CCS软件查看PID曲线

在刚开始学习PID的时候&#xff0c;都需要借助PID的曲线来理解比例&#xff0c;积分&#xff0c;微分这三个参数的具体作用。但是这些曲线生成一般都需要借助上位机软件或者在网页上才能实现。如果是在单片机上调试程序的话&#xff0c;想要看曲线&#xff0c;一般就是通过串口…