HT1621显示驱动

Author:家有仙妻谢掌柜
Date:2021/1/5

最近用到了HT1621来驱动一个断码屏,写在这里记录自己的成长历程,也分享出去供大家参考!

/*
首先声明在本程序中和移植相关的针对不同MCU所需要的做出的修改如下:
1.IO口 输入 输出 拉高 拉低等等如:以CS引脚为例   这里用宏定义的方式提高代码可读性PinOutput_CS;  //将CS引脚设置为输出PinHigh_CS;    //将CS引脚电平拉高PinLow_CS;     //将CS引脚电平拉低
2.变量宏定义如:初始化配置相关的宏定义(详见DataSheet)#define SYSEN  0x01#define RC256K 0x18#define BIAS   0x28|0x01//选中COM为4个公共口   0x01  选择了1/3偏压#define LCDON  0x03#define SYSDIS 0x00#define WDTDIS 0x05自定义封的宏#define WrCmd  0x80//控制发送命令标识的宏#define WrData 0xA0//控制发送写数据的宏#define BackLightInit   {PinOutput_BK; PinHigh_BK;}#define BackLightON     {PinHigh_BK;}#define BackLightOFF    {PinLow_BK;}
3.变量类型定义typedef unsigned char   u8;//标记为u8  降低撸代码手酸的风险
*/

驱动方面只写4个简单的函数

一、第一个函数
先看时序图

由时序图可以知道两个简单的关系,(看图标记N1,N2)
1.当CS脚处于低电平状态时,WR脚才有效。
2.当CS脚处于低电平状态 且 当WR脚处于上升沿的时候,DATA脚才有效。
由图N3标记可知,当写数据的时候命令标识为101,传输数据格式为:101 + 6bits的Addr + 4bits的Data。
我们会发现无论是传输①命令标识(100 101 110三种,详见DataSheet) 或者 ②6bits的Addr数据 又或者是 ③4bits的Data 都需要依靠DATA脚的拉高拉低作为载体来传输数据。
于是理解到这里,我们就能写出第一个函数(写这个函数有很多种写法,这里只给出最方便理解的写法)如下:

