基于STM32F103驱动TM1640LED数码管代码实现

本文是基于STM32F103单片机实现的,手册有写固定模式,和地址自加模式。本文采用固定模式,原因是方便改动。实现代码如下:

TM1640.C

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "TM1640.h"
#include "SysTick.h"



void TM1640_Init(void)
{		
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(SLK_PORT_RCC|DAT_PORT_RCC, ENABLE);

		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推晚输出    
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);   
		GPIO_SetBits(GPIOB, GPIO_Pin_10);	//  SCLK
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  
		GPIO_Init(GPIOB, &GPIO_InitStructure);     
		GPIO_SetBits(GPIOB, GPIO_Pin_11); //DAT
	
		TM1640Start();
	
		TM1640WriteByte(TM1640MEDO_ADD); //设置数据,0x40,0x44分别对应地址自动加一和固定地址模式
		TM1640Stop();
		TM1640Start();
		TM1640WriteByte(TM1640MEDO_DISPLAY); //控制显示,开显示,0x88,  0x89,  0x8a,  0x8b,  0x8c,  0x8d,  0x8e,  0x8f分别对应脉冲宽度为:
					 				  //------------------1/16,  2/16,  4/16,  10/16, 11/16, 12/16, 13/16, 14/16	 //0x80关显示
		TM1640Stop();	
}

/****************************************  
起始函数
***************************************/  
void TM1640Start(void)  
{   
        SLK = 1;
				delay_us(2);
				DAT=1;    
        delay_us(2) ;  
        DAT=0;
				delay_us(2);  
} 
/*************************************  
结束函数
***************************************/  
void TM1640Stop(void)  
{       
				SLK= 0;  
        delay_us(2);
				DAT= 0;  
        delay_us(2); 
        SLK = 1; 
        delay_us(2);
        DAT= 1;            
}  
/*************************************  
TM1640WriteByte  
写一字节数据  date 为所要写的数据
***************************************/  
void TM1640WriteByte(u8 date)  
{  
    u8 i;

        for(i=0;i<8;i++)  
        {  
          SLK=0;   
          delay_us(2);  
          if(date & 0x01)  //先低位后高位
          {  
						DAT= 1;   
						delay_us(3);  
          } else  
            {  
							DAT=0;  
							delay_us(3);  
            } 
							date = date >> 1;		//数据右移一位						
              SLK = 1;
							delay_us(3);                
        }		
		
} 

void Write_Com(uint8_t date)//发送命令字
{
	TM1640Start();
	TM1640WriteByte(date);
	TM1640Stop();
}
void cls_TM1640(void)//清屏函数
{
	unsigned char i;	
	Write_Com(0x40);//连续地址模式
	TM1640Start();
	TM1640WriteByte(0xc0);
	for(i=0;i<16;i++)
	{
		TM1640WriteByte(0x00);

	}
	TM1640Stop();
}


void Flow_Water_TM1640(void)//流水灯函数
{
	unsigned char i;	
	Write_Com(0x40);//连续地址模式
	TM1640Start();
	TM1640WriteByte(0xc0);
	for(i=0;i<16;i++)
	{
		TM1640WriteByte(0x00);
		delay_ms(100);
		TM1640WriteByte(0xff);
		delay_ms(100);
		TM1640WriteByte(0x00);
		delay_ms(100);
		TM1640WriteByte(0xff);
		delay_ms(100);
		TM1640WriteByte(0x00);
//		
	
	}
	TM1640Stop();
}


///***************************************
//发送数组
//Addr1640:起始地址值
//*a : 所要发送的数组
//ValueLong:想要发送的数据长度
//适用于地址自加1模式
//**************************************/
//void TM1640_SendData(u8 Addr1640,u8 *a,u8 ValueLong)  
//{  
//        u8 i;       
//        TM1640Start();  
//        TM1640WriteByte(Addr1640);   
//          
//        for(i=0;i<ValueLong;i++)  
//        {  
//          TM1640WriteByte(a[i]);   
//        }        
//        TM1640Stop();   
//}
//固定地址模式的显示输出LED控制
void TM1640_led(u8 addr, u8 date)
{ 
   TM1640Start();
   TM1640WriteByte(0XC0+addr); //传显示数据对应的地址
   TM1640WriteByte(date);	//传1BYTE显示数据
   TM1640Stop();
}



