TI中文支持网
TI专业的中文技术问题搜集分享网站

如何利用CC2541模块,控制TM1637来显示数码管

驱动4段数码管,利用CC2541模块。

确实是没有头绪,请大神赐教

gaoyang9992006:

这个好像是I2C接口的模块吧,你可以使用该单片机的I2C接口控制或者通过IO模拟时序控制,网上可以搜到很多这个模块使用8051控制的例子(IO模拟时序)。你可以参考后移植到这个单片机。或者按照那个模块使用说明通过硬件I2C操作

gaoyang9992006:

给你找了个51操作的例子。你可以移植,也可以参考这个指令用硬件收发器实现

/******************************************************************************版权信息:深圳天微电子有限公司*文 件 名: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 <reg52.h>//头文件
#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/* 0123456789abcdef*/
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;i<550;i++);
}/********************Start函数*************************/
void I2CStart()
{DIO=1;CLK=1;nop;DIO=1;nop;DIO=0;nop;CLK=0;
}/********************Stop函数*************************/
void I2CStop()
{CLK=0;nop;nop;DIO=0;nop;nop;CLK=1;nop;nop;nop;DIO=1;nop;CLK=0;DIO=0;
}/***************发送8bit数据,从低位开始**************/
void I2CWritebyte(unsigned char oneByte)
{unsigned char i;for(i=0;i<8;i++){CLK=0;if(oneByte&0x01)DIO=1;elseDIO=0;nop;CLK=1;oneByte=oneByte>>1;}//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<8;i++)
{CLK=0;nop;nop;rekey=rekey>>1;//先读低位nop;nop;CLK=1;if(DIO)rekey=rekey|0x80;elserekey=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);//地址命令设置:初始地址为00Hfor(i=0;i<6;i++)//发送4字节数据到显存{I2CWritebyte(*p);p++;}I2CStop();I2CStart();I2CWritebyte(0x8C);//显示控制命令:开显示,脉冲宽度为11/16.I2CStop();}/************显示函数,固定地址写数据************/
void disp(unsigned char add, unsigned char value)
{I2CStart();I2CWritebyte(0x44);//数据命令设置:固定地址,写数据到显示寄存器I2CStop();I2CStart();I2CWritebyte(add);//地址命令设置:写入add对应地址I2CWritebyte(CODE[value]);//给add地址写数据I2CStop();I2CStart();I2CWritebyte(0x8C);//显示控制命令:开显示,脉冲宽度为11/16.I2CStop();}/************按键处理函数,按键数据低位在前高位在后************/
void key_process()
{unsigned char temp;temp=read_key();//读取按键返回值if(temp!=0xff){disp0(TAB);//清屏switch(temp){case 0xf7 : disp(0xc0,1);break;//K1与SG1对应按键按下,显示1case 0xf6 : disp(0xc1,2);break;//K1与SG2对应按键按下,显示2case 0xf5 : disp(0xc2,3);break;//K1与SG3对应按键按下,显示3case 0xf4 : disp(0xc3,4);break;//K1与SG4对应按键按下,显示4case 0xef : disp(0xc4,5);break;//K2与SG1对应按键按下,显示5case 0xee : disp(0xc5,6);break;//K2与SG2对应按键按下,显示6case 0xed : disp(0xc0,7);break;//K2与SG3对应按键按下,显示7default: break;}}
}void main()
{disp0(CODE);//上电数码管显示0~5delay_nms(1);while(1)//按键后显示按键内容{key_process();delay_nms(100);}
}

Viki Shi:

楼上正解,不过我翻了一下TM1637的数据手册,里面有这样一句:Microprocessor data realize the communication with TM1637 by means of two–wire bus interface (Note: The communication method is not equal to 12C bus protocol totally because there is no slave address),这部分应用时需要注意

user5768496:

回复 gaoyang9992006:

谢谢大神,这个程序之前也有见到过。修改后数码管并没有被驱动。数码管也用TM1637来控制的。

赞(0)
未经允许不得转载:TI中文支持网 » 如何利用CC2541模块,控制TM1637来显示数码管
分享到: 更多 (0)