驱动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来控制的。