51单片机驱动TM1640实现多个LED灯控制

TM1640的功能实现

      • 功能详解
      • TM1640的初始化
      • TM1640时钟配置
        • 起始信号
        • 写数据
        • 结束信号
      • 发送显示
      • IO口的初始化
      • 宏定义部分
      • 定位具体灯珠,实现控制

功能详解

本工程在于使用51系列单片机实现多个LED灯的定位显示控制功能

TM1640的初始化

void TM1640_Init(u8 InValue)    
{  
        GPIO_WriteHigh(GPIO4,GPIO_PIN_1);			//P41写高   DIN  
        Delay_Some_Time(1);
	      GPIO_WriteHigh(GPIO4,GPIO_PIN_0);			//P40写高   SCLK
        if(InValue == DSPTM1640_DIS) //显示关  
        {  
           TM1640Start();//数据写模式设置  
           TM1640WriteByte(DSP1640_DIS);//显示关控制   
           TM1640Stop();         
        }  
        else  
        {  
           TM1640Start();//数据写模式设置  
           TM1640WriteByte(TM1640_FIEXD);//数据命令设置 地址自动加1  
           TM1640Stop();         
           TM1640Start(); //显示亮度设置  
           TM1640WriteByte(TM1640_DISPLAY); //显示命令控制  脉冲宽度14/16       
           TM1640Stop();  
        }  
}  

TM1640时钟配置

驱动TM1640需要自己按照数据手册配置时钟。时钟信号的配置决定了tm1640的使用。

起始信号

void TM1640Start(void)  
{   
        GPIO_WriteHigh(GPIO4,GPIO_PIN_1);			//P41写高   DIN  
	      GPIO_WriteHigh(GPIO4,GPIO_PIN_0);			//P40写高   SCLK  
        Delay_Some_Time(1);  
        GPIO_WriteLow(GPIO4,GPIO_PIN_1);	   //p41低电平  DIN 
        Delay_Some_Time(1);  
        GPIO_WriteLow(GPIO4,GPIO_PIN_1);     //p40低电平  SCLK 
        Delay_Some_Time(1);  
}  

写数据

void TM1640WriteByte(u8 date)  
{  
   u8 i;  
   u8 Tmp;    
   Tmp=date;           
   GPIO_WriteLow(GPIO4,GPIO_PIN_1);	   //p41低电平  DIN
   GPIO_WriteLow(GPIO4,GPIO_PIN_0);     //p40低电平  SCLK
   for(i=0;i<8;i++)  
   {  
     GPIO_WriteLow(GPIO4,GPIO_PIN_0);     //p40低电平  SCLK  
     Delay_Some_Time(1);  
     if(Tmp&0x01)  
      {  
         GPIO_WriteHigh(GPIO4,GPIO_PIN_1);			//P41写高   DIN  
         Delay_Some_Time(1);
      }  
     else  
      {  
         GPIO_WriteLow(GPIO4,GPIO_PIN_1);	   //p41低电平  DIN  
         Delay_Some_Time(1); 
      }  
       GPIO_WriteHigh(GPIO4,GPIO_PIN_0);			//P40写高   SCLK
       Tmp = Tmp>>1;  
   }  
   GPIO_WriteLow(GPIO4,GPIO_PIN_0);     //p40低电平  SCLK  
   GPIO_WriteLow(GPIO4,GPIO_PIN_1);	   //p41低电平  DIN  
}  

结束信号

void TM1640Stop(void)  
{  
  GPIO_WriteLow(GPIO4,GPIO_PIN_1);	   //p41低电平  DIN 
  GPIO_WriteHigh(GPIO4,GPIO_PIN_0);			//P40写高   SCLK  
  Delay_Some_Time(1);  
  GPIO_WriteHigh(GPIO4,GPIO_PIN_1);
  Delay_Some_Time(1); 
} 

发送显示

void TM1640_display(u8 *a)  
{  
        u8 i;    
        TM1640Start();  
        TM1640WriteByte(0x40); //设置起始地址 
	      TM1640Stop();
	
	      TM1640Start(); 
	      TM1640WriteByte(0xc0); 
        for(i=0;i<16;i++)  
        {  
                TM1640WriteByte(a[i]);   
        }    
        TM1640Stop();
				TM1640Start();  
        TM1640WriteByte(0x8b); //设置起始地址 
	      TM1640Stop();
} 

IO口的初始化

void TM1640_GPIO_Config(void)
{
	GPIO_Init(GPIOx, GPIO_PIN_x,GPIO_MODE_OUT_PP);     //控制tm1640引脚 DIN
	GPIO_Init(GPIOx, GPIO_PIN_x,GPIO_MODE_OUT_PP);     //控制tm1640引脚 SCLK
}

宏定义部分

#define     addr_TM1640   (0xc0+0x01)
#define     DSPTM1640_DIS     0   
#define     DSPTM1640_ENB     1  
//模式设置
#define TM1640_ADD      0x40    //宏定义 自动加一模式
#define TM1640_FIEXD    0x44    //宏定义 固定地址模式
#define DSP1640_DIS     0x80    //宏定义 亮度 关
#define TM1640_DISPLAY  0x8f    //宏定义 亮度 11/16   脉冲宽度可调节 

定位具体灯珠,实现控制

#define     DSPTM1640_DIS     0   
u8 R_level[48] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
}
void deal_Disp()
{
  u8 i,j;
  u8 current_level = 0; //当前档位
  u16 led_data[8]={0};
  u8 F[4] = {0};
 while(1)
	{	
	disp_level(current_level);
		//-----------------TM1640-----------------//	
		for(i = 0; i < 8; ++i)
		{
			for(j = 0; j < 4; ++j)
			{
				//i 1  
				F[j] = ( ((R_level[((i*4)+j)*2] & 0xF0) >> 4) == current_level )//0   8
									|(( (R_level[((i*4)+j)*2] & 0x0F) == current_level) << 1) //0  8
									|(( ((R_level[((i*4)+j)*2 +1] & 0xF0) >> 4)  == current_level) << 2)//0  9
									|(( (R_level[((i*4)+j)*2 +1] & 0x0F)== current_level) << 3);//i1  j3  15
			}
		led_data[i] = (F[1]<<12)  | (F[0]<<8) | (F[3]<<4)|  (F[2]);	
       }
		//最后、显示
		TM1640_display((u8*)led_data); 	
}
void main(void)
{ 	
	TM1640_GPIO_Config();
	TM1640_Init(DSPTM1640_DIS); 		//TM1640初始化
	while(1)
	{
	deal_Disp();
	}
}

结束!!!

你可能感兴趣的:(51单片机驱动TM1640实现多个LED灯控制)