【本文发布地址https://blog.csdn.net/Stack_/article/details/113833549,未经许可不得转载,转载须注明出处】

以前用LCD12864做显示直接用前人的程序,今年过年研究了一下这块屏。

关于这块屏的文章已经有很多了,这里主要记录一下已经解开的我的疑惑。

一、串行通讯下,每次写数据都需要发送至少3个字节

/*** 串行帧格式:byte0:11111+RW+RS+0      RW:1读 0写   RS:写数据类型,1显示数据 0控制指令*             byte1:HHHH + 0000                       读数据类型,1数据 0状态*           byte2:LLLL + 0000     HHHH | LLLL为一个完整字节数据*/
#define WRITE_COMMAND     0xf8  // 11111 000
#define WRITE_DATA        0xfa  // 11111 010
#define READ_STATE        0xfc  // 11111 100
#define READ_DATA         0xfe  // 11111 110/*** @brief  向LCD12864发一字节显示数据/指令* @note   * @param  None* @retval None* @author PWH* @date   2021/1* @ CSDN Tyrion.Mon*/
void LCD12864_Write(uint8_t byte_type, uint8_t byte)
{CS_SET;LCD12864_CheckBusy();LCD12864_SendByte(byte_type);              //先标明数据字节类型:数据/命令LCD12864_SendByte(0xf0 & byte);         //字节高四位LCD12864_SendByte(0xf0 & (byte << 4));     //字节低四位CS_RESET;
}

二、显示地址

1、字符 (基本指令集)

这个不算疑惑,网上一抓一大把,也好理解。


