stm32并行驱动LCD12864,最简洁代码让你的屏幕亮起来

2023-05-16

前言

这两天因为一个项目的需要,所以又用到了LCD12864这个模块。好久都没用到这玩意了,感觉这东西好像要被淘汰的样子,没想到现在又要用到,简直了。。记得上次用还是大一参加机器人比赛的时候,整的那个小机器人举着个12864满地跑,哈哈哈。废话少叙,这玩意比较简单,但是由于很长时间没碰了,所以一开始还是在网上找资料,本以为会很快,但是发现大多写的比较乱,因此,我就萌生了自己写一个总结的想法,一来给自己做个总结,二来节省大家的时间。开始吧!

硬件部分

准备材料:LCD12864模块一个,开发板或者自己设计的板子都可以(我用的是开发板,因为自己画的板子发过去做还没做好,就先用开发板验证的,原理一样)

LCD12864引脚功能图:
在这里插入图片描述
LCD12864地址分布情况:
在这里插入图片描述
硬件连接:
在这里插入图片描述
这是我自己画的图里的连接情况,对着连上就行了。这里说明一下,第3脚V0本来我是连上3.3V的,但是开机屏幕亮,无现象,但是去掉之后就正常了,我也不清楚是什么原因。大家应该也看到了,这是并行驱动方式的。最终硬件连接图如下:
在这里插入图片描述

软件部分

看代码之前先看看LCD12864的时序图,就会理解代码里的一些操作了。
LCD12864时序图(并行):
在这里插入图片描述
1.lcd.h文件:

#ifndef _LCD_H
#define _LCD_H
#include "sys.h"
#include "delay.h"

#define RS PCout(0) //发数据/命令控制口
#define RW PCout(1) //读/写控制口,写比较常用
#define EN PCout(2) //使能口
#define			LINE1		0x80 //第一行起始地址,下同
#define			LINE2 		0x90
#define			LINE3 		0x88
#define			LINE4 		0x98

//以下是点亮你的屏幕必要的六个函数,不能再少了,想添加其他功能就得再加其他函数
void IO_Init(void); //必要的IO口初始化
void CheckBusy(void); //检查忙/闲状态
void LCD_wdat(u8 dat); //写数据
void LCD_wcmd(u8 com); //写命令
void LCD_Init(void); //LCD初始化
void LCD_Wmessage(u8* message,u8 address); //向屏幕里写入字串

#endif

2.lcd.c文件:

#include "lcd.h"
#include "sys.h"
#include "delay.h"

u16 temp;

void IO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
	
	//想实现控制,激活控制口(PC0,PC1,PC2)必不可少
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	//想发送数据,激活数据口(PA0~PA7)必不可少
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);	
}
//LCD初始化
void LCD_Init()
{
	LCD_wcmd(0x30);//功能设定:基本指令集
	delay_ms(5);
	LCD_wcmd(0x0C);//显示开,关光标
	delay_ms(5);
	LCD_wcmd(0x01);//清除显示
}
//忙判断
void CheckBusy(void)
{
	u8 status;
	RS=0;
	RW=1; //读出数据,RW=1
	GPIOA->ODR = 0xFF;
	do
	{
		EN = 1;
		delay_ms(5);
		status = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);//接收BF位,判断是否忙
	}while(status & 0x80);
	EN=0;
}
//LCD写命令
void LCD_wcmd(u8 cmd)
{
	CheckBusy();
	RS=0;
	RW=0;
	delay_ms(5);
	temp=(temp&0xff00)|cmd;//temp的低八位清零后将cmd放进去
	GPIO_Write(GPIOA,temp);//通过GPIO_Write()函数将数据发到A端口(也就是LCD的数据口)
	EN=1;//使能位开启
	delay_ms(10);//10ms应该能发送完了
	EN=0;//使能位关闭
}
//LCD写数据
void LCD_wdat(u8 dat)
{
	CheckBusy();
	RS=1;
	RW=0;
	delay_ms(5);
	temp=(temp&0xff00)|dat; //temp的低八位清零后将dat放进去
	GPIO_Write(GPIOA,temp);//通过GPIO_Write()函数将数据发到A端口(也就是LCD的数据口)
	EN=1;//使能位开启
	delay_ms(10);//10ms应该能发送完了
	EN=0;//使能位关闭
}
//向LCD12864中写入一行数据(因为你不可能每次只发送一字节数据)
void LCD_Wmessage(u8* message,u8 address)
{
	LCD_wcmd(address);//要显示的位置,你想让内容显示在LCD的哪一行,就把该行的起始地址通过写命令的方式发送出去,很神奇,有木有
	while(*message>0)//这个判断很关键,判断你的内容有没有发完
	{
		LCD_wdat(*message); //内核还是发字节函数
		message++; //指针挺好用的。。
	}
}

