一.按键扫描前需切换为扫描模式
我使用的是立创商城旧版TM1650,立创商城提供的数据手册是比较早的版本。在这个版本中,没有任何关于进入扫描模式前需要进入扫描模式的描述,因此刚开始以为上电之后会自动开始扫描,只需要读取键盘扫描码即可。但是在上电之后按键按下,没有进入中断,读取到的按键扫描码为2E。
图1. 早期版本的数据手册
后来找到了新版的数据手册,上面有关于扫描模式的说明。从下面的图中可以看出,只要处于7段开屏,就可以进入按键扫描模式并且使用DP引脚的中断功能。
图2. DP引脚中断功能
图3. 按键扫描模式开启方法
二.扫描模式的切换方法
如何进入7段开屏(按键扫描模式)呢?可以通过系统参数来设置,首先发送48H,收到应答之后再发送参数。
图4.系统参数设置方法
那么又应该发送什么参数呢?
数据手册里的描述“48H+10H+01H=1级亮度开屏显示”,这里很容易让人误解。
如果要实现7段开屏的话,那应该发送48H、再发送08H、再发送01H,还是应该发送48H、再发送08H、再发送48H、再发送01H呢?另外在时序图里发送48H后只发送了一个字节,和这里的描述矛盾。
图5. 系统参数设置
正确的方法应该是:起始信号、发送48H、接受ACK、发送09H、接收ACK、结束通信。
09H是(08H | 01H)得到的,发送09H、19H、29H......79H都是可以的。
图6. 7段开屏方式
三.中断引脚的工作方式
由图6可以看出,当按键按下,DP引脚产生下降沿,如果不读按键扫描码,DP会保持低电平,无法再次进入中断。这也是检测到第一次按键按下而检测不到后续按键的原因。
(2024.9.2更新:程序中不要仅仅依靠外部中断下降沿来判断按键是否按下,因为某些原因(如I2C通信受到干扰)导致没有成功读取按键值,而DP引脚保持低电平,此时靠中断下降沿无法检测到按键按下。
可以在I2C通信中加入相应的错误处理机制,最好是在主程序加上读取DP引脚的代码,如果为低电平,则读取按键值,或者每隔一段时间读取一次按键)
四.二极管的方向
如果使用二极管防止鬼键,需要注意二极管的方向。
五.复位时间
上电之后不能立即进行通信,需要延迟一小段时间。
图7. 复位时间
六.供电电压
3-5.5V电压均可,对于3.3V单片机,最好使用3.3V供电。