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

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

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/

你可能感兴趣的文章
OpenDaylight融合OpenStack架构分析
查看>>
openEuler Summit 2022 成功举行,开启全场景创新新时代
查看>>
openEuler 正式开放:推动计算多样化时代的到来
查看>>
OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
查看>>
OpenFeign源码学习
查看>>
OpenFeign组件声明式服务调用
查看>>
Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)
查看>>
opengl 深度详解,多重采样时,如何在OpenGL纹理中解析深度值?
查看>>
OpenGL 的内置矩阵种种
查看>>
OpenGL中shader读取实现
查看>>
OpenGL着色器、纹理开发案例
查看>>
OpenJDK11 下的HSDB工具使用入门
查看>>
openjdk踩坑
查看>>
openjudge 1792 迷宫 解析报告
查看>>
Openlayers Draw的用法、属性、方法、事件介绍
查看>>
Openlayers layer 基础及重点内容讲解
查看>>
Openlayers map三要素(view,target,layers),及其他参数属性方法介绍
查看>>
Openlayers Map事件基础及重点内容讲解
查看>>
Openlayers Select的用法、属性、方法、事件介绍
查看>>
Openlayers Source基础及重点内容讲解
查看>>