到此,就没了。下面写个main函数验证一下效果

#include "stm32f10x.h"
#include "sys.h"
#include "lcd.h"
#include "delay.h"
/************************
注意:一行16个字节,一个汉字2字节,一个字母1字节,每个汉字只能在偶字节处起
************************/
int main(void)
{	
	u8 dis3[]={"我王境泽就是饿死"};
	u8 dis4[]={"死外边"};
	u8 dis5[]={"也不吃你一口饭!"};
	u8 dis6[]={"艾玛,真香!"};
	delay_init();
	IO_Init();
	LCD_Init();
	while(1)
	{
		LCD_Wmessage(dis3,LINE1);
		LCD_Wmessage(dis4,LINE2);
		LCD_Wmessage(dis5,LINE3);
		LCD_Wmessage(dis6,LINE4);
	}
}

效果:
在这里插入图片描述
完。希望这篇文章可以节约大家的时间。
百度网盘链接(把字符修改成你要的内容即可):
链接:https://pan.baidu.com/s/16Wckkp6pZrIxPoffB1DDyw
提取码:f4m0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32并行驱动LCD12864,最简洁代码让你的屏幕亮起来 的相关文章

  • SRv6网络编程自学系列 | BGP-LS for SRv6

    书籍来源 xff1a SRv6网络编程 xff1a 开启IP网络新时代 这本书已经出了很多年了 xff0c 但多年之后因为工作需要再来读一遍 xff0c 除了温习之外 xff0c 发现自己学到了更多的知识 一边学习一边整理读书笔记 xff0
  • OpenCV学习笔记1

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 参考 OpenCV 浅墨 专栏 读入 xff0c 显示 xff0c 保存图像 include lt opencv2 core
  • Error: Could not find or load main class org.apache.hadoop.fs.FsShell

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 错误 xff1a Error Could not find or load main class org apache had
  • centos 6.x安装squid

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 不设置用户认证 安装 安装 yum install squid yum install httpd 查看版本 rpm qa g
  • VMware清理vmdk文件,解决vmdk越来越大的问题

    目录 压缩 vmdk方法在虚拟机上操作在主机上操作 参考链接 问题 xff1a 主机是Windwos xff0c 安装了VMWare 在VMWare中安装了虚拟机Ubuntu操作系统 Ubuntu本身不大 xff0c 但是 vmdk很大 网
  • 安全-认证授权、数据脱敏

    一 认证授权 JWT xff1a JWT xff08 JSON Web Token xff09 是一种身份认证的方式 xff0c JWT 本质上就一段签名的 JSON 格式的数据 由于它是带有签名的 xff0c 因此接收者便可以验证它的真实
  • 树莓派4b 串口通信实现自发自收

    1 树莓派串口映射设置 运行以下命令 xff1a ls dev al 出现串口映射的情况 xff0c 但是此时是在默认状态下 xff0c serial0 就是GPIO14 15 是映射到ttyS0的 xff0c serial1 xff08
  • 按要求编写一个Java应用程序程序: (1)定义一个接口CanFly,描述会飞的方法public void fly(); (2)分别定义类飞机和鸟,实现CanFly接

    代码 第三题 xff1a 按要求编写一个Java应用程序程序 xff1a xff08 1 xff09 定义一个接口CanFly xff0c 描述会飞的方法public void fly xff08 2 xff09 分别定义类飞机和鸟 xff
  • plc热电偶模块模拟量数据波动原因

    要找到模拟数据波动的根本原因 可能是以下原因 您可能使用了自供电或隔离的传感器电源 xff0c 并且两个电源没有相互连接 xff0c 即模拟输入模块的电源接地和传感器的信号接地没有连接 这会产生上下振动的高共模电压 xff0c 从而影响模拟
  • C #Winform窗体自适应

    说明 xff1a Winform让窗体内的控件随着窗体的大小而改变 xff0c 而且能让指定的控件始终处于居中位置 封装成类 xff0c 直接拷贝过去即可 一 类源码如下 xff1a using System using System Co
  • Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)解决方案

    docker service Docker Application Container Engine Loaded loaded usr lib systemd system docker service enabled vendor pr
  • emWin - Movie篇

    STemWin版本 xff1a 544 xff08 ST购买了emWin的license xff0c 可以在ST芯片中使用emWin工具包 xff0c 就叫STemWin xff09 emWin开发工具包可以转换JPG BMP GIF等各种
  • 大规模集群故障处理

    我相信每一个集群管理员 xff0c 在长期管理多个不同体量及应用场景的集群后 xff0c 都会多少产生情绪 其实这在我看来 xff0c 是一个很微妙的事 xff0c 即大家也已经开始人性化的看待每一个集群了 既然是人性化的管理集群 xff0
  • ADRC调试经验(已调通)

    自抗扰控制的组成 有关自抗扰的相关内容 xff0c 韩老师在他的一系列论文中已经描绘的非常清晰了 xff0c 具体资料可以点击这里下载 其中对于TD和ESO这两个部分其实是比较好调节的 xff0c 很容易就能够获得很好的效果 比较难调节的参
  • 浏览器的同源策略

    https developer mozilla org zh CN docs Web Security Same origin policy 这篇翻译不完整 请帮忙从英语翻译这篇文章 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个
  • centos简单解决报错-bash 未找到命令

    centos报错 bash 未找到命令 在使用纯净镜像的时候 经常找不到一些额外的命令 想用但是不知道怎么安装 拿telnet 和netstat 举例 telnet yum provides telnet 这里只需要 yum y span
  • [问题已处理]-docker build出来的镜像没有更新成功

    导语 xff1a 记录一下docker build镜像的坑 如果修改代码文件的话 xff0c docker build 有时候会不替换文件 xff0c 而会使用cache xff0c 导致代码文件没有更新 第一次构建镜像 产生了cache
  • [问题已处理]在docker中使用nohup

    导语 xff1a docker运行容器是否能使用nohup 以下是测试在不同的情况下使用nohup 先启动一个容器 仅看进程的pid号参考 docker run it rm ubuntu 16 04 bash sleep 5 amp amp
  • k8s-集群搭建的三种方式和区别,kubeadm、minikube,二进制包

    k8s 集群搭建的三种方式 xff0c 目前主流的搭建k8s集群的方式有kubeadm minikube xff0c 二进制包 kubeadm 是一个工具 xff0c 用于快速搭建kubernetes集群 xff0c 目前应该是比较方便和推
  • 精确算法、启发式算法、元启发式算法及增长方式浅析

    组合优化问题是通过用数学方法的研究去寻找离散事件的最优编排 分组 次序或筛选等 xff0c 其变量是离散分布的 对于结构化的组合优化问题 xff0c 其解空间的规模能够得到控制 xff0c 对于这样的问题 xff0c 使用精确算法就可以求得

