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

你可能感兴趣的文章
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>