基于STM8的TM1640驱动程序(附八段数码管配置工具)

 

目录

.c文件

.h文件

八段数码管配置工具


.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);
    }

}

.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

八段数码管配置工具

下载链接:https://download.csdn.net/download/zhuimeng_ruili/13586168

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的基于STM32和C语言的TM1640驱动程序示例: ```c #include "stm32f10x.h" #define CLK GPIO_Pin_0 #define DIO GPIO_Pin_1 void TM1640_Init(void); void TM1640_WriteByte(uint8_t byte); void TM1640_SetData(uint8_t addr, uint8_t data[]); void TM1640_Display(uint8_t data[]); int main(void) { uint8_t data[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; TM1640_Init(); TM1640_Display(data); while(1); return 0; } void TM1640_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = CLK | DIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, CLK | DIO); } void TM1640_WriteByte(uint8_t byte) { uint8_t i; for(i = 0; i < 8; i++) { GPIO_ResetBits(GPIOB, CLK); if(byte & 0x01) GPIO_SetBits(GPIOB, DIO); else GPIO_ResetBits(GPIOB, DIO); byte >>= 1; GPIO_SetBits(GPIOB, CLK); } } void TM1640_SetData(uint8_t addr, uint8_t data[]) { uint8_t i; GPIO_ResetBits(GPIOB, CLK); TM1640_WriteByte(0x44); GPIO_SetBits(GPIOB, CLK); GPIO_ResetBits(GPIOB, CLK); TM1640_WriteByte(addr); GPIO_SetBits(GPIOB, CLK); GPIO_ResetBits(GPIOB, CLK); TM1640_WriteByte(0x00); for(i = 0; i < 8; i++) { TM1640_WriteByte(data[i]); } GPIO_SetBits(GPIOB, CLK); } void TM1640_Display(uint8_t data[]) { uint8_t i; for(i = 0; i < 8; i++) { TM1640_SetData(i * 2, &data[i]); } } ``` 该程序使用了STM32的GPIO模块来控制TM1640的CLK和DIO引脚。在程序中,TM1640_Init函数用于初始化GPIO引脚,TM1640_WriteByte函数用于写入一个字节,TM1640_SetData函数用于设置TM1640的地址和数据,TM1640_Display函数用于在TM1640上显示数据。在主函数中,程序初始化TM1640并显示一个包含8个字节的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值