/******************************************************************************** fuction    WriteDatatoHT1621   * brief 写数据到HT1621 * param  Data:要写入的数据bits  num:传送数据位数* return   无*******************************************************************************/
void WriteDatatoHT1621(u8 Data,u8 num)
{ u8 i; for (i=0;i<num;i++){   PinLow_WR;              //拉低WR脚  Data线上的数据在WR脚位上升沿写入  if(((Data & 0x80)>>7)==1)//如果当前bit为1,就拉高DATA引脚PinHigh_Data;if(((Data & 0x80)>>7)==0)//如果当前bit为0,就拉低DATA引脚PinLow_Data;PinHigh_WR;            //当前这一bit写完,拉高WR脚,为下次WR为上升沿做准备Data<<=1;                //当前位用完了,移到下一位继续上述动作}
}

第一个函数中的参数说明:
data: 要传输的数据 可以是命令标识 或者 Addr 又或者是 Data
num: 为了方便使用在不同的地方 比如当传输命令标识(如:101时)只有3bits,传输Addr时有6bits,传输Data数据时有4bits

二、第二个函数
那么6bits的Addr 和 4bits的Data 分别是什么呢?
先看RAM映像示意图:

显示内存 RAM:
静态显示内存 RAM 以 32 x 4 位(即最多可以驱动128个点,可以理解为128个LED灯)的格式储存所显示的数据 RAM 的数据直接映象到 LCD 驱动器 可以用 READ ,WRITE 和 READ-MODIFY-WRITE 命令访问,我们前一张时序图就是截取的WRITE模式。
1.Addr:用6Bits的二进制数表示十进制的0~31,可以看出SEG0对应0 … SEG31对应31。
2.Data:用4Bits的二进制数表示要传输的数据,可以看出COM3对应bit3 … COM0对应bit0(有的屏幕厂给出的图是从COM4 - COM1的,那么它对应的依然是bit3 - bit0)。

接下来再看一张屏幕图纸就会明白。
重点去看一个数码管,了解原理就可以显示所有段。第2个液晶数码管,有7段,分别为A,B,C,D,E,F,G。也就分别为下面COM\SEG地址对应关系图中的5A,5B,5C,5D,5E,5F,5G。


如:要想让表示为5的数码管显示出来数字4,如图:

就要点亮图中的5B,5C,5F,5G段,于是就要向pin10写入1100即0x0C,向pin11写入0110即0x06(bit3-bit0对应COM4-COM1)
这里的pin就是SEG也就是地址,但是具体是如何对应的需要硬件原理图,我这里P上接线图


由接线图可以知道屏幕上的SEG0和HT1621上的SEG0对应,依次至SEGn
那么书回刚才的问题,点亮图中的5B,5C,5F,5G段,于是就要向SEG10写入1100即0x0C,向SEG11写入0110即0x06。

理解到这里我们就可以写出第二个函数,如下:

/******************************************************************************** fuction    WritetoHT1621   * brief 将要显示的数据写到HT1621* param  Addr:写入初始地址,Data:写入数据,Mode:0x80 /0xa0* return    无*******************************************************************************/
void WritetoHT1621(u8 Addr,u8 Data,u8 Mode)
{ PinLow_CS;WriteDatatoHT1621(Mode,3);   //写入0x80 /0xa0WriteDatatoHT1621(Addr<<2,6);//写入地址WriteDatatoHT1621(Data<<4,4);//写入数据  这里是对应单个SEG写的 故而为4PinHigh_CS;
}

第二个函数的参数:
Mode:0x80即表示命令标识100,0xa0即表示命令标识101。
解析:0x80:1000 0000 只去高三位就是100,
0xa0:1010 0000 只去高三位就是101 。

三、第三个函数
由于HT1621在正常工作开始之前需要进行一些初始化的步骤,那么转换到代码层理解就是需要发一些命令帮助HT1621完成初始化,于是如果封一个专门来发送命令的函数岂不美哉!

/******************************************************************************** fuction    WriteCmdtoHT1621    * brief 写命令到HT1621* param   Cmd:命令* return   无*******************************************************************************/
void WriteCmdtoHT1621(u8 Cmd)
{ PinLow_CS;                 //拉低CS脚  CS拉低时WR有效WriteDatatoHT1621(WrCmd,3);//写入命令标志100    0x80 3WriteDatatoHT1621(Cmd,8);  //写入命令数据 WriteDatatoHT1621(0,1);PinHigh_CS;                //拉高CS脚
}

该函数中用到了一个宏:WrCmd 即0x80写入命令标志100 在文章开始之前已经声明。

四、第四个函数
终于到了初始化HT1621函数的部分了,针对不同的MCU大同小异,根据不同的需求配置HT1621,详见DataSheet。

/******************************************************************************** fuction    HT1621Init  * brief HT1621初始化* param    无* return   无*******************************************************************************/
void HT1621Init(void)
{ /* 引脚配置相关 */PinOutput_CS;PinOutput_WR;PinOutput_Data;PinHigh_CS;PinHigh_WR;PinHigh_Data;/* 配置HT1621 */WriteCmdtoHT1621(SYSEN);WriteCmdtoHT1621(RC256K);WriteCmdtoHT1621(BIAS);WriteCmdtoHT1621(LCDON);
//      WriteCmdtoHT1621(SYSDIS);//根据需求添加
//      WriteCmdtoHT1621(WDTDIS);//根据需求添加BackLightInit;//背光灯WriteCmdtoHT1621(LCDON);
}

至此,HT1621的驱动就已经写完了,如何让自己的断码屏达到自己想要的效果,还需要封几个与屏幕硬件连接相关的函数(只要懂得点亮一个完整的数码管的原理,点亮相关屏幕不是问题),具体要看屏幕图纸和硬件连接。

附:HT1621Datasheet(网上找找随便一堆)

手把手教你写HT1621显示驱动,简单明了,内含原码,方便移植,相关推荐

  1. 手把手教linux设备驱动,手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)...

    这个专题我们来说下Linux中的定时器. 在Linux内核中,有这样的一个定时器,叫做内核定时器,内核定时器用于控制某个函数,也就是定时器将要处理的函数在未来的某个特定的时间内执行.内核定时器注册的处 ...

  2. 真牛皮!手把手教你写Android项目文档,内含福利

    概述 想了很久怎么样可以让文章的标题不那么悲观,但是各种文案都在我脑海里面不断的被否定,要么是不那么抓眼球,要么是立意不匹配.最后想了想,这个标题是真的符合我最近的感悟. 希望看过文章,能有同感的朋友 ...

  3. 手把手教你写Linux I2C设备驱动

    手把手教你写Linux I2C设备驱动 标签:Linux 设备 驱动 详解 i2c 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http:/ ...

  4. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  5. 手把手教你写批处理-批处理的介绍

    标题:手把手教你写批处理-批处理的介绍 作者:佚名 编者:Climbing 出处:中国 DOS 联盟之联合 DOS 论坛 题注:willsort 日期:2004-09-21 ------------- ...

  6. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 1

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  7. 【转载文章】手把手教你写批处理______附加我的读书笔记

    https://www.w3cschool.cn/dosmlxxsc1/uebwv9.html 手把手教你写批处理 由 ✎﹏๓₯㎕ζั͡❦﹏﹏♛ 创建, 最后一次修改 2015-11-06 手把手教你 ...

  8. python界面设计-手把手教你用Python设计一个简单的命令行界面

    原标题:手把手教你用Python设计一个简单的命令行界面 对 Python 程序来说,完备的命令行界面可以提升团队的工作效率,减少调用时可能碰到的困扰.今天,我们就来教大家如何设计功能完整的 Pyth ...

  9. hecto - 手把手教你写个 文本编辑器

    https://www.philippflenker.com/hecto/ 的阅读笔记. 我是学完[[Rust权威指南]] 之后才看的这个. 手把手教你写个 文本编辑器(1300+行代码). 作者是真 ...

