博客
关于我
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/

你可能感兴趣的文章
POJ 3349 Snowflake Snow Snowflakes
查看>>
POJ 3411 DFS
查看>>
poj 3422 Kaka's Matrix Travels (费用流 + 拆点)
查看>>
Qt笔记——官方文档全局定义(二)Functions函数
查看>>
POJ 3468 A Simple Problem with Integers
查看>>
poj 3468 A Simple Problem with Integers 降维线段树
查看>>
poj 3468 A Simple Problem with Integers(线段树 插线问线)
查看>>
poj 3485 区间选点
查看>>
poj 3518 Prime Gap
查看>>
poj 3539 Elevator——同余类bfs
查看>>
Qt笔记——官方文档全局定义(三)Macros宏
查看>>
poj 3628 Bookshelf 2
查看>>
Qt笔记——官方文档全局定义(一)Types数据类型
查看>>
POJ 3670 DP LIS?
查看>>
POJ 3683 Priest John's Busiest Day (算竞进阶习题)
查看>>
POJ 3988 Selecting courses
查看>>
POJ 4020 NEERC John's inversion 贪心+归并求逆序对
查看>>
poj 4044 Score Sequence(暴力)
查看>>
POJ 基础数据结构
查看>>
POJ 题目3020 Antenna Placement(二分图)
查看>>