STM32 使用LCD12864显示屏(串行方式)

2023-05-16

LCD12864

简介

12864LCD液晶显示模块是一款4位/8位并行、2线或3线接口方式,内部含有国际一级、二级简体中文字库的图形点阵液晶模块。显示分辨率为12864,内置8198个1616点汉字,和128个16*8点ASCII字符集。

功能引脚图

在这里插入图片描述

串口通讯需要使用的引脚

  1. CS片选信号 (如果只有一款屏,可以将CS直接接到VCC上,实现两线通讯。)
  2. SID数据传输引脚
  3. CLK时钟
  4. PSB(低电平表示串行通讯,串口通讯时可以直接接地。)
  5. VSS、VDD电源脚

原理图

工作电压:5V
驱动电压:0-7V
逻辑电平:2.7-5.5V
工作温度:0-55°C
在这里插入图片描述

串行时序图

  1. 在操作液晶屏前,将CS片选信号拉高。
  2. SID前8位是控制字符,1-5位固定为1。
    RW为0时,表示写操作。RS为1时,表示写数据,RS为0时,表示写指令。
    因此写指令CMD固定为0xF8,写数据DAT固定为0xFA。
  3. 发送数据分为两组,将发送的8位数据截取成两段,第一段发送给1byte的高4位,第二段发送给2byte的高4位。
    在这里插入图片描述

基本指令说明

  1. 功能设定
    本设计使用(0x30),表示8位MPU控制,选择基本指令集。
    在这里插入图片描述

  2. 显示开关设置
    本设计使用(0x0C),表示设定显示开,关闭光标,正常显示。
    在这里插入图片描述

  3. 进入设定点
    本设计使用(0x06),表示显示数据的读写时,设定游标方向右移,DDRAM地址计数器加1。
    在这里插入图片描述

  4. 清楚显示
    本设计使用(0x01),表示清除显示。
    在这里插入图片描述

  5. 设定DDRAM地址
    本设计使用(0x80),表示设置启动位置到地址计数器。
    128x64点阵原理上等同于256x32点阵,第三行对应的DDRAM地址紧接着第一行,第四行对应的DDRAM地址紧接着第二行。在使用反白功能时,第一行反白,第三行必然反白。
    在这里插入图片描述

6. 屏幕与DDRAM地址的对应关系

在这里插入图片描述

代码配置

lcd12864.h

#ifndef __LCD12864_H
#define __LCD12864_H

#include "stm32f10x.h"
#include "Delay.h"

#define CS 	GPIO_Pin_0	//片选信号
#define SID GPIO_Pin_1	//数据传输
#define CLK GPIO_Pin_2	//时钟
#define PSB GPIO_Pin_3	//串并选择 低电平为串行
#define CMD_PROT GPIOC	//GPIO分组

#define CS_HIGH GPIO_SetBits(CMD_PROT,CS)
#define CS_LOW GPIO_ResetBits(CMD_PROT,CS)
#define SID_HIGH GPIO_SetBits(CMD_PROT,SID)
#define SID_LOW GPIO_ResetBits(CMD_PROT,SID)
#define CLK_HIGH GPIO_SetBits(CMD_PROT,CLK)
#define CLK_LOW GPIO_ResetBits(CMD_PROT,CLK)
#define PSB_HIGH GPIO_SetBits(CMD_PROT,PSB)
#define PSB_LOW GPIO_ResetBits(CMD_PROT,PSB)

#define CMD 0xF8	//写指令
#define DAT 0xFA	//写数据

typedef struct{
	uint8_t com;	//地址
	uint8_t num;	//长度
	uint8_t *dat;	//数据
}LCD_InitTypeDef;	//定义写文字用的结构体

