当前位置: 首页 > news >正文

51单片机学习笔记_12 LCD1602 原理及其模块化代码

LCD1602

liquid crystal display 液晶显示屏,一种字符型液晶显示模块,可以显示 16*2 个字符,每个字符是 5*7 点阵。

image-20230203004049189

P0 P2 会和数码管、LED 一定程度上冲突。

  1. 地。

  2. Vcc。

  3. 调对比度的。

  4. RS:数据指令端。1代表 DB 是数据,0代表是指令。

  5. RW:1读0写。

  6. E:类似时钟的使能。高电平有效,下降沿执行。

  7. DB:并行输入。一个字节长。

  8. BG:背光灯电源。

内部结构图

image-20230221024102411

类似 SMG,想显示1并不是直接输入1,而是操纵数码管右侧一竖被点亮。字模库起的就是这个作用,里面有固定的 ROM 和用户课自定义的 RAM。

DDRAM 长于屏幕,可以通过移平实现滚动效果。

AC address controller,可以自动移位写入数据。

字模库中的数据大多数和 ASCII 码是一样的。

指令

image-20230221195404983

image-20230221195434495

image-20230221195450094

image-20230221200656434

image-20230221200839017

image-20230221201026593

image-20230221201247867

image-20230221201355749

image-20230222162315672

image-20230221205604331

初始化指令

初始化要做哪些操作?

规定显示区域(如8位数据接口,2行显示,5*7点阵,即为0011 10xx,如果取0即为 0x38.)。

显示的模式设置(如开启显示,关闭光标,关闭光标闪烁:0000 1101,即 0x0D)。

进入模式设置(如读写后光标++,屏幕不动:0000 0110,0x06。如果是滚动屏幕则为)。

清屏(0x01)。

显示指令

先设置 DDRAM 初始地址,0x80|AC(开头的8是 DDRAM 固定指令信息不能改。后面的全是0,与 AC 光标位置做与,AC 不同位置的值见 DDRAM 地址表).

然后发送数据。

时序

image-20230221210035721 image-20230221210102393 image-20230221210614193

模块化

第一阶段我们先编写 LCD1602 模块化编程代码,这一部分主要显示静态内容,用于程序编写过程中显示变量进行调试。

目标模块化函数:

image-20230203004415880
//LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__#include "reg52.h"
#include "intrins.h"
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DATAPORT P0void LCD_Delay1ms();		//@11.0592MHz
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_Init();
void LCD_SetCursor(unsigned char line, unsigned char column);
unsigned int LCD_Pow(unsigned char x, unsigned char y);
void LCD_ShowChar(unsigned char line, unsigned char column, unsigned char c);
void LCD_ShowString(unsigned char line, unsigned char column, unsigned char str[]);
void LCD_ShowNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length);
void LCD_ShowSignedNum(unsigned char line, unsigned char column, int num, unsigned char length);
void LCD_ShowHexNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length);
void LCD_ShowBinNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length);
#endif
//LCD1602.c
#include "LCD1602.H"void LCD_Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}void LCD_WriteCommand(unsigned char Command){LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_DATAPORT=Command;LCD_Delay1ms();LCD_E=1;LCD_Delay1ms();LCD_E=0;
}void LCD_WriteData(unsigned char Data){LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_DATAPORT=Data;LCD_Delay1ms();LCD_E=1;LCD_Delay1ms();LCD_E=0;
}void LCD_Init(){LCD_WriteCommand(0x38);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));}else{LCD_WriteCommand(0x80|(column-1)+0x40);}
}unsigned int LCD_Pow(unsigned char x, unsigned char y){unsigned char i=y;unsigned int res=1;for(;i>0;i--)res*=x;return res;
}void LCD_ShowChar(unsigned char line, unsigned char column, unsigned char c){LCD_SetCursor(line, column);LCD_WriteData(c);
}void LCD_ShowString(unsigned char line, unsigned char column, unsigned char str[]){unsigned int i=0;LCD_SetCursor(line, column);while(str[i]!='\0'){LCD_WriteData(str[i]);i++;}
}void LCD_ShowNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length){unsigned char i;unsigned base;LCD_SetCursor(line, column);for(i=length;i>0;i--){base=LCD_Pow(10, i-1);LCD_WriteData(num/base%10+'0');	}
}void LCD_ShowBinNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length){unsigned char i;unsigned char base;unsigned char single_num;LCD_SetCursor(line, column);for(i=length;i>0;i--){base=LCD_Pow(2, i-1);single_num=num/base%2+'0';LCD_WriteData(single_num);	}
}void LCD_ShowHexNum(unsigned char line, unsigned char column, unsigned int num, unsigned char length){unsigned char i;unsigned char base;unsigned char single_num;LCD_SetCursor(line, column);for(i=length;i>0;i--){base=LCD_Pow(16, i-1);single_num=num/base%16;if(single_num<=9)single_num+='0';else single_num+='A'-10;LCD_WriteData(single_num);	}
}void LCD_ShowSignedNum(unsigned char line, unsigned char column, int num, unsigned char length){unsigned char i;unsigned base;LCD_SetCursor(line, column);if(num>0)LCD_WriteData('+');else {LCD_WriteData('-');num=-num;}for(i=length;i>0;i--){base=LCD_Pow(10, i-1);LCD_WriteData(num/base%10+'0');	}
}