最新文章

  1. 笔记-项目合同管理-要约、承诺和要约邀请
  2. 费马素性测试和米勒—拉宾素性测试
  3. 牛客 - Connie(AC自动机+dp/KMP+dp)
  4. SAP Spartacus里和focus相关的directive之间的继承关系
  5. 软件测试黑马程序员课后答案_软件测试课后答案
  6. android飞屏app下载地址,飞屏下载安卓最新版_手机app官方版免费安装下载_豌豆荚...
  7. adb工具下载及配置使用
  8. 微软的补丁服务器,Microsoft 安全公告 MS17-010 - 严重
  9. 【推荐】智慧应急指挥调度中心信息化软件平台管理系统建设解决方案合集(共46份,790M)
  10. java 移动平均_移动平均(转载)
  11. 数学建模:地貌图的完成
  12. 视频播放过程中做视频问答(视频弹题功能)
  13. 手机通过adb工具安装应用
  14. 6个大厂Offer,牛逼!
  15. 台积电5nm光刻技术
  16. 保姆级教程:如何搭建一个专属云平台?
  17. 网际协议IP---ARP协议
  18. 改变:从认识不足起步
  19. 基于CNTK实现自定义类库及使用方式(MNIST为例)【附源码】
  20. mysql分表准则_Mysql分表准则_MySQL

热门文章

  1. 个性化阅读中的推荐系统(一)
  2. win10鼠标灵敏度怎么调_win10系统怎么调鼠标灵敏度
  3. codeforces 820
  4. 华为荣耀android,速来围观!华为、荣耀将升级Android10名单流出,你手机在其中没...
  5. Ecstore可被访问外部接口的详细配置方式
  6. 200823 字节数分笔经+准备
  7. oppoa57手机的计算机功能在哪里,OPPO A57功能介绍
  8. 索引、顺序索引、聚集索引、非聚集索引、稠密索引、稀疏索引
  9. 一个简单的css网页换色例子(盒子模型)
  10. 华为服务器cpu是否支持虚拟化,处理器配置 - 华为服务器 Brickland平台 BIOS 参数参考 30 - 华为...