目录

1、根据时序图了解通讯协议格式

2、写驱动函数


HT1622数据手册(嘉立创)

1、根据时序图了解通讯协议格式

根据HT1622数据手册中的时序图可知:

向HT1622传送指令时序图

向HT1622传送数据时序图

1)从N1处可知,当CS处于低电平时,WR才有效。

2)从N2处可知,当CS处于低电平,且当WR脚处于上升沿时,DATA才有效。

3)从N3处可知,向HT1622传送指令的通讯协议格式为:3位命令标识+9位指令。

4)从N4处可知,向HT1622传送数据的通讯协议格式为:3位命令标识+6位地址+4位数据。

5)从N5处可知,向HT1622连续传送多组数据,后续数据会自动更新写入到下一个地址。

6)从N3/N4/N5处可知,向HT1622写入数据时,指令和地址是从高位写入,数据是从低位写入。


2、写驱动函数

HT1622命令标识

HT1622指令表

HT1622 RAM映射

由HT1622 RAM映射表可知,SEGx 和 其首地址Addr 的关系(Addr = SEGx * 2),是连续映射的。所以在写入数据时,可以使用SEGx代替地址,一次写入8位数据(控制SEGx下的8个COM),能更简洁直观地对断码屏进行操作。注意,有的屏幕供应商提供的DataSheet,SEG是从1开始计数,而不是0。(我手中断码屏DataSheet(如下图)的就是从1开始计数)

段码屏DataSheet

写驱动函数:

*注:我的工程中移植了RT_Thread,故延时函数使用的是 rt_thread_delay();