const uint8_t AC_TABLE[4][8]=
{0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置    ST7920芯片分辨率为256 x 64 , 一三为一行,二四为一行,所以指令反白必定两两关联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  LC12864显示字符串* @note   中文字符16*16,8192个在CGROM*         英文、数字字符16*8,126个在HCGROM* @param  None* @retval None* @author PWH* @date   2021/1* @ CSDN Tyrion.Mon*/
void LCD12864_ShowStr(uint8_t row, uint8_t col, uint8_t *puts)
{LCD12864_Write(WRITE_COMMAND, 0x30);                   //基本指令集合LCD12864_Write(WRITE_COMMAND, 0x0C);LCD12864_Write(WRITE_COMMAND, AC_TABLE[row][col]);      //起始位置delay(10, ms);while(*puts != '\0')   {if(col >= 8)            //判断换行{                      //若不判断,则自动从第一行到第三行
//          col = 0;
//          row++;return;}if(row >= 4)
//          row = 0;      //一屏显示完,回到屏左上角return;LCD12864_Write(WRITE_COMMAND, AC_TABLE[row][col]);LCD12864_Write(WRITE_DATA, *puts);      puts++;LCD12864_Write(WRITE_DATA, *puts);puts++;col++;}
}

2、图片/点阵/打点(扩充指令集)

切换到绘图模式,写入的RAM就从字符显示RAM(DDRAM)切换到点阵显示RAM(GDRAM)了,所以地址和显示字符的地址不一样。

/**
@ CSDN Tyrion.Mon*                 【绘图RAM GDRAM】** 屏左上角       水平坐标(每坐标2字节) (8个列地址 * (2bytes * 8bits)) = 128*         ---------------------------------*           |     00   01    ...         07  |                                      *   垂   | 00                             |*         | 01            上半屏          |*         | ...                            |*     直   | 1F(31)                         |*         |     08   09    ...         0F  |*         | 00                             |*     坐   | 01                             |*         | ...           下半屏          |*         | 1F(31)                       |*     标  |--------------------------------|*          (32行地址 + 32行地址 = 64)*     总共分为上下两个屏幕,其中第0->31行和第32->63行的行地址相同所有地址需要 | 0x80(上 0->31)上半屏的地址 (0x80,0x80) -> ... -> (0x80,0x87)....(0x9F,0x80) -> ... -> (0x9F,0x87)(下 32->63)下半屏的地址(0x80,0x88) -> ... -> (0x80,0x8F)...(0x9F,0x88) -> ... -> (0x9F,0x8F)*/
/*** @brief  LC12864显示一张128*64像素的图片* @note   * @param  None* @retval None* @author PWH* @date   2021/1* @ CSDN Tyrion.Mon*/
void LCD12864_ShowFullImage(uint8_t *puts)
{uint16_t x = 0;uint8_t  row = 0;uint8_t  col = 0;
//  LCD12864_Write(WRITE_COMMAND, 0x34);    //切换到扩展功能,不开绘图显示   (开关会导致闪屏)LCD12864_Write(WRITE_COMMAND, 0x36); //切换到扩展功能,开绘图显示  for(row = 0; row < 64; row++)         //逐行写入     {/* 设定行地址 , 上半屏0x80 - 0x9F ,下半屏0x80 - 0x9F */LCD12864_Write(WRITE_COMMAND, 0x80 + ((row / 32) ? (row - 32) : row));      /* 设定列地址起始地址,列地址只需给定一次,因其会自动增加 *//* 上半屏首列地址0x80,下半屏首列地址0x88 */LCD12864_Write(WRITE_COMMAND, (row / 32) ? 0x88 : 0x80);    /* 每行8个列地址,每个地址2字节数据 */                        for(col = 0; col < 16; col++)                     {           LCD12864_Write(WRITE_DATA, puts[x++]);} }
//  LCD12864_Write(WRITE_COMMAND, 0x36);    //开绘图显示
//  LCD12864_Write(WRITE_COMMAND, 0x30);    //切换到基本指令
}/*** @brief  LC12864描点* @note  * @param  None* @retval None* @author PWH* @date   2021/1* @ CSDN Tyrion.Mon*/
void LCD12864_DrawDots(uint8_t row, uint8_t col, uint8_t DotByteH, uint8_t DotByteL)
{LCD12864_Write(WRITE_COMMAND, 0x36);   //切换到扩展功能,开绘图显示      LCD12864_Write(WRITE_COMMAND, 0x80 + ((row / 32) ? (row - 32) : row));      //设定行地址 , 上半屏0x80 - 0x9F ,下半屏0x80 - 0x9FLCD12864_Write(WRITE_COMMAND, (row / 32) ? (0x88 + col) : (0x80 + col));           //设定列地址起始地址,列地址只需给定一次,因会自动增加//上半屏首列地址0x80,下半屏首列地址0x88LCD12864_Write(WRITE_DATA, DotByteH);   LCD12864_Write(WRITE_DATA, DotByteL);
}

三、反白显示

因为硬件设计问题,一三行会同时反白,二四行也同时反白,只能自行实现任意点反白。

因为最终的显示是DDRAM和GDRAM异或的结果,因此调用LCD12864_DrawDots函数将特定位置填充0xFF后,再调用LCD12864_ShowStr函数在此位置写入字符即可达到反白效果。(如下图“周二”)

或者取字模,在调用LCD12864_DrawDots写入时将点阵数据按位取反。如下图的大数字

四、指令

/*  初始化  */
//功能设定   0x30: DL=1 , 8BitMCU
LCD12864_Write(WRITE_COMMAND, 0x30);
//功能设定   0x30: RE=0 , 基本指令集合 DL和RE虽在同一组里,但不能同时设,须发两次
LCD12864_Write(WRITE_COMMAND, 0x30);
//清除显示   0x01: 清屏,AC归0
LCD12864_Write(WRITE_COMMAND, 0x01);
//显示状态   0x0C: 整体显示ON,游标OFF,游标反白OFF
LCD12864_Write(WRITE_COMMAND, 0x0C);        /*  写入字符前  */
//切换到基本指令集合
LCD12864_Write(WRITE_COMMAND, 0x30);
//显示状态   0x0C: 整体显示ON,游标OFF,游标反白OFF
LCD12864_Write(WRITE_COMMAND, 0x0C);    /*  描点前  */
//切换到扩展功能,不开绘图显示(开关会导致闪屏,不关闭也能正常写入、显示)
//  LCD12864_Write(WRITE_COMMAND, 0x34);
//切换到扩展功能,开绘图显示
LCD12864_Write(WRITE_COMMAND, 0x36);    /*  进入点设定  */
未搞懂
/*  游标或显示移位控制  */
未搞懂

主要参考文章
1
2
3
4
5

带字库LCD12864(ST7920)使用记录(命令 数据 地址 绘图 反白)相关推荐

  1. 命令反查dns,命令ip地址dns反查

    命令反查dns,命令ip地址dns反查 cmd打开 ,命令:nslookup 116.179.37.9(116.179.37.9为ip) 以下为返回结果 服务器:  ns-pd.online.sh.c ...

  2. 一、LCD12864(带字库的)使用教程:

    一.LCD12864简介 LCD12864液晶显示,也就是屏幕上总共有128*64 ,个点,每个点就只有两种状态亮和不亮 我这里使用的就是带字库的,直接可以显示中文,不需要自己去编码,发送数据使用8位 ...

  3. 51单片机学习:LCD12864液晶显示实验(带字库)

    实验名称:LCD12864液晶显示实验(带字库) 接线说明:     实验现象:下载程序后,LCD12864上显示汉字字符信息 注意事项:                               ...

  4. 点阵LCD12864的显示原理(不带字库)

    点阵LCD12864的显示原理(不带字库) 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果.对于显示英文操作,由于英文字母种类很少,只需要8位(一字节 ...

  5. 带时间锉字段查询不走索引优化记录!+数据库卡顿问题排查顺序

    近期解决了病历系统数据库卡顿的问题,以下为分析经过,本文重点为带时间锉字段的优化和数据库卡顿问题排查的思路! 郑州病历系统登录卡慢问题,初步看是体温单表(t_vital_signs)查询没走索引影响的 ...

  6. STM32系列(HAL库)——F103C8T6硬件SPI点亮带字库OLED屏

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)程序:点击下载 2.硬件准备 (1)1.3寸带字库OLED 注意,成品模块无RES引脚,模块正常工作时RES置于高电平,成品模块是硬 ...

  7. 记录mysql数据库存表情

    记录mysql数据库存表情 项目需求:类似于淘宝的订单评价页面 扩展:数据存储与传输显示.扣扣表情包 项目需求:类似于淘宝的订单评价页面 期望页面显示出,在编辑信息框中输入的表情 一开始我们数据库表使 ...

  8. 【应急基础】————7、Tomcat日志如何记录POST数据

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. 对于常使用web服务器的朋 ...

  9. ST7920驱动的LCD12864实现单行反白显示

    参考链接: ST7920驱动的LCD12864实现单行反白显示 - jqdy - 博客园 12864液晶模块的详细使用_Rainlee随笔记-CSDN博客_12864使用 GDRAM空间有64×256 ...

最新文章

  1. opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分
  2. linux qt libs,linux下qt使用第三方库的那些事
  3. linux sz到指定的机器,linux 机器之间 zssh, rz, sz互相传输讲解
  4. oracle根据当前月份往前,oracle获取系统日期--当前时间+前一天+当前月+前一个月...
  5. 已知二叉树先序和中序,求后序。
  6. 测试用例(功能用例)——人员管理、资产入库
  7. 储氢合金/金属氢化物吸放氢动力学模型——Chou模型
  8. 前端-优雅的VueJS
  9. ospf多区域原理和配置
  10. python信用卡识别_在python中验证信用卡号码
  11. ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
  12. Pyecharts数据可视化之折线图(阶梯图、平滑曲线图、面积图)、K线图、常用配置项
  13. 地下管线探测仪的原理与性能——TFN T-6000地下管线探测仪
  14. ubuntu root初始密码设置
  15. 傅园慧为何一夜走红?互联网体育和网红经济爆发
  16. Django-MTV简介
  17. Deepfacelab实现视频换脸——使用体验
  18. SMT贴片加工需要哪些设备?
  19. 脑科学核磁共振——功能连接的常用度量方法
  20. c++ enum class的基础类型

热门文章

  1. 80后身处都市的十大尴尬
  2. IDEA配置JVM参数
  3. 电商新零售四种形态承泽集团思购臻选
  4. java map 线程安全_Map线程安全的四种实现方法
  5. Keycloak 初步 学习了解
  6. java基础知识总结:基础知识、面向对象、集合框架、多线程、jdk1.5新特性、IO流、网络编程
  7. 什么是CCC认证3C强制认证机构
  8. 2021双十二组一套电脑配置的攻略
  9. 数据库的断言是什么?
  10. 备份你QQ的重要数据(转)