#include "TM1638.h"


//************************************************************
#define DISP_CMD0 0x00   //4位13段
#define DISP_CMD1 0x01   //5位12段
#define DISP_CMD2 0x02  //6位11段
#define DISP_CMD3 0x03  //7位10段 
//执行DISP_CMDx会把显示亮度关掉,但显示内容不变
//************************************************************

//************************************************************
#define cmdwr1 0x40   //地址自动加一
#define cmdwr2 0x44   //固定地址
#define cmdwr3 0x40  //mcu写给TM1638
#define cmdwr4 0x42  //mcu读按键值(TM1638)至少延时1us 
//************************************************************
#define	DISP_OFF	    0X80   //关
#define	DISP_LV0	   	0X88   //最暗0x88--0x8F
#define	DISP_COMMAND	0x80   //小数点
#define	ADDR_COMMAND	0XC0   //地址从0x00开始
//*************************************************************
//共阴数码管显示代码
u8 code_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                           0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void TM1638_Write(unsigned char DATA){//写数据函数(没有STB—ENABLE)
   
   u8 ji;
	for(ji=0;ji<8;ji++)
	{
		CLK=0;
		if(DATA&0X01) DIO=1;
		else          DIO=0;
			DATA=DATA>>1;
		CLK=1;
	}
}
/*u8 TM1638_Read(void){     //读单个数据DIO要设为输入
  
	u8 ir,Datar=0x00;
	DIN=1;
	for(ir=0;ir<8;ir++)
	{
	Datar>>=1;
		CLK=0;
		if(DIN)
			Datar|=0x80;
		CLK=1;
	}
	return Datar;
}*/

void Write_COM(unsigned char cmd){     //发送命令字
	
	STB=0;
	TM1638_Write(cmd);
	STB=1;
}
/*u8 TM1638_ReadKey(void)     //读按键值DIO要设为输入
  {
		u8 ki;   u8 keybuff[4];   u8 keyvalue=0;
	STB=0;
	TM1638_Write(0x42);       //读数据命令
			delay_us(5);               ///不同mcu不同的延时?????****
	for(ki=0;ki<4;ki++)
		{
			keybuff[ki]=TM1638_Read();
		}
	STB=1;
		 // 8键  col:K3  row:KS1~KS8
  if((keybuff[0]&0x01)==0x01)  keyvalue=1;
	if((keybuff[0]&0x10)==0x10)  keyvalue=2;
	if((keybuff[1]&0x01)==0x01)  keyvalue=3;
	if((keybuff[1]&0x10)==0x10)  keyvalue=4;
	if((keybuff[2]&0x01)==0x01)  keyvalue=5;
	if((keybuff[2]&0x10)==0x10)  keyvalue=6;
	if((keybuff[3]&0x01)==0x01)  keyvalue=7;
	if((keybuff[3]&0x10)==0x10)  keyvalue=8;
       return keyvalue;	
	}*/
	
void Write_DATA(u8 add,u8 DATA){	//指定地址写入数据
    	
	Write_COM(0x44);//固定地址
	STB=0;
	TM1638_Write(0xc0|add);
	TM1638_Write(DATA);
	STB=1;
}

void init_TM1638(void){  //三个输出端口初始化
	 u8 i;
	  GPIO_InitTypeDef  GPIO_InitStructure; 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟     
    GPIO_InitStructure.GPIO_Pin = TM1638_DIO | TM1638_CLK| TM1638_STB;	//定义IO接口; //选择端口号(0~15或all)                        
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	  GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);
	
	  GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO);			//三个输出置高输出高
    GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);	
	  GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);	

	  Write_COM(0X40);
	  Write_COM(0x8f);       //亮度 (0x88-0x8f)8级亮度可调	
	  
	   STB=0;		           //
	  TM1638_Write(0xc0);    //设置起始地址
	  for(i=0;i<16;i++)	   //传送16个字节的数据
		TM1638_Write(0x00);
	   STB=1;
	
}
void init_TM1638Read(void)
{
	  GPIO_InitTypeDef  GPIO_InitStructure; 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟     
    GPIO_InitStructure.GPIO_Pin = TM1638_CLK| TM1638_STB;	////选择端口号(0~15或all)                        
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
	  GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);
}
/*void initTM1638DIN(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure; 
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟     
    GPIO_InitStructure.GPIO_Pin = TM1638_DIN;	////选择端口号(0~15或all)
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //选择IO接口工作方式 
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
    GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);

    GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO);			//三个输出置高输出高
    GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);	
	  GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);	
}*/
void TM1638_display_Fix(unsigned char add,unsigned char DATA){//固定地址传送
const u8 buff[22]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//数字0~9及0~9加点显示段码表
    //---------------      0    1    2    3    4    5    6    7    8    9    0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   无    
	Write_COM(0X44);
	STB=0;
	TM1638_Write(0xC0+2*add);
			delay_us(1);
	TM1638_Write(buff[DATA]);			
	STB=1;
}

