基于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

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

你可能感兴趣的:(stm32,单片机,arm)