#define DISPLAY 1 // 显示
#define HIDE 0    // 隐藏// 定义数据IO口
#define ScreenBLED_ON Screen_BLED_GPIO_Port->BSRR = Screen_BLED_Pin // 开启屏幕背光
#define ScreenBLED_OFF Screen_BLED_GPIO_Port->BRR = Screen_BLED_Pin // 关闭屏幕背光
#define ScreenCS_H Screen_CS_GPIO_Port->BSRR = Screen_CS_Pin        // 将CS拉高
#define ScreenCS_L Screen_CS_GPIO_Port->BRR = Screen_CS_Pin         // 将CS拉低
#define ScreenWR_H Screen_WR_GPIO_Port->BSRR = Screen_WR_Pin        // 将WR拉高
#define ScreenWR_L Screen_WR_GPIO_Port->BRR = Screen_WR_Pin         // 将WR拉低
#define ScreenDATA_H Screen_DATA_GPIO_Port->BSRR = Screen_DATA_Pin  // 将DATA拉高
#define ScreenDATA_L Screen_DATA_GPIO_Port->BRR = Screen_DATA_Pin   // 将DATA拉低// 定义指令代码
#define SYSDIS 0x00  // 0b 0000 0000 关闭系统振荡器和LCD偏压发生器
#define SYSEN 0x01   // 0b 0000 0001 打开系统振荡器
#define LCDOFF 0x02  // 0b 0000 0010 关闭LCD偏压
#define LCDON 0x03   // 0b 0000 0011 打开LCD偏压
#define WDTDIS 0x05  // 0b 0000 0101 禁止看门狗
#define RC32K 0x18   // 0b 0001 1000 内部时钟
#define TONEOFF 0x08 // 0b 0000 1000 关闭声音输出// "8"形状数码屏数字定义
uint8_t NumData[10] = {0xEE, 0x24, 0xD6, 0xB6, 0x3C, 0xBA, 0xFA, 0x26, 0xFE, 0xBE}; // 0~9// 定义显示数字区域的SEGx,从低位到高位
uint8_t SEG_ShowNum[4] = {6, 5, 4, 3};//===========================================================================
// 函数名: WrBit_H
// 功能  : 将数据data从高位开始(高-->低),写入cnt位
// 参数  : data:写入的数据;cnt:写入位数
// 返回值: none
//===========================================================================
void WrBit_H(uint8_t data, uint8_t cnt)
{uint8_t i;for (i = 0; i < cnt; i++){ScreenWR_L;rt_thread_delay(1);if (data & 0x80)ScreenDATA_H;elseScreenDATA_L;rt_thread_delay(1);ScreenWR_H;rt_thread_delay(1);data <<= 1;}
}//===========================================================================
// 函数名: WrBit_L
// 功能  : 将数据data从低位开始(高<--低),写入cnt位
// 参数  : data:写入的数据;cnt:写入位数
// 返回值: none
//===========================================================================
void WrBit_L(uint8_t data, uint8_t cnt)
{uint8_t i;for (i = 0; i < cnt; i++){ScreenWR_L;rt_thread_delay(1);if (data & 0x01)ScreenDATA_H;elseScreenDATA_L;rt_thread_delay(1);ScreenWR_H;rt_thread_delay(1);data >>= 1;}
}//===========================================================================
// 函数名: HT1622WrCmd
// 功能  : 向HT1622写入指令
// 参数  : Cmd:指令代码
// 返回值: none
//===========================================================================
void HT1622WrCmd(uint8_t Cmd)
{ScreenCS_L;rt_thread_delay(1);WrBit_H(0x80, 3); // 写入命令标志WrBit_H(Cmd, 9);  // 写入命令数据ScreenCS_H;rt_thread_delay(1);
}//===========================================================================
// 函数名: HT1622WrData
// 功能  : 向HT1622的SEGx写入8位数据(直接控制SEGx下的所有内容)
// 参数  : SEGx:数据映射表中的SEGx列;Data:要写入的控制数据
// 返回值: none
//===========================================================================
void HT1622WrData(uint8_t SEGx, uint16_t Data)
{uint8_t Addr;Addr = (SEGx - 1) * 2;ScreenCS_L;rt_thread_delay(1);WrBit_H(0xA0, 3);      // 写入数据标志WrBit_H(Addr << 2, 6); // 写入6位地址WrBit_L(Data, 8);      // 写入8位数据ScreenCS_H;rt_thread_delay(1);
}//===========================================================================
// 函数名: FullScreenContent
// 功能  : 控制全屏的内容为 显示/隐藏
// 参数  : state:显示状态(DISPLAY/HIDE)
// 返回值: none
//===========================================================================
void FullScreenContent(uint8_t state)
{ScreenCS_L;rt_thread_delay(1);WrBit_H(0xA0, 3); // 写入数据标志WrBit_H(0x00, 6); // 写入6位地址// 对所有地址写入数据 1/0 —— DISPLAY/HIDEfor (uint16_t i = 0; i < 8 * 32; i++){ScreenWR_L;rt_thread_delay(1);if (state)ScreenDATA_H;elseScreenDATA_L;rt_thread_delay(1);ScreenWR_H;rt_thread_delay(1);}ScreenCS_H;rt_thread_delay(1);
}//===========================================================================
// 函数名: DisplayNum
// 功能  : 在段码屏的数字显示区域SEG_ShowNum显示数字
// 参数  : Num:要显示的多位数
// 返回值: none
//===========================================================================
void DisplayNum(uint16_t Num)
{for (uint8_t i = 0; i < sizeof(SEG_ShowNum); i++){if ((Num == 0) && (i != 0))HT1622WrData(SEG_ShowNum[i], 0x00);elseHT1622WrData(SEG_ShowNum[i], NumData[Num % 10]);Num /= 10;}
}//===========================================================================
// 函数名: Screen_Init
// 功能  : 屏幕初始化
// 参数  : none
// 返回值: none
//===========================================================================
void Screen_Init(void)
{ScreenCS_H;ScreenWR_H;ScreenDATA_H;ScreenBLED_ON;rt_thread_mdelay(1000);HT1622WrCmd(RC32K);HT1622WrCmd(SYSEN);HT1622WrCmd(LCDON);FullScreenContent(HIDE);// 测试例程:倒数计数显示for (int16_t i = 110; i >= 0; i--){rt_thread_delay(10);DisplayNum(i);}
}

测试例程:倒数计数显示效果

段码屏倒数显示效果