//***********************************************
void TM1638_OneLED(u8 num,u8 flag)	//单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
{
	Write_COM(0x44);
	if(!flag)
		Write_DATA(2*num+1,1);
	else
		Write_DATA(2*num+1,0);
}  	
void TM1638_AllLED(u8 LED_flag)					//控制全部LED函数,LED_flag表示各个LED状态
{
	u8 i;
	Write_COM(0x44);
	for(i=0;i<8;i++)
		{
			if(LED_flag&(1<<i))
				Write_DATA(2*i+1,1);
			else
				Write_DATA(2*i+1,0);
		}
}
/*
选择IO接口工作方式:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_AF_PP 复用推挽输出
GPIO_Mode_AF_OD 复用开漏输出
*/




#ifndef __TM1638_H
#define __TM1638_H	 
#include "sys.h"
#include "delay.h"

#define TM1638_GPIOPORT	GPIOA	//定义IO接口
#define TM1638_STB	GPIO_Pin_5	//定义IO接口
#define TM1638_DIO	GPIO_Pin_12	//定义IO接口
#define TM1638_CLK	GPIO_Pin_11	//定义IO接口

#define STB PAout(5)  //定义输出
#define DIO PAout(12)  //
#define CLK PAout(11)  //
//*******************************
#define DIN PAin(4)
#define TM1638_DIN GPIO_Pin_4//定义输入管脚



//**************************************************************
	void TM1638_Write(unsigned char DATA);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 /* void initTM1638DIN(void);

	u8 TM1638_Read(void);
	u8 TM1638_ReadKey(void);  //读按键值*/
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    void init_TM1638(void);

  void Write_DATA(u8 add,u8 DATA);//指定地址写入数据
	void Write_COM(unsigned char cmd);//写命令
  void TM1638_display_Fix(unsigned char add,unsigned char DATA);//固定地址传送
  void TM1638_OneLED(u8 num,u8 flag);      //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
	void TM1638_AllLED(u8 LED_flag);				//控制全部LED函数,LED_flag表示各个LED状态
	
	
#endif

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "TM1638.h"
//#include "led.h"

int main (void){//主程序
	RCC_Configuration(); //时钟设置
	init_TM1638();//亮度0x8b,7位10段//固定地址模式
	while(1){
 
		TM1638_display_Fix( 0,1);//固定地址传
		TM1638_display_Fix( 1,1);
		TM1638_display_Fix( 2,2);
		TM1638_display_Fix( 3,3);
    TM1638_display_Fix( 4,20);
    TM1638_display_Fix( 5,15);
    TM1638_display_Fix( 6,16);
    TM1638_display_Fix( 7,17);	
		
//		 TM1638_OneLED(1,1);      //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
//		TM1638_OneLED(2,0);      //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
//		TM1638_OneLED(3,1);
//		TM1638_OneLED(4,0);
//		TM1638_OneLED(5,1);      //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
//		TM1638_OneLED(6,0);      //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
//		TM1638_OneLED(7,1);
//		TM1638_OneLED(8,0);
		TM1638_AllLED(0xAA);				//控制全部LED函数,LED_flag表示各个LED状态
	
		
}
}



【变量定义】
u32     a; //定义32位无符号变量a
u16     a; //定义16位无符号变量a
u8     a; //定义8位无符号变量a
vu32     a; //定义易变的32位无符号变量a
vu16     a; //定义易变的 16位无符号变量a
vu8     a; //定义易变的 8位无符号变量a
uc32     a; //定义只读的32位无符号变量a
uc16     a; //定义只读 的16位无符号变量a
uc8     a; //定义只读 的8位无符号变量a

#define ONE  1   //宏定义

delay_us(1); //延时1微秒
delay_ms(1); //延时1毫秒
delay_s(1); //延时1秒
*/

更多推荐