Controlador TM1640 basado en STM8 (con herramienta de configuración de tubo digital de ocho segmentos)

 

Tabla de contenido

archivo .c

archivo .h

Herramienta de configuración de tubos digital de ocho segmentos


archivo .c


#include "Bsp_TM1640.h"

const uint8_t DIG_TAB[16] =
{
	0X3F,//  0
	0X06,// 1
	0X5B,// 2
	0X4F,// 3
	0X66,// 4
	0X6D,// 5
	0X7D,// 6
	0X07,// 7
	0X7F,// 8
	0X6F,// 9
	0x79,//"E"  10
	0x50,//"r"	11 
	0x3E,//"U"  12
	0x38,//"L"  13
    0x77,//"A"  14
    0x71,//"F"  15
};

/********  TM1640 GPIO 配置 *************************/
void TM1640_GPIO_Config(void)
{		
    GPIO_Init(SCLK_GPIO_PORT,SCLK_GPIO_PIN,GPIO_MODE_OUT_PP_LOW_FAST);
	GPIO_Init(DIN_GPIO_PORT,DIN_GPIO_PIN,GPIO_MODE_OUT_PP_LOW_FAST);
}
  
//*************************************  
// 函数名称:_Nopt  
// 函数功能:延时函数  
// 入口参数:延时时间  
// 出口参数:无  
//***************************************/  
void Nop1640(uint16_t T_Dly)  
{     
        while(T_Dly--);           
        return ;  
}  
//****************************************  
// 函数名称:TM1640Start  
// 函数功能:TM1640起始信号  
// 入口参数:无  
// 出口参数:无  
//***************************************/  
void TM1640Start(void)  
{   
        TM1640DAT_HING;  
        Nop1640(VT_DLYNOP) ;  
        TM1640SLK_HING;  
        Nop1640(VT_DLY1640) ;  
        TM1640DAT_LOW;  
        Nop1640(VT_DLY1640) ;  
        TM1640SLK_LOW;  
        Nop1640(VT_DLY1640) ;  
}  
//*************************************  
// 函数名称:TM1640Stop  
// 函数功能:TM1640结束信号  
// 入口参数:无  
// 出口参数:无  
//***************************************/  
void TM1640Stop(void)  
{  
        TM1640DAT_LOW;  
        Nop1640(VT_DLYNOP) ;  
        TM1640SLK_HING;  
        Nop1640(VT_DLY1640) ;  
        TM1640DAT_HING;  
        Nop1640(VT_DLY1640) ;  
        TM1640SLK_LOW;  
        Nop1640(VT_DLY1640) ;  
          
}  
//*************************************  
// 函数名称:TM1640WriteByte  
// 函数功能:TM1640写一字节数据  
// 入口参数:要写的数据  
// 出口参数:无  
//***************************************/  
void TM1640WriteByte(uint8_t date)  
{  
        uint8_t i;  
        uint8_t Tmp;  
          
        Tmp=date;  
          
        TM1640DAT_LOW;  
        Nop1640(VT_DLYNOP) ;  
        TM1640SLK_LOW;  
          
        for(i=0;i<8;i++)  
        {  
                TM1640SLK_LOW;  
                Nop1640(VT_DLYNOP) ;  
                if(Tmp & 0x01)  
                {  
                        TM1640DAT_HING;  
                        Nop1640(VT_DLY1640) ;  
                }  
                else  
                {  
                        TM1640DAT_LOW;  
                        Nop1640(VT_DLY1640) ;  
                }  
                TM1640SLK_HING;  
                Tmp = Tmp>>1;  
        }  
          
        TM1640SLK_LOW;  
        Nop1640(VT_DLYNOP) ;  
        TM1640DAT_LOW;  
}  
//*************************************  
// 函数名称:TM1640_Init  
// 函数功能:TM1640设备初始化  
// 入口参数:0 1 代表 显示关 显示开  
// 出口参数:无  
//***************************************/  
void TM1640_Init(uint8_t InValue)    
{  
        TM1640DAT_HING;  
        Nop1640(VT_DLYNOP) ;                 
        TM1640SLK_HING;  
          
        if(InValue == DSP1640_DIS) //显示关  
        {  
                TM1640Start();//数据写模式设置  
                TM1640WriteByte(SET_DSP1640_DIS);//显示关控制   
                TM1640Stop();         
        }  
        else  
        {  
                TM1640Start();//数据写模式设置  
                TM1640WriteByte(SET_DATA_ORDER);//数据命令设置 地址自动加1  
                TM1640Stop();  
                  
                TM1640Start(); //显示亮度设置  
                TM1640WriteByte(SET_DISPLAY); //显示命令控制  脉冲宽度14/16       
                TM1640Stop();  
        }  
}  
//*************************************  
// 函数名称:TM1640_SendData  
// 函数功能:发送显示缓存  
// 入口参数:1640要写数据的起始地址  
//           显示数据缓存的起始地址 数据长度  
// 出口参数:无  
//***************************************/  
void TM1640_SendData(uint8_t Addr1640,const uint8_t *a,uint8_t DataLong)  
{  
        uint8_t i;    
          
        TM1640Start();  
        TM1640WriteByte(Addr1640); //设置起始地址  
          
        for(i=0;i<DataLong;i++)  
        {  
                TM1640WriteByte(a[i]);   
        }  
          
        TM1640Stop();   
} 

