TM16xx LED驱动和键盘扫描芯片使用

您所在的位置:网站首页 tm1681芯片资料 TM16xx LED驱动和键盘扫描芯片使用

TM16xx LED驱动和键盘扫描芯片使用

2024-07-05 09:04| 来源: 网络整理| 查看: 265

作者

QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118

参考

天微公司官网 TM1637驱动程序 TM1637数码管显示STC51单片机驱动程序

管脚和功能介绍

数码管共阴接法, 在这里插入图片描述 这种接发最常用,控制方便,程序简单,SEGx对应的显示寄存器位置1,数码管发光, 在这里插入图片描述 共阳接法, 在这里插入图片描述 这种方式控制一个数码管,需要将所有的显存都刷新一遍,为了不改变其它数码管的状态,MCU必须记住当前显存值, 在这里插入图片描述 SEGx和GRIDx都是芯片管脚名,对于TM1620B,支持下面几种模式,TM1637/TM1638段数固定,不可切换, 在这里插入图片描述 TM637按键, 在这里插入图片描述 键值为,

0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,

芯片已经自带了消抖的功能,软件不需要实现,下面是针对按一下与长按处理,对于没有长按功能的按键,检测到键值相同就直接退出,

void KeyProcess(void) { unsigned char temp; keyEventLast = keyEvent; keyEvent = Tm16xxGetKey(); if (keyEvent != keyEventLast || keyEvent == KEY_NONE) { pressTime = 0; } pressTime += KEY_PROCESS_CYCLE; if (keyEvent == keyCode[KEY_MOSHI_ZHUANHUAN]) { if (keyEvent == keyEventLast) return; ... 指令

共4种类型命令,TM1620B支持4种,TM1637/TM1638没有第一个显示模式命令, 在这里插入图片描述 数据命令,设置普通模式,地址自动增加,写数据到显示寄存器,一次性把单片机里的数据写到显示寄存器,或者读键盘数据, 在这里插入图片描述 显示控制,可控制数码管的亮度,亮度小寿命长, 在这里插入图片描述 地址命令,注意,显示地址从0xC0,对应地址其实是0,0xC0是因为高两位的命令类型是11b,不同芯片显存长度不一致,下面是TM1620B,TM1637只有6个字节, 在这里插入图片描述 显存分布,以TM1620B说明,比如0xC1只有3/4/5位有用,对应点亮硬件原理图SEG12/SEG13/SEG14位置的LED, 在这里插入图片描述

通信接口

TM1620B/TM1638是3线制接口,STB下降沿为开始信号,STB高电平停止传输,TM1637是2线制接口,不同在于3线制多一个STB信号,可以表示数据起始停止信号,2线制中,这个信号通过CLK/DIO组合来实现,在输入数据时当CLK 是高电平时,DIO 上的信号必须保持不变;只有CLK 上的时钟信号为低电平时,DIO 上的信号才能改变。数据输入的开始条件是CLK 为高电平时,DIO 由高变低;结束条件是CLK 为高时,DIO 由低电平变为高电平。TM1637 的数据传输带有应答信号ACK,当传输数据正确时,会在第八个时钟的下降沿,芯片内部会产生一个应答信号ACK 将DIO 管脚拉低,在第九个时钟结束之后释放DIO 口线。TM1637读键盘数据,S0/S1/S2共3为对应8个SEGx上的按键,K1/K2是对应管脚上的按键, 在这里插入图片描述

驱动

TM1637官方驱动,

/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1637-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-07-19 *程序功能:数码管驱动和按键:驱动8段6位LED共阳数码管显示,当对应按键按下时显示1~7,原理图请参考TM1637规格书; *免责声明:1.此程序为TM1637驱动共阳LED数码管和按键演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //头文件 #include "intrins.h" //包含_nop_()指令头文件 #define nop _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/ sbit CLK=P2^2; //定义CLK sbit DIO=P2^3; //定义DIO /********************定义数据*************************/ unsigned char code CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳显示数据0-F /* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/ unsigned char code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//数码管不显示 /********************延时函数,延时nms******************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) for(i=0;i1; } //8位数据传送完 CLK = 0; //判断芯片发过来的ACK应答信号 nop; while(DIO==1); nop; CLK = 1; nop; } /***************读按键程序**************/ unsigned char read_key() { unsigned char rekey,i; I2CStart(); I2CWritebyte(0x42); //写读键指令0x42 DIO=1; for(i=0;i>1; //先读低位 nop; nop; CLK=1; if(DIO) rekey=rekey|0x80; else rekey=rekey|0x00; nop; } CLK = 0; //判断芯片发过来的ACK应答信号 nop; nop; while(DIO==1); nop; nop; CLK = 1; nop; nop; I2CStop(); return rekey; } /************显示函数,地址自加一************/ void disp0(unsigned char *p) { unsigned char i; I2CStart(); I2CWritebyte(0x40); //数据命令设置:地址自动加1,写数据到显示寄存器 I2CStop(); I2CStart(); I2CWritebyte(0xc0); //地址命令设置:初始地址为00H for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3