void LCD12864_UserConfig(void);/*用户配置*/
void LCD12864_Write_Init(void);/*LCD12864上电初始化流程*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data);/*LCD12864写函数 传入指令写指令,传入数据写数据*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure);/*LCD12864写文字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num);/*LCD12864写数字*/
void LCD12864_Open(void);/*屏幕开显示*/
void LCD12864_Shut(void);/*屏幕关显示,进入睡眠*/

#endif

lcd12864.c

#include "lcd12864.h"

/*用户配置*/
void LCD12864_UserConfig(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin	= CS|SID|CLK|PSB;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT,&GPIO_InitStructure);
}

/*LCD12864写一个字节*/
void LCD12864_Write_Byte(uint8_t data)
{
	uint8_t WBi;
	CS_HIGH;	//写之前拉高片选信号
	for(WBi=0;WBi<8;WBi++)
	{
		(data<<WBi&0x80)?SID_HIGH:SID_LOW;	//移位,判断高位
	
		CLK_LOW;	//拉低时钟
		CLK_HIGH;	//拉高时钟
	}
	CS_LOW;		//释放片选,不再占据总线
}
	
/*LCD12864写函数 传入指令写指令,传入数据写数据*/
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data)
{
	LCD12864_Write_Byte(cmd);
	LCD12864_Write_Byte(data&0xf0);			//根据时序图,传入数据的高4位变成发送数据的高4位,发送的数据低4位为0。例0x38 0011 1000 & 1111 0000
	LCD12864_Write_Byte((data<<4)&0xf0);	//再取传入数据的低4位,变成发送数据的高4位,发送的数据低4位为0。例0x38<<4 1000 & 1111 0000
	Delay_ms(2);	//设置传输延时
}

/*LCD12864上电初始化流程*/
void LCD12864_Write_Init(void)
{
	PSB_LOW;								//设置串行通讯
	LCD12864_Write_CMD_Data(CMD,0x30);		//功能设定,8位MCU接口,基本指令集
	LCD12864_Write_CMD_Data(CMD,0x06);		//显示数据的读写时,设定游标方向右移,DDRAM地址计数器加1
	LCD12864_Write_CMD_Data(CMD,0x0C);		//开显示,关闭光标
	LCD12864_Write_CMD_Data(CMD,0x01);		//清除显示
	LCD12864_Write_CMD_Data(CMD,0x80);		//设置启动位置
}
	
/*屏幕开显示*/
void LCD12864_Open(void)
{
	LCD12864_Write_CMD_Data(CMD,0x0C);	
}

/*屏幕关显示,进入睡眠*/
void LCD12864_Shut(void)
{
	LCD12864_Write_CMD_Data(CMD,0x08);		//进入睡眠模式
}

/*LCD12864写文字*/
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure)
{
	uint8_t LWWi;
	LCD12864_Write_CMD_Data(CMD,LCD_InitStructure.com);		//写指令:写入地址
	
	for(LWWi=0;LWWi<LCD_InitStructure.num;LWWi++)
	{
		LCD12864_Write_CMD_Data(DAT,*LCD_InitStructure.dat++);	//根据数据长度写入字节
		Delay_ms(200);
	}
}
	
/*LCD12864写数字*/
void LCD12864_Write_Number(uint8_t com,uint8_t num)
{
	const uint8_t number[] = {"0123456789"};
	LCD12864_Write_CMD_Data(CMD,com);					//写地址
	
	LCD12864_Write_CMD_Data(DAT,number[num/1000]);		//1234 1
	LCD12864_Write_CMD_Data(DAT,number[num%1000/100]);	//1234 2
	LCD12864_Write_CMD_Data(DAT,number[num%100/10]);	//1234 3
	LCD12864_Write_CMD_Data(DAT,number[num%100%10]);	//1234 4
}

main.c

#include "stm32f10x.h"   // Device header
#include "lcd12864.h"
#include "Delay.h"

LCD_InitTypeDef LCD_InitStructure;