void TM1640_SendByte(uint8_t Addr1640, uint8_t a)
{  
          
        TM1640Start();  
        TM1640WriteByte(Addr1640); //设置起始地址  

        TM1640WriteByte(a);     
        TM1640Stop();   
}

void display_codebuf(uint8_t *codebuf)
{
	uint8_t i;
	for(i = 0; i < 4; i++)
    {
		TM1640_SendData(0XC0+3-i,&codebuf[i],1);
    }
}


int main(void)
{
    uint8_t led_test_data[4]={0};
    
    led_test_data[0]=DIG_TAB[5];
    led_test_data[1]=DIG_TAB[5];
    led_test_data[2]=DIG_TAB[5];
    led_test_data[3]=DIG_TAB[5];
    
    TM1640_GPIO_Config();
    TM1640_Init(DSP1640_ENB);
    
    while(1)
    {
        display_codebuf(led_test_data);
    }

}

archivo .h

#ifndef _BSP_TM1640_H
#define _BSP_TM1640_H
#include "main.h"  
 
#define   ADDR_START1640        0XC0  
  
#define     DSP1640_DIS     0  
#define     DSP1640_ENB     1  
  
/* 
控制显示 
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 分别对应 
1/16,  2/16,  4/16,  10/16, 11/16, 12/16, 13/16, 14/16    
 
设置数据,0x40,0x44分别对应地址自动加一和固定地址模式      
*/  
  
#define 		SET_DATA_ORDER     	 0X40  //数据命令设置 地址自动加1  
#define		        SET_DISPLAY        	 0X8F  //显示命令控制  脉冲宽度14/16  
#define 		SET_DSP1640_DIS          0x80  //显示关控制  
   
  
#define     VT_DLY1640           300//80//10//2000  
#define     VT_DLYNOP            160//80//10  
 
 
 
	       
 
#define SCLK_GPIO_PORT      GPIOB		              	
#define SCLK_GPIO_PIN	    GPIO_PIN_0		        
 
#define DIN_GPIO_PORT       GPIOB			              
#define DIN_GPIO_PIN	    GPIO_PIN_1	
 
 
#define TM1640SLK_LOW      GPIO_WriteLow(SCLK_GPIO_PORT, SCLK_GPIO_PIN )
#define TM1640SLK_HING     GPIO_WriteHigh(SCLK_GPIO_PORT, SCLK_GPIO_PIN )
#define TM1640DAT_LOW      GPIO_WriteLow(DIN_GPIO_PORT, DIN_GPIO_PIN )
#define TM1640DAT_HING     GPIO_WriteHigh(DIN_GPIO_PORT, DIN_GPIO_PIN )


extern const uint8_t DIG_TAB[16];
 
void TM1640_GPIO_Config(void);
void Nop1640(uint16_t T_Dly);
void TM1640Start(void);
void TM1640Stop(void);
void TM1640WriteByte(uint8_t date);
void TM1640_Init(uint8_t InValue);
void TM1640_SendData(uint8_t Addr1640,const uint8_t *a,uint8_t DataLong);
void display_codebuf(uint8_t *codebuf);

#endif

Herramienta de configuración de tubos digital de ocho segmentos

Enlace de descarga: https://download.csdn.net/download/zhuimeng_ruili/13586168

Supongo que te gusta

Origin blog.csdn.net/zhuimeng_ruili/article/details/110905146
Recomendado
Clasificación