如果希望屏幕滚动,一定时间执行一次LCD_WriteCommand(0x18); 屏幕左移指令。

相关文章:

51单片机学习笔记_12 LCD1602 原理及其模块化代码

LCD1602 liquid crystal display 液晶显示屏&#xff0c;一种字符型液晶显示模块&#xff0c;可以显示 16*2 个字符&#xff0c;每个字符是 5*7 点阵。 P0 P2 会和数码管、LED 一定程度上冲突。 地。 Vcc。 调对比度的。 RS&#xff1a;数据指令端。1代表 DB 是数据&#x…...

科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今

恍惚之间&#xff0c;ChatGPT红遍全网&#xff0c;元宇宙沉入深海…… 在科技圈&#xff0c;见证了太多“昙花一现”&#xff0c;“新贵” ChatGPT 的爆火几乎复制了元宇宙的路径&#xff0c;它会步元宇宙的后尘&#xff0c;成为下一个沉入深海的工具吗&#xff1f; 不可否认的…...

redis基本入门| 怎么安装redis?什么的是redis?怎么使用?

目录 一、Redis下载与安装 二、基本概念 1.什么是Redis? 2.Redis端口多少&#xff1f; 3.Redis是单线程还是多线程&#xff1f; 4.Redis为什么单线程还这么快&#xff1f; 三、Redis的基本操作 四、Redis的五个基本类型 1.Redis-key 2.字符串 string 3.列表 list …...

kubernetes traefik ingress 安装部署以及使用和注意点

1、简介 Traefik 是一款 open-source 边缘路由器&#xff0c;可让您轻松地发布服务. 它接收来自您的系统请求&#xff0c;并找出负责处理它们的后端服务组件。 traefik 与众不同在于它能够自动发现适合您服务的配置。 当 Traefik 检查您的基础设施时&#xff0c;它会发现相关信…...

电脑病毒已灭绝,是真的吗?

大家有没有这样一个疑问&#xff0c;觉得自己的电脑好像很久没有电脑病毒了&#xff1f;之前大名鼎鼎的蠕虫2000&#xff0c;熊猫烧香都变得不那么常见了。到底是电脑因为自身优化和杀毒软件的防护导致病毒变少了&#xff0c;还是本身电脑病毒变少了呢&#xff1f;&#xff08;…...

基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计(二)

rk3399 是由本土芯片厂商瑞芯微&#xff08;Rockchip&#xff09;研发的高性能、低功耗“中国芯”。在 2016 年 4 月&#xff0c;rk3399 首次在香港举行的电子展上亮相。芯片使用六核大 LITTLE 处理器&#xff1a; 包括四核的 Cortex-A53 和双核的 Cortex-A72&#xff0c;主频可…...

追梦之旅【数据结构篇】——详解C语言实现动态版顺序栈

详解C语言动态实现顺序栈~&#x1f60e;前言&#x1f64c;预备小知识&#x1f49e;栈的概念及结构整体实现内容分析&#x1f49e;1.头文件编码实现&#x1f64c;2.功能文件编码实现&#x1f64c;3.测试文件的编写&#xff1a;&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博…...

Ubuntu 使用Nohup 部署/启动/关闭程序