int main(void)
{
	LCD12864_UserConfig();		//LCD12864用户配置初始化
	LCD12864_Write_Init();		//LCD12864流程初始化
	
	LCD_InitStructure.com = 0x80;	//0x80-0x87 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"桃之夭夭灼灼其华";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x90;	//0x90-0x97 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"之子于归宜其室家";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x88;	//0x88-0x8F 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"桃之夭夭有蕡其实";
	LCD12864_Write_Word(LCD_InitStructure);
	
	LCD_InitStructure.com = 0x98;	//0x98-0x9F 16 8
	LCD_InitStructure.num =16;
	LCD_InitStructure.dat = (u8*)&"之子于归宜其家室";
	LCD12864_Write_Word(LCD_InitStructure);
	
	Delay_ms(500);	//等待500ms
	
	LCD12864_Write_CMD_Data(CMD,0x01);	//清屏
	while(1)
	{
		uint8_t i;
		for(i=0;i<200;i++)
		{
			LCD12864_Write_Number(0x90,i);		//第二行显示动态的数字
			Delay_ms(200);
		}
	}
}

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

STM32 使用LCD12864显示屏(串行方式) 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • 基于STM32F10X的GPIO驱动V0.1

    基于上篇 基于STM32F10X的GPIO驱动 增加GPIO的操作功能 xff0c 并且优化提高部分函数效率 最重要的添加了未带操作 xff0c 这样就可以高效的控制GPIO了 3 未解决的问题 xff1a 当前我无法将WHT GPIO P
  • CPU供电(路由器)万用表测量“短路”现象分析

    在维修路由器产品时发现CPU供电1 1V对地阻值50 100 之间 xff0c 在用万用表的蜂鸣档测量时会报 短路 xff0c 本以为是cpu或者供电芯片损坏 xff0c 原来我测量好板子也是这个现象 xff0c 故这个1 1 V cpu供
  • Lenovo ThinkPad T450s更换WiFi模块、指纹模块、维修SD卡针

    本电脑2015年8月份购买的 xff0c 2018年4月份之后开始出现问题 xff0c 首先指纹很难开机 xff0c 很难录入 xff0c 然后就是SD卡不知道什么时候无法使用了 xff0c 由于笔记本不常完也就没太注意 xff0c 最近有
  • 2.4G&5G WiFi 5V供电大短路,维修更换5G芯片

    故障类别 xff1a 无WiFi信号 故障现象 xff1a 漏电 xff0c 无2 4G和5GWiFi 故障描述 xff1a 开机后发现电流比其它板子大一点 xff0c 并且无异常发热情况 附件 xff1a 分析过程 xff1a 根据故障找
  • 路由器不开机——维修更换MT7621AT CPU

    故障类别 xff1a 不开机 故障现象 xff1a 210mA横流不开机 故障描述 xff1a 发现CPU异常发烫不开机 xff0c 其它地方未有发热现象 附件 xff1a 原因分析 xff1a 开机测量各路电压 xff0c 发现均有电压
  • 编译QT 5.9.7 msvcr2013 x86 32位版本

    因为项目需要 xff0c 用到了qt msvcr2013 x86 版本 但是官方下载的qt安装包里面只有x64的 xff0c 因此决定自己编译x86的版本 编译所需要的工具 xff1a qt源码包 xff0c python xff0c vs
  • <C语言>打印 n 阶魔方阵( n 为奇数),魔方阵的每一行、每一列和对角线元素之和都相等

    打印魔方阵 xff0c 首先我们得知道魔方阵的编写规律 xff1a 魔方阵的填充规律如下 xff1a 假设当前创建了一个矩阵 span class token keyword int span matrix span class token
  • 矩阵连乘之求最优值与构造最优解——呕心沥血篇

    矩阵连乘 详细讲解 初次接触dp xff0c 就看到很多位大佬给出自己的见解 xff0c dp算是最难的算法之一吧 xff0c 主要在于灵活度高 xff0c 需要自己推出动态规划方程 100个动态规划方程传送门涉及到dp问题那么for循环一
  • (C)数组,指针

    数组 xff1a int a 8 指针数组 xff0c 每个单元存放一个指针 每个指针是占8个字节在64位 xff0c 32位占4个字节 int xff08 a xff09 8 数组指针 xff0c 一个指向数组的指针 数组定义 xff1a
  • week5 单调栈 最大矩形

    Titile 给一个直方图 xff0c 求直方图中的最大矩形的面积 例如 xff0c 下面这个图片中直方图的高度从左到右分别是2 1 4 5 1 3 3 他们的宽都是1 xff0c 其中最大的矩形是阴影部分 Input 输入包含多组数据 每
  • ERROR 1238 (HY000): Variable ‘secure_file_priv‘ is a read only variable

    在进行数据导出操作的时候 xff0c 报错 xff1a ERROR 1238 HY000 Variable secure file priv is a read only variable 该变量是可读的 xff0c 不能用set设置 xf
  • kali安装目录扫描工具-dirsearch和git泄露利用脚本GitHack

    目录扫描工具 dirsearch 下载dirsearch git clone https github com maurosoria dirsearch 进入dirsearch目录 xff0c 进行扫描 这里我尝试了几次不同的用法 xff0
  • C语言—写一个函数求unsigned int型变量x在内存中二进制1的个数

    题目 xff1a 写一个函数求unsigned int型变量x在内存中二进制1的个数 思路 xff1a 先把num除2取余 xff0c 余数为1 xff0c count 43 43 再让num 61 num 2 取整 循环 xff0c 直到
  • Proteus 8.9下载安装指南

    因为Keil中的代码需要进行仿真 xff0c 除了用实际的开发板 xff0c 仿真软件也很实用 虽然已经装了AD xff0c 但是网上关于AD仿真的资料相对较少 今天装一个Proteus用用 安装包 xff1a Proteus8 9 提取码
  • STM32烧录

    资源包 xff1a STLink驱动 软件包 提取码 xff1a cgcg 结构 xff1a 通过RX TX脚连接到MCU芯片串口引脚 xff0c USB串口转换器 xff08 USB TTL的电路 xff09 一边连接RX TX引脚 xf
  • stm32使用串口进行通讯之发送数据

    前提准备 xff1a 1 库函数基础模板 2 stlink下载器 USB TTL下载器 单片机最小开发板stm32F103C8T6 3 面包板及相关接线 4 vscode与keil的联合开发更流畅 5 串口软件 xff0c 这个下面视频有
  • ubuntu 16.04挂载磁盘,开机丢失

    一般磁盘可能要先格式化为指定格式 sudo mkfs t ext4 dev sdb1 直接mount磁盘分区 xff0c 比如 sudo mount dev sdb1 var 当时起作用了 xff0c 但是reboot之后 xff0c 就会
  • stm32使用外部flash w25Q128实现读写操作

    前言 数据保存是所有项目的基本功能 xff0c 但是对于STM32C8T6的原flash进行操作 xff0c 一方面大小有可能不够 xff0c 另一方面单片机的运行程序本来就放在这个里面 xff0c 所以还是外接的好 这里选用w25Q128
  • Keil(MDK)STM32和51版本详细安装

    前言 保姆级教程 xff0c 多次反复安装 xff0c 实测可用 链接包失效可留言 安装注意 keil公司被ARM公司收购 xff0c 收购后就改名MDK xff0c 所以keil的下载包也是以MDK命名 安装路径不能带有中文 目录不能和5
  • STM32 使用LCD12864显示屏(串行方式)

    LCD12864 简介 12864LCD液晶显示模块是一款4位 8位并行 2线或3线接口方式 xff0c 内部含有国际一级 二级简体中文字库的图形点阵液晶模块 显示分辨率为12864 xff0c 内置8198个1616点汉字 xff0c 和