HT1622 驱动断码屏相关推荐

  1. 启明云端分享|干货来了,怎么用ESP32-S2驱动断码屏呢?更多干货欢迎关注启明云端CSDN技术社区!

    一.基础理论 ESP32-S2具有43个GPIO,理论上可以支持835=280段,但实际上,受限于刷新率和保持时间的限制,按刷新时间20ms,保持时间1ms计算,大概能支持的上限为820=160段. ...

  2. STM32 HAL CubeMX断码屏配置与使用

    STM32L476 LCD直接驱动断码屏使用注意事项 1,配置: 1.1对于偏压,电路上可以不用做处理,直接在软件里配置即可 1.2High Drive 选项如果不勾选,可能会造成,点亮SEG上的多条 ...

  3. PIC单片机驱动LCD断码屏代码生成工具

    PIC单片机驱动LCD断码屏代码生成工具 PIC 16系列单片机部分型号都带有LCD(断码)驱动模块, 在编写这部分代码的过程中发现对驱动管脚赋值逻辑有很大的重复部分. 所以写了一个宏函数,自动生成驱 ...

  4. LCD断码屏显示应用框架

    简介 最近项目中使用的一个LCD断码屏显示驱动框架. 调用流程图 #mermaid-svg-ADdG5SIksHe7pfHt {font-family:"trebuchet ms" ...

  5. 杰理-断码屏的显示其实也很酷炫

    断码屏其实主要还是用到COM口和SEG口 通常COM口是固定的几个口 加上你想要的驱动-就可以看到唯美画面-值得收藏

  6. [MM32生态]如何使用不带SLCD控制器的MCU IO直接驱动段码屏

    前言 相信大家都对段码液晶屏都不陌生了,在电子大爆炸的日常生活中到处可以见到它的身影,比如在通信工具.家用电器.仪器仪表.交通工具.文教体娱.医疗保健.光阀产品等等应用领域.段码屏一般外形尺寸都在 2 ...

  7. 电动车断码屏为什么更适宜选用LCD显示屏

    近些年LCD显示屏屏的应用贯穿手机平板电脑.智能POS以及智能机器人等多项不同的产品中.它的触摸方式.亮度以及视角相较之前都有了新的升级, 如此一来LCD显示屏的传输性能便能获得良好提升,现在就电动车 ...

  8. LCD段/断码屏的针脚如何设计?

    LCD断码屏在不通电的情况下是看不见内容的,这样就会导致双边出针脚的液晶屏在量产的时候焊接的工人把液晶给焊接反了,从而导致生产的不良品,在这里小编给大家个建议就是尽量在LCD断码屏针脚的设计上,两边的 ...

  9. 区分车上的点阵屏、彩屏、断码屏

    一.彩屏 二.点阵屏 三.断码屏 四.总结

最新文章

  1. linux如何使用物理内存_10 张图解再谈 Linux 物理内存和虚拟内存
  2. 线程和进程之间的联系----基本概念
  3. azure云数据库_Azure SQL数据库中的地理复制
  4. python和java的区别-Python与Java的区别与优劣?
  5. 关于 myeclipse 里面没有 add hibernate capabilities 问题解决方法
  6. Windows10 2021年5月更新正式推出,驱动人生详细介绍win10更新新功能
  7. 从零开始Android游戏编程(第二版) 第一版前言
  8. java商场购物幸运客户练习题_JAVA基础语法练习(一)
  9. C#.net 微信公众账号接口开发
  10. 记录一下自己写的小工具:shell 调度 SQL 批处理,递归查找调度路径
  11. 河南大学计算机类保研率,郑州大学、河南大学、河南农业大学2021届保研率
  12. mac 查看本地php 版本,Mac系统版本怎么看
  13. 一场疫情,全民变厨子、医生变战士、教师变主播、只有孩子们,依然是神兽!...
  14. 气化及燃烧相关知识点
  15. SQL Server:mdf文件和ldf文件是什么?
  16. python韩信点兵
  17. 中职学校计算机大赛方案,2014年河北省中等职业学校信息化教学大赛方案(附件1)...
  18. 影响域名解析生效的原因有哪些?
  19. 以下不属于<foreach>元素中使用的属性的是()
  20. 使用transfrom来制作旋转木马

热门文章

  1. 最长递增子序列(信封嵌套问题)
  2. redis的哨兵机制
  3. 中国电信eSIM即将支持Apple Watch 为何说苹果与运营商关系尴尬?
  4. 黑客讲故事:攻下隔壁女生路由器后,我都做了些什么【转】
  5. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解
  6. h1283 linux内核,复苏老客 » 发布H1283双核固件0510版
  7. Elasticsearch-7.8.0源码编译
  8. appletviewer用法
  9. 好用的ftp/sftp软件
  10. python跟谁学_Python和Java学哪个更好?