引言:

这里我们只讲解接线和代码实现,具体的原理在上一篇博客中已经讲解,如果想了解具体原理可以查看上一篇博客

《STM32 LCD12864 串行通信模式 (从原理让你理解)》

下方代码的实现也是基于上一篇的讲解顺序来的

设备: STM32F407ZGT6

引脚接线:

  1. VSS——GND
  2. VDD——VCC(5V or 3.3V)
  3. V0 亮度调节  不接
  4. CS ——接VCC,持续高电平,一直选通。
  5. SID ——接PE1
  6. SCLK  ——接PE0
  7. PSB——接GND  串行模式  或者飞线与1脚相连
  8. BLA——VCC(5V or 3.3V)   或者飞线与2脚相连
  9. BLK——接GND                 或者飞线与1脚相连
  10. 剩余引脚不接,留空

这样我们最少只会用到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程序代码(串行方式)相关推荐

  1. Arduino UNO通过SPI串行方式驱动LCD12864液晶屏

    LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字.英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低.显示内容丰富等特点而应用广 ...

  2. MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机

    MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机(代码易懂) 基于温度传感器DS18B20的MODBUS-RTU从机 主机发送指令:01 03 20 00 00 01 8 ...

  3. STM32驱动ST7920的12864液晶(串行方式)

    /****************************************************************************************** * 文件名称 : ...

  4. STM32单片机驱动LCD12864(型号:OCM J4X8C)

    0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...

  5. “并行程序VS串行程序”——并行程序优化实录

    在多核处理器.超级计算机日益普及的今天,程序员们怎能对并行程序"袖手旁观"呢? 为了练手,我用MPI写了一个并行排序程序, 先介绍下我的第一个版本,大概的思路是: 使用MPI在各个 ...

  6. c 语言程序代码700行,程序代码 翻译

    程序代码 翻译0 zydbbs2014.03.21浏览13次分享举报 [set_effect] code = 108 add_str = 500 add_int = 700 add_mind = 50 ...

  7. 基于STM32单片机驱动HX711的代码分享,仅供参考

    最近在搞一个需要加入称重模块的项目,在调试的时候也是遇到了很够狗血的问题,也参考了别的工程师的设计.所以,闲话少叙,上代码 /************************************ ...

  8. 50行代码串行Promise,koa洋葱模型原来这么有趣?

    1. 前言 大家好,我是若川,最近组织了源码共读活动<1个月,200+人,一起读了4周源码>,感兴趣的可以加我微信 ruochuan12 参与,长期交流学习. 之前写的<学习源码整体 ...

  9. python火车票购买程序代码_100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  10. python壁纸程序代码_40行Python代码+奇技淫巧搞定专属电脑壁纸库

    项目效果 项目背景 最近电脑壁纸存量捉急,老是几张图片看得有点厌烦,就想着能不能一次性下载多一些壁纸,用幻灯片放映方式天天换壁纸,天天好心情.于是乎找了一个免费图片网址PEXELS, 开始撸一波代码, ...

最新文章

  1. poj 3662 Telephone Lines spfa算法灵活运用
  2. 2013年,移动App设计的13大精髓
  3. linux 返回上一个文件夹_常用命令之linux指令
  4. 中文文件名乱码_全能型Mac解压缩软件 MacZip2.0.1(41)中文版 原ezip
  5. 简练软考知识点整理-规划风险应对
  6. jdbc链接mysql的第二个例子。使用properties文件存放连接信息。使用jar文件一个
  7. 1003. Parity(并查集)
  8. SSE3指令集系列----数据加载与算术运算指令
  9. 【GEEK】win10下cmd美化
  10. 【Stanford Online】Engineering: Algorithms1 NO.2 Asymptotic analysis
  11. 硬核干货!全球数字高程数据(DEM)详解,还有地形晕渲、等高线等
  12. JS实现最美的3D宇宙效果
  13. 屠光绍:公司债启动时机成熟 市场意义重大
  14. 通达OA 升级到2015精灵菜单异常的处理(图文)
  15. 在AD中创建子域和域树
  16. 叶武滨老师时间管理感悟分享4
  17. 一、IDEAEclipse创建类自动填充作者IDEA打开文件双层显示
  18. 程序员求职:选择大公司还是小公司
  19. 2022架构师考试重点内容一
  20. 苹果开始测试macOS Big Sur 11.0.1?

热门文章

  1. 安卓系统分区 AB . 动态分区 .VAB到底是何物,分区不同怎么刷写第三方rec
  2. 计算机程序配置不正确 请联系我们,电脑应用程序配置不正确怎么办
  3. 迅捷PDF转换器特点和使用步骤
  4. Java开发 明华usbkey_v3 明华二次开发包,usbkey 内有很多demo程序。 USB develop 238万源代码下载- www.pudn.com...
  5. Oracle官网下载JDK
  6. 张宇基础30讲 第17讲-元函数积分学基础知识
  7. w3c+android,w3cschool官方版app
  8. fastboot工具使用
  9. 一套包含完整前后端的系统如何在K8S中部署?
  10. 使用二进制编辑器制作操作系统启动盘