博客
关于我
TM16xx LED驱动和键盘扫描芯片使用
阅读量:379 次
发布时间:2019-03-05

本文共 3952 字,大约阅读时间需要 13 分钟。

TM1620B数码管芯片驱动与应用说明

TM1620B是一款高性能的数码管芯片,支持多种显示模式和通信接口,是开发者和工程师的理想选择。以下将从接法、功能、通信接口以及驱动代码等方面详细介绍其使用方法。

接法与功能介绍

TM1620B采用数码管共阳接法,控制方便且程序简单。这种接法通过写入显示寄存器来控制数码管的显示状态,具体包括以下功能:

  • 共阳接法:通过对显示寄存器进行操作,可以实现对数码管的亮度和显示模式的控制。相比于共阴接法,共阳接法的优点是控制简单,且不需要频繁刷新显存。
  • 芯片功能:TM1620B支持多种显示模式,包括普通模式、固定地址模式和数据命令模式。普通模式下,地址自动增加,数据一次性写入显存;固定地址模式下,地址值需手动设置。
  • 功能扩展:芯片内置消抖滤波器,能够有效处理按键输入的抖动问题。此外,支持长按和短按两种按键模式,具体实现方式需结合对应的驱动代码进行配置。

通信接口与数据传输

TM1620B采用I2C通信接口,支持3线和2线制两种模式。无论是3线制还是2线制,芯片都能通过 CLK 和 DIO 两条线实现数据的高效传输。以下是通信接口的详细说明:

  • 3线制接口:STB 信号用于数据传输的开始和停止控制。STB 的高电平表示数据传输开始,低电平表示停止。
  • 2线制接口:通过 CLK 和 DIO 的组合信号来实现数据传输。 CLK 的高电平表示 DIO 可以改变,而 CLK 的低电平表示 DIO 不能变化。
  • 数据传输特性:TM1637 芯片支持数据传输的应答机制。当数据传输正确时,芯片会在第八个时钟周期下降沿产生 ACK 应答信号。

驱动代码示例

以下是 TM1637 芯片的驱动代码示例,展示了如何实现数码管的显示控制和按键处理:

/* 定义控制端口 */
sbit CLK = P2^2;
sbit DIO = P2^3;
/* 显示数据对应表 */
unsigned char CODE[14] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
/* 数码管不显示状态 */
unsigned char CODE_NO[14] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/* 定义延时函数 */
void delay_nms(unsigned int n) {
unsigned int i;
while (n--) {
for (i = 0; i < 550; i++) {}
}
}
/* 启动I2C通信 */
void I2CStart() {
DIO = 1;
CLK = 1;
nop();
DIO = 1;
nop();
DIO = 0;
nop();
CLK = 0;
}
/* 停止I2C通信 */
void I2CStop() {
CLK = 0;
nop();
nop();
DIO = 0;
nop();
nop();
CLK = 1;
nop();
nop();
nop();
DIO = 1;
nop();
CLK = 0;
DIO = 0;
}
/* 8位数据的写入函数 */
void I2CWritebyte(unsigned char oneByte) {
unsigned char i;
for (i = 0; i < 8; i++) {
CLK = 0;
if (oneByte & 0x01) {
DIO = 1;
} else {
DIO = 0;
}
nop();
CLK = 1;
oneByte >>= 1;
}
CLK = 0;
nop();
while (DIO == 1) {
nop();
}
CLK = 1;
nop();
}
/* 读取按键函数 */
unsigned char read_key() {
unsigned char rekey, i;
I2CStart();
I2CWritebyte(0x42);
DIO = 1;
for (i = 0; i < 8; i++) {
CLK = 0;
nop();
rekey = rekey >> 1;
nop();
nop();
CLK = 1;
if (DIO) {
rekey |= 0x80;
} else {
rekey |= 0x00;
}
nop();
}
CLK = 0;
nop();
while (DIO == 1) {
nop();
}
CLK = 1;
nop();
nop();
I2CStop();
return rekey;
}
/* 显示控制函数 */
void disp0(unsigned char *p) {
unsigned char i;
I2CStart();
I2CWritebyte(0x40);
I2CStop();
I2CStart();
I2CWritebyte(0xC0);
for (i = 0; i < 6; i++) {
I2CWritebyte(*p);
p++;
}
I2CStop();
I2CStart();
I2CWritebyte(0x8C);
I2CStop();
}
/* 固定地址写数据函数 */
void disp(unsigned char add, unsigned char value) {
I2CStart();
I2CWritebyte(0x44);
I2CStop();
I2CStart();
I2CWritebyte(add);
I2CWritebyte(CODE[value]);
I2CStop();
I2CStart();
I2CWritebyte(0x8C);
I2CStop();
}
/* 按键处理函数 */
void key_process() {
unsigned char temp;
temp = read_key();
if (temp != 0xFF) {
disp0(TAB);
switch (temp) {
case 0xF7:
disp(0xC0, 1);
break;
case 0xF6:
disp(0xC1, 2);
break;
case 0xF5:
disp(0xC2, 3);
break;
case 0xF4:
disp(0xC3, 4);
break;
case 0xEF:
disp(0xC4, 5);
break;
case 0xEE:
disp(0xC5, 6);
break;
case 0xED:
disp(0xC0, 7);
break;
default:
break;
}
}
}
/* 主程序 */
void main() {
disp0(CODE);
delay_nms(1);
while (1) {
key_process();
delay_nms(100);
}
}

以上驱动代码为 TM1637 芯片的驱动程序,适用于对数码管进行显示控制和按键处理。此代码涵盖了芯片的主要功能,包括I2C通信、数据写入、显示控制以及按键事件处理。

转载地址:http://trgg.baihongyu.com/

你可能感兴趣的文章
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>