赞
踩
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 降低撸代码手酸的风险
*/
一、第一个函数
先看时序图
由时序图可以知道两个简单的关系,(看图标记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 /0xa0
WriteDatatoHT1621(Addr<<2,6);//写入地址
WriteDatatoHT1621(Data<<4,4);//写入数据 这里是对应单个SEG写的 故而为4
PinHigh_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 3
WriteDatatoHT1621(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(网上找找随便一堆)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。