随机推荐

  • 重构一个快不可维护的项目

    历史原因 xff0c 接手了一个一直堆业务逻辑 xff0c 没有重构过的项目 xff0c 简单看了一下代码就感觉麻头皮 xff0c 满目都是一个方法里面大段的代码 xff0c 阅读起来极度困难 可以合并的类没有合并 xff0c 导致一个请求
  • 芯片端子的多路复用

    嵌入式软件的开发 xff0c 经常要和芯片打交道 xff0c 和个人电脑的通用平台的CPU使用X86或X64架构不同 xff0c 嵌入式电子产品使用的主控芯片是各种各样的 xff0c 从8051单片机 xff0c 到ARM Cortex M
  • 树莓派学习笔记——获取树莓派CPU温度

    0 前言 本文通过文件操作读取树莓派CPU温度 xff0c 在linux系统中任何设备的操作都被抽象成为文件读写 xff0c 通过读取 sys class thermal thermal zone0 temp文件中的内容便获得树莓派CPU的
  • DHT11温湿度传感器

    1 封装信息 2 DHT11通讯总介 微处理器与DHT 11之间的通讯和同步 xff0c 采用单总线数据格式 xff0c 一次通讯时间4ms左右 xff0c 数据分小数部分和整数部分 一次完整的数据传输为40bit xff0c 高位先出 数
  • does not support raise

    This plugin does not support propagateSizeHints This plugin does not support raise arm平台界面无法显示 xff0c 有如上日志 该系统上安装的是5 11
  • docker jvm 内存限制

    docker 容器提供了相关的内存限制 具体使用方式如 xff1a m 512m 完整例子 docker run rm m 512m e JAVA OPTS 61 Xmx512m tomcat 8 通过 m 进行限制 但是在实际应用重 xf
  • DES加密算法—实现(C语言)

    http www iteye com topic 478024 DES xff08 Data Encrypt Standard数据库加密标准 xff09 是迄今为止使用最广泛的加密体制 初学信息安全的新生 xff0c 一般都会被老师要求实现
  • 国家运输ITS通信协议(NTCIP)简介

    国家智能交通系统工程技术研究中心 张北海 中交国通智能交通系统技术有限公司 肖媛媛 1 NTCIP的发展历程 NTCIP National Transportation Communications for ITS Protocol 是美国
  • linux下使用hiredis异步API实现sub/pub消息订阅和发布的功能

    本文转载自链接 xff1a http blog csdn net chenzba article details 51224715 xfeff xfeff 最近使用redis的c接口 hiredis xff0c 使客户端与redis服务器通
  • 推荐ucos-II 3本参考书 经典

    在这里给大家推荐三本学习ucos的必看书籍 1 xff08 比较难买 xff09 嵌入式实时操作系统uc os II教程 西安电子科技大学出版 这本书对UCOS的源代码分析的非常清楚 比作者原著 在某种程度上要好 xff0c 这本书对关键的
  • Windbg查看调用堆栈(k*)

    https www 52pojie cn thread 664189 1 1 html 无论是分析程序崩溃原因 xff0c 还是解决程序hang问题 xff0c 我们最常查看的就是程序调用堆栈 学会windbg调用堆栈命令 xff0c 以及
  • POV写作手法

    POV xff08 Point of View xff09 xff0c 一种写作手法 xff0c 即 视点人物写作手法 xff0c 在叙述同一件事可以自由选取最丰厚的角度 xff0c 大大加强了叙述的灵活性 xff0c 在讲述故事的同时作者
  • Go语言学习资料整理

    整理网上找到的Golang语言学习资料 基础 基础教程 书籍在线版 Go 指南 A Tour of Go Go语言圣经 xff08 中文版 xff09 Effective Go中文版 Go Web编程 build web applicati
  • 更好的内存管理-jemalloc

    今年年初由于facebook而火起来的jemalloc广为人之 xff0c 但殊不知 xff0c 它在malloc界里面很早就出名了 Jemalloc的创始人Jason Evans也是在FreeBSD很有名的开发人员 此人就在2006年为提
  • Windows上安装Net-SNMP5.7

    本文简要记录了在Windows上安装 net snmp 5 7 1的步骤 xff0c 最新的源码包可上net snmp官方网站下载 安装net snmp 5 7 1之前需要先安装 VS2010Win32 OpenSSL v1 0 1fAct
  • Redis源码分析(二)--结构体分析(1)

    继上次的redis源码分析 一 之后 xff0c 本人开始订制着一份非常伟大的计划 啃完redis源代码 xff0c 也对他进行了切块划分 xff0c 鉴于本人目前对他的整个运行流畅还不特别清楚的情况下 xff0c 所以决定第一个要解决的就
  • Redis源码分析(三)---dict哈希结构

    昨天分析完adlist的Redis代码 xff0c 今天马上马不停蹄的继续学习Redis代码中的哈希部分的结构学习 xff0c 不过在这里他不叫什么hashMap xff0c 而是叫dict xff0c 而且是一种全新设计的一种哈希结构 x
  • 【原创】关于wince OS开发面试问题的总结系列之Bootloader

    参考资料 xff1a 1 Windows CE 工程事件完全解析 by xff1a 李大为 2 Windos CE 实用开发技术 by xff1a 张冬泉 等 3 Windows Embedded CE 6 0 Fundamentals 4
  • UML--类之间的五种关系

    UML中的关系 xff08 Relationships xff09 主要包括5种 xff1a 关联关系 聚合关系 依赖关系 泛化关系 实现关系 1 关联 xff08 Association xff09 关系 关联关系是一种结构化的关系 xf
  • stm32并行驱动LCD12864,最简洁代码让你的屏幕亮起来

    前言 这两天因为一个项目的需要 xff0c 所以又用到了LCD12864这个模块 好久都没用到这玩意了 xff0c 感觉这东西好像要被淘汰的样子 xff0c 没想到现在又要用到 xff0c 简直了 记得上次用还是大一参加机器人比赛的时候 x