//固定地址模式的显示输出
void TM1640_display(u8 address,u8 date)
{ 
	const u8 buff[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};//数字0~9及0~9加点显示段码表
      
   TM1640Start();
   TM1640WriteByte(0xC0+address);	         //传显示数据对应的地址
	 TM1640WriteByte(buff[date]);				 //传1BYTE显示数据
   TM1640Stop();
}

void init_TM1640(void)
{
	cls_TM1640();
	Write_Com(TM1640MEDO_DISPLAY_OFF);//亮度
}

void TM1640_Set_SMG(void)
{
	
		TM1640Start();
		TM1640WriteByte(0x44);
		TM1640Stop();
		
		TM1640Start();
		TM1640_display(0xc0,0x00);
		TM1640Stop();
		
		TM1640Start();
		TM1640_display(0XC1,0X18);
		TM1640Stop();
		
		TM1640Start();
		TM1640_display(0XC2,0x18);
		TM1640Stop();
		
		TM1640Start();
		TM1640_display(0xC0,0x18);
		TM1640Stop();
		
		TM1640Start(); 
		TM1640_display(0XC4,0x18);
	  TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XC5,0x18);
		TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XC6,0x18);
		TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XC7,0x18);
		TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XC8,0x18);
		TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XC9,0x18);
		TM1640Stop();
			
		TM1640Start();
		TM1640_display(0XCa,0x18);
		TM1640Stop();
	
		TM1640Start();
		TM1640_display(0XCb,0x18);
		TM1640Stop();
		
		TM1640Start();
		TM1640_display(0XCc,0x18);
		TM1640Stop();

}
void TM1640_led_display(void)
{
		TM1640_led(0,0xff);
		TM1640_led(1,0XFF);
		TM1640_led(2,0XFF);

}

TM1640.H

#ifndef __TM1640_H__
#define __TM1640_H__
#include "stm32f10x.h"  
#include "system.h"
/* 
控制显示:
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 0x0X(这里X代表十六进制的任意值)
1/16,  2/16,  4/16,  10/16, 11/16, 12/16, 13/16, 14/16, 关灯  
 
0x40,0x44  分别对应  地址自动加1 和 固定地址      
*/  

#define TM1640MEDO_ADD  				0x44 
#define TM1640MEDO_DISPLAY_OFF  0x80 
#define TM1640MEDO_DISPLAY  		0x8c
#define TM1640_LEDPORT					0xC8	//定义IO接口


#define SLK_PORT           		GPIOB		              
#define SLK_PORT_RCC 	        RCC_APB2Periph_GPIOB		
#define SLK_PIN	    			 		GPIO_Pin_10	


#define DAT_PORT           			GPIOB		              
#define DAT_PORT_RCC 	         	RCC_APB2Periph_GPIOB		
#define DAT_PIN	  	   	 				GPIO_Pin_11



#define SLK PBout(10)  //输出	
#define DAT  PBout(11) 	



void TM1640_Init(void);
void TM1640Start(void);
void TM1640Stop(void);
void TM1640WriteByte(u8 date);
void TM1640_SendData(u8 Addr1640,u8 *a,u8 DataLong);

void TM1640_led(u8 addr, u8 date);
void TM1640_display(u8 address,u8 date);
void TM1640_Set_SMG(void);
void TM1640_led_display(void);
void TM1640_clear(void);
void Write_Com(uint8_t date);
void cls_TM1640(void);
void init_TM1640(void);
void Flow_Water_TM1640(void);

	
#endif

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小菜鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值