目录 一、什么是nohup&#xff1f; 二、nohup能做什么&#xff1f; 三、nohup如何使用&#xff1f; 四、怎么查看/关闭使用nohup运行的程序&#xff1f; 命令 实例 一、什么是nohup&#xff1f; nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令&#xff0c…...

Spring 用到了哪些设计模式

关于设计模式&#xff0c;如果使用得当&#xff0c;将会使我们的代码更加简洁&#xff0c;并且更具扩展性。本文主要讲解Spring中如何使用策略模式&#xff0c;工厂方法模式以及Builder模式。1. 策略模式关于策略模式的使用方式&#xff0c;在Spring中其实比较简单&#xff0c;…...

Linux上基于PID找到对应的进程名以及所在目录

Linux上基于PID找到对应的进程名以及所在目录前言找到进程的pid通过top命令查看通过 ps -ef |grep nignx进行查看通过端口号进行查看查看nginx进程目录前言 在一台新接触的服务器&#xff0c;却不熟悉搭建所在目录的时候&#xff0c;这时候就就可以通过ps查找进程&#xff0c;并…...

jvm知识点与面试题

jvm 1. 定义&#xff1a;Java虚拟机&#xff08;Java virtual machine&#xff09;&#xff0c;一种能够运行Java字节码的虚拟机。 1.1. Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 2. jvm基本结构&#xff1a; 2.1. 1 类加载…...

算法前缀和—Java版

前缀和概念 假设有数组 A[1,2,3,4,5,6,7] 为原数组&#xff0c;有数组 B作为A的前缀和数组&#xff0c;那么B[1,3,6,10,15,21,28]&#xff1b;可以发现B[i] A[0]....A[i]&#xff0c;即B[i]是数组A的前面i个数的总和。可以前缀和表示如下公式&#xff1a; B[i]∑j0iA[j]B[i]\s…...

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性&#xff0c;就好像我们在做股票投资的时候&#xff0c;提到最多的就是周期规律&#xff0c;因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…...

浅谈常用的日志框架

文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以…...

字节是真的难进,测开4面终上岸,压抑5个月,终于可以放声呐喊

这次字节的面试&#xff0c;给我的感触很深&#xff0c;意识到基础的重要性。一共经历了五轮面试&#xff1a;技术4面&#xff0b;HR面。 下面看正文 本人自动专业毕业&#xff0c;压抑了五个多月&#xff0c;终于鼓起勇气&#xff0c;去字节面试&#xff0c;下面是我的面试过…...

Bash初识

Bash初识 1.简介: 一.什么是shell&#xff1f; 用过计算机的人知道&#xff0c;我只要点点鼠标计算机就能按照我们的要求来进行相应的操作&#xff0c;那么&#xff0c;你有没有想过计算机为什么能够识别我们的操作呢&#xff1f;俗话说&#xff0c;人有人语&#xff0c;机有机…...

ElasticSearch Script 操作数据最详细介绍

文章目录ElasticSearch Script基础介绍基础用法List类型数据新增、删除nested数据新增、删除根据指定条件修改数据根据指定条件修改多个字段数据-查询条件也使用脚本根据指定条件删除nested中子数据数据根据条件删除数据删除之后结果创建脚本&#xff0c;通过脚本调用根据条件查…...

【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode

前言 很久之前就想写AFL++的qemu_mode了,只是模糊测试专题的文章有些过于耗费时间,加上工作原因导致一直搁置。最近需要出差会用到黑盒模糊测试,所以就当做复习一遍,我记得Fuzzing 101也有一个qemu_mode的练习,有空的话下一篇文章更新吧~ 编写不易,如果能够帮助到你,希望…...

【java实现Word模板导出】Xdocreport和Freemaker

如果只是生成简单的word文件的话可以使用 Hutool 上手简单使用方便。 但如果需要导出内容比较复杂的word文件的话用那个就不合适了&#xff0c;这时候就需要Xdocreport这玩意了。 制作模板 新建一个word文档在需要插入变量的地方使用快捷键 Crtl F9 来生成一个域 然后右键单…...

Stable-Baselines 3 部分源代码解读 3 ppo.py

Stable-Baselines 3 部分源代码解读 ./ppo/ppo.py 前言 阅读PPO相关的源码&#xff0c;了解一下标准库是如何建立PPO算法以及各种tricks的&#xff0c;以便于自己的复现。 在Pycharm里面一直跳转&#xff0c;可以看到PPO类是最终继承于基类&#xff0c;也就是这个py文件的内…...

深度剖析Claude Code实操逻辑,解锁AI编程高效开发方式

文章目录前言一、我用Claude Code的翻车现场&#xff0c;能写一本《程序员血泪史》二、Claude Code的核心设计思想&#xff1a;你以为它是保姆&#xff0c;其实它是保安三、普通模式vs规划模式&#xff1a;一个是临时工&#xff0c;一个是项目经理四、两条核心指令&#xff0c;…...

DeepSeek混合云架构下跨AZ流量调度困局:基于eBPF+Service Mesh的实时负载感知调度器设计(已上线支撑日均2.7亿QPS)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek混合云架构下跨AZ流量调度困局的系统性认知 在DeepSeek混合云生产环境中&#xff0c;核心推理服务部署于多可用区&#xff08;AZ&#xff09;集群&#xff0c;底层横跨公有云&#xff08;如AWS us-ea…...

DLSS Swapper:免费高效的DLSS智能管理解决方案

DLSS Swapper&#xff1a;免费高效的DLSS智能管理解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的免费开源工具&#xff0c;它通过智能管理DLSS、FSR和XeSS文件&#xff…...

OpenAI Assistant API vs 开源框架:创业者该如何选择技术栈?

OpenAI Assistant API vs 开源框架&#xff1a;创业者该如何选择技术栈&#xff1f; 作者&#xff1a;老周&#xff0c;连续AI创业者&#xff0c;前大厂AI架构师&#xff0c;专注分享AI创业落地实战经验 引言 痛点引入 过去一年我接触了至少20个AI创业团队&#xff0c;80%的团…...

Python爬虫绕过JA3/JA4指纹检测的TLS定制实战

1. 这不是“绕过检测”&#xff0c;而是理解TLS握手的底层语言你写好了一个Python爬虫&#xff0c;目标网站明明没上WAF、也没用Cloudflare&#xff0c;但一发请求就返回403——连HTML正文都没有&#xff0c;只有个空响应体。抓包一看&#xff0c;服务器在TCP三次握手之后、TLS…...

2026运营经理进阶指南:从“执行者”到“数据操盘手”的能力跃迁

嘿&#xff0c;未来的运营总监们&#xff01;&#x1f44b; 2026年的运营战场早已不是单纯拼“执行力”和“写文案”的时代了。你是否发现&#xff0c;只会盯着排期表催进度的运营&#xff0c;正逐渐被会用数据驱动业务增长、用AI提升效率的“操盘手”所取代&#xff1f;作为你…...

额度秒光?API报错429?DeepSeek免费资源分配逻辑全解析,工程师必存的4类降级预案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;额度秒光&#xff1f;API报错429&#xff1f;DeepSeek免费资源分配逻辑全解析&#xff0c;工程师必存的4类降级预案 DeepSeek 的免费 API 并非“无限共享池”&#xff0c;而是基于用户身份、调用频次、请求负载…...

物联网DDoS检测:XGBoost、KNN、SGD与朴素贝叶斯性能对比

1. 项目概述&#xff1a;当物联网遇上DDoS&#xff0c;我们如何用机器学习“看门”&#xff1f;在网络安全这个没有硝烟的战场上&#xff0c;DDoS攻击一直是让运维和架构师们头疼的“流量洪水”。传统的防御手段&#xff0c;比如基于固定阈值的流量清洗或者已知攻击特征的签名匹…...

终极指南:5分钟掌握Camera Shakify,为Blender相机添加真实抖动效果

终极指南&#xff1a;5分钟掌握Camera Shakify&#xff0c;为Blender相机添加真实抖动效果 【免费下载链接】camera_shakify 项目地址: https://gitcode.com/gh_mirrors/ca/camera_shakify 在3D动画和视觉特效创作中&#xff0c;相机运动的真实性是区分业余作品与专业作…...

ChatGPT商业计划书写作实战指南(投资人内部评分表首次公开)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT商业计划书的核心价值与定位 ChatGPT商业计划书并非通用模板的简单套用&#xff0c;而是面向AI原生业务场景的战略性交付物&#xff0c;其核心价值在于将技术能力、市场需求与商业化路径进行精准对齐。…...