【STM32】STM32驱动 LCD12864程序代码(串行方式)
引言:
这里我们只讲解接线和代码实现,具体的原理在上一篇博客中已经讲解,如果想了解具体原理可以查看上一篇博客
《STM32 LCD12864 串行通信模式 (从原理让你理解)》
下方代码的实现也是基于上一篇的讲解顺序来的
设备: STM32F407ZGT6
引脚接线:
- VSS——GND
- VDD——VCC(5V or 3.3V)
- V0 亮度调节 不接
- CS ——接VCC,持续高电平,一直选通。
- SID ——接PE1
- SCLK ——接PE0
- PSB——接GND 串行模式 或者飞线与1脚相连
- BLA——VCC(5V or 3.3V) 或者飞线与2脚相连
- BLK——接GND 或者飞线与1脚相连
- 剩余引脚不接,留空
这样我们最少只会用到4根线 VCC电源 GND地线 SID串行输入 SCLK 时钟 便可以实现串行通信
代码实现:
LCD写入一个字节:
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据/*!
* @brief LCD串行发送一个字节* @since v1.0* @param byte 写入字节* @author Z小旋*/
void SendByte(u8 byte)
{u8 i; for(i = 0;i < 8;i++){if((byte << i) & 0x80) //0x80(1000 0000) 只会保留最高位{SID = 1; // 引脚输出高电平,代表发送1}else{SID = 0; // 引脚输出低电平,代表发送0}/*或 SID = (Dbyte << i) & 0x80;上面那样为了方便理解*/SCLK = 0; //时钟线置低 允许SID变化delay_us(5); //延时使数据写入SCLK = 1; //拉高时钟,让从机读SID}
}/*! * @brief LCD写指令* @since v1.0* @param Cmd 要写入的指令* @author Z小旋*/
void Lcd_WriteCmd(u8 Cmd )
{delay_ms(1); //由于我们没有写LCD正忙的检测,所以直接延时1ms,使每次写入数据或指令间隔大于1ms 便可不用写忙状态检测SendByte(WRITE_CMD); //11111,RW(0),RS(0),0 SendByte(0xf0&Cmd); //高四位SendByte(Cmd<<4); //低四位(先执行<<)
}/*! * @brief LCD写数据* @since v1.0* @param Dat 要写入的数据* @author Z小旋*/
void Lcd_WriteData(u8 Dat )
{delay_ms(1); //由于我们没有写LCD正忙的检测,所以直接延时1ms,使每次写入数据或指令间隔大于1ms 便可不用写忙状态检测SendByte(WRITE_DAT); //11111,RW(0),RS(1),0SendByte(0xf0&Dat); //高四位SendByte(Dat<<4); //低四位(先执行<<)
}
向LCD发送一个字节,也就是SID引脚相对于高低电平 高电平=1 低电平=0 同时时钟线变化,使得数据可以读取和发送
结合第一篇原理介绍即可理解。
关于&运算与<< 参看 《C语言运算符与操作符的用法全面汇总(非常有用)》
LCD初始化:
这里为了方便移植,将GPIO的初始化与LCD初始化分为两个,使用时根据自己的引脚只修改GPIO初始化即可
宏定义和GPIO初始化:
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据//接口(SID: PE1 SCLK: PE0)
#define SID PEout(1)
#define SCLK PEout(0)/*!
* @brief GPIO_init* @since v1.0* @param None* @author Z小旋* 使用时自行修改这里的初始化即可*/
void lcd_GPIO_init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟//GPIOE0,E1初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化SID=1;SCLK=1;
}
根据不同的型号和管脚修改对应初始化即可
LCD初始化:
/*! * @brief LCD初始化* @since v1.0* @param None* @author Z小旋*/
void Lcd_Init(void)
{ delay_ms(50); //等待液晶自检(延时>40ms)Lcd_WriteCmd(0x30); //功能设定:选择基本指令集 ,选择8bit数据流delay_ms(1);//延时>137us Lcd_WriteCmd(0x0c); //开显示delay_ms(1); //延时>100usLcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00Hdelay_ms(30); //延时>10msLcd_WriteCmd(0x06); //每次地址自动+1,初始化完成
}
LCD写入字符或汉字:
/* 字符显示RAM地址 4行8列 */
uint8_t LCD_addr[4][8]={{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87}, //第一行{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97}, //第二行{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, //第三行{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F} //第四行};/*! * @brief 显示字符或汉字* @since v1.0* @param x: row(0~3)* @param y: line(0~7) * @param str: 要显示的字符或汉字* @author Z小旋*/
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)
{ Lcd_WriteCmd(LCD_addr[x][y]); //写初始光标位置while(*str>0){ Lcd_WriteData(*str); //写数据str++; }
}
首先写入DDRAM对应初始游标位置,然后在该位置写入字符串 写一个字节之后,DDRAM对应游标地址就自动+1到下一个游标位置继续写,直到字符串空为止
LCD清屏:
/*! * @brief 清屏函数* @since v1.0* @param None* @author Z小旋*/
void LCD_Clear(void){Lcd_WriteCmd(0x01); //清屏指令delay_ms(2); //延时以待液晶稳定【至少1.6ms】}
LCD显示图片:
/*! * @brief 显示图片* @since v1.0* @param *pic 图片地址* @author */
void LCD_Display_Picture(uint8_t *img){uint8_t x,y,i;Lcd_WriteCmd(0x34); //切换到扩充指令Lcd_WriteCmd(0x34); //关闭图形显示for(i = 0; i < 1; i++) //上下屏写入{for(y=0;y<32;y++) //垂直Y写32次{ for(x=0;x<8;x++) //横向X写8次{Lcd_WriteCmd(0x80 + y); //行地址Lcd_WriteCmd(0x80 + x+i); //列地址Lcd_WriteData(*img ++); //写高位字节数据 D15-D8 Lcd_WriteData(*img ++); //写低位字节数据 D7-D0}}}Lcd_WriteCmd(0x36);//打开图形显示 Lcd_WriteCmd(0x30); //切换回基本指令}
具体原理可以结合 LCD图片显示 部分查看
这里要注意 在显示一幅图片之后,要加上2s左右延时,否则不会有图片显示
这里再把显示步骤放在下面,方便理解
图片显示的步骤
1切换到扩充指令
2 关闭绘图显示功能
3 先将垂直的坐标(Y)写入CGRAM地址
4 再将水平的位元组坐标(X)写入CGRAM地址
5 将高位字节D15-D8写入RAM中
6 将低位字节D7-D0写入到RAM中
重复3-6步,完成图片各个部分的写入 先写上半屏,再写下半屏
7 打开绘图显示功能 8切换回基本指令
使用图片取模软件时要注意 图片取模方式:横向取模,字节正序
到此基本的功能都已经实现了,我把完整的工程代码放到下面,有需要的可以自行下载查看
弄到百度云了,CSDN下载还要钱。。。
链接: https://pan.baidu.com/s/1_OabL-e2mgZebKjjFnW1Ow 提取码: tfxw
github: https://github.com/ZXiaoxuan/STM32-LCD12864/tree/ZXiaoxuan
至此,LCD12864完毕,
PS: 代码没有任何问题,直接修改GPIO初始化部分即可,如果亮不了,先自行检查,还有查看评论区,看下自己是否有相同问题(供电,接线,F1与F4GPIO初始化不同...等等),不行就在评论区留言,我看到都会回复帮您解决
【STM32】STM32驱动 LCD12864程序代码(串行方式)相关推荐
- Arduino UNO通过SPI串行方式驱动LCD12864液晶屏
LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字.英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低.显示内容丰富等特点而应用广 ...
- MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机
MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机(代码易懂) 基于温度传感器DS18B20的MODBUS-RTU从机 主机发送指令:01 03 20 00 00 01 8 ...
- STM32驱动ST7920的12864液晶(串行方式)
/****************************************************************************************** * 文件名称 : ...
- STM32单片机驱动LCD12864(型号:OCM J4X8C)
0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...
- “并行程序VS串行程序”——并行程序优化实录
在多核处理器.超级计算机日益普及的今天,程序员们怎能对并行程序"袖手旁观"呢? 为了练手,我用MPI写了一个并行排序程序, 先介绍下我的第一个版本,大概的思路是: 使用MPI在各个 ...
- c 语言程序代码700行,程序代码 翻译
程序代码 翻译0 zydbbs2014.03.21浏览13次分享举报 [set_effect] code = 108 add_str = 500 add_int = 700 add_mind = 50 ...
- 基于STM32单片机驱动HX711的代码分享,仅供参考
最近在搞一个需要加入称重模块的项目,在调试的时候也是遇到了很够狗血的问题,也参考了别的工程师的设计.所以,闲话少叙,上代码 /************************************ ...
- 50行代码串行Promise,koa洋葱模型原来这么有趣?
1. 前言 大家好,我是若川,最近组织了源码共读活动<1个月,200+人,一起读了4周源码>,感兴趣的可以加我微信 ruochuan12 参与,长期交流学习. 之前写的<学习源码整体 ...
- python火车票购买程序代码_100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- python壁纸程序代码_40行Python代码+奇技淫巧搞定专属电脑壁纸库
项目效果 项目背景 最近电脑壁纸存量捉急,老是几张图片看得有点厌烦,就想着能不能一次性下载多一些壁纸,用幻灯片放映方式天天换壁纸,天天好心情.于是乎找了一个免费图片网址PEXELS, 开始撸一波代码, ...
最新文章
- poj 3662 Telephone Lines spfa算法灵活运用
- 2013年,移动App设计的13大精髓
- linux 返回上一个文件夹_常用命令之linux指令
- 中文文件名乱码_全能型Mac解压缩软件 MacZip2.0.1(41)中文版 原ezip
- 简练软考知识点整理-规划风险应对
- jdbc链接mysql的第二个例子。使用properties文件存放连接信息。使用jar文件一个
- 1003. Parity(并查集)
- SSE3指令集系列----数据加载与算术运算指令
- 【GEEK】win10下cmd美化
- 【Stanford Online】Engineering: Algorithms1 NO.2 Asymptotic analysis
- 硬核干货!全球数字高程数据(DEM)详解,还有地形晕渲、等高线等
- JS实现最美的3D宇宙效果
- 屠光绍:公司债启动时机成熟 市场意义重大
- 通达OA 升级到2015精灵菜单异常的处理(图文)
- 在AD中创建子域和域树
- 叶武滨老师时间管理感悟分享4
- 一、IDEAEclipse创建类自动填充作者IDEA打开文件双层显示
- 程序员求职:选择大公司还是小公司
- 2022架构师考试重点内容一
- 苹果开始测试macOS Big Sur 11.0.1?
热门文章
- 安卓系统分区 AB . 动态分区 .VAB到底是何物,分区不同怎么刷写第三方rec
- 计算机程序配置不正确 请联系我们,电脑应用程序配置不正确怎么办
- 迅捷PDF转换器特点和使用步骤
- Java开发 明华usbkey_v3 明华二次开发包,usbkey 内有很多demo程序。 USB develop 238万源代码下载- www.pudn.com...
- Oracle官网下载JDK
- 张宇基础30讲 第17讲-元函数积分学基础知识
- w3c+android,w3cschool官方版app
- fastboot工具使用
- 一套包含完整前后端的系统如何在K8S中部署?
- 使用二进制编辑器制作操作系统启动盘