TM1638八位数码管八按键驱动程序(stm32f103驱动,使用了stm32 3.5库)

版权声明:欢迎转载,转载请保留文章出处。 https://blog.csdn.net/junzia/article/details/38843861
/**********************************************************************************************
**Program Assignment: Driver for TM1638 digital tube
**Author	    : Wuwang
**Date              : 2014.8.26 9:00
**Description       : This is a driver for the board which is controled by thechip of tm1638. 
		      The board has eight digital tubes which have eight segments and eight keys.
***********************************************************************************************/
#include "main.h"                              //#include "stm32f10x.h" 

/*********************define and global variables*********************************************/
#define STB GPIO_Pin_0          				//chip-select line
#define CLK GPIO_Pin_1                                 		//clock line
#define DIO GPIO_Pin_2																 		//data line
#define Set(x) GPIO_SetBits(GPIOA,(x))				//Sets the selected data port bits
#define Reset(x) GPIO_ResetBits(GPIOA,(x))			//Resets the selected data port bits
#define Get(x) GPIO_ReadInputDataBit(GPIOA,(x))==SET   		//Read the specified input port pin


uint16_t const tm_dat[2][14]={{'0','1','2','3','4','5',		//the char and its segment code 
			'6','7','8','9','.','-','_',' '},
			{0x3F,0x06,0x5B,0x4F,0x66,0x6D,
			0x7D,0x07,0x7F,0x6F,0x80,0x40,
			0x08,0x00}};

/***********************************************************************************************
*Function Name: RCC_Config		
*Purpose      : Configration Clock
***********************************************************************************************/
void RCC_Config(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
}

/***********************************************************************************************
*Function Name: GPIO_Config		
*Purpose      : Configration GPIO
***********************************************************************************************/
void GPIO_Config(){
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin=STB|CLK|DIO;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/***********************************************************************************************
*Function Name: Write_Byte		
*Purpose      : Write one byte to the data port
*params       : byte  -------8-bits byte  
*return       : none
***********************************************************************************************/
void Write_Byte(uint8_t byte){
	uint8_t i=0;
	for(i=0;i<8;i++){
		Reset(CLK);
		if(byte&0x01){
			Set(DIO);
		}else{
			Reset(DIO);
		}
		Set(CLK);
		byte>>=1;
	}
}

/***********************************************************************************************
*Function Name: Read_Byte		
*Purpose      : Read one byte from data port
*params       : none
*return       : the 8-bits byte which is read from data port
***********************************************************************************************/
int8_t Read_Byte(){
	uint8_t i=0;
	uint8_t temp=0x00;
	for(i=0;i<8;i++){
		Set(CLK);
		temp>>=1;
		if(Get(DIO)){
			temp|=0x80;
		}
		Reset(CLK);
	}
	return temp;
}

/***********************************************************************************************
*Function Name: Write_Cmd		
*Purpose      : Write a conmand to the data port
*params       : cmd  -------8-bits byte,the conmand,check the data sheet to find the conmand 
*return       : none
***********************************************************************************************/
void Write_Cmd(uint8_t cmd){
	Set(STB);
	Reset(STB);
	Write_Byte(cmd);
}

/***********************************************************************************************
*Function Name: Read_Key		
*Purpose      : Read the key number which has been pressed
*params       : none
*return       : the number of the key. 0-8.  "return 0" represents no key has been pressed.
***********************************************************************************************/
int8_t Read_Key(){
	uint8_t i=0;
	uint8_t key1=0x00;
	uint16_t key2=0x00;
	Write_Cmd(0x42);
	Set(DIO);                       //this is obligatory, check the data sheet,GPIO
	for(i=0;i<4;i++){
		key1=Read_Byte();
		key2|=(key1<<i);
	}
	key2>>=1;
	for(i=0;i<8;i++){
		if(0x01<<i==key2)return i+1;
	}
	return 0;
}

/***********************************************************************************************
*Function Name: Write_Dat		
*Purpose      : Write data to the location specified
*params       : addr  ------the address,0x00 to 0x0f
		dat   ------the data,segment code
*return       : none
***********************************************************************************************/
void Write_Dat(uint8_t addr,uint8_t dat){
	Write_Cmd(0x44);
	Write_Cmd(0xc0|addr);
	Write_Byte(dat);
}

/***********************************************************************************************
*Function Name: TM1638_SendData		
*Purpose      : Write data to the location specified
*params       : i     ------the bit code of digtal tube,0 to 7
		str   ------the string,the char which was not in tm_data will be replace with "''".
*return       : none
***********************************************************************************************/
void TM1638_SendData(uint8_t i,char * str){
	int j=0,k=0;
	unsigned char chr;
	for(;i<8;i++){
		k=0;
		for(j=0;j<14;j++){
			if(*str==tm_dat[0][j]){
				chr=tm_dat[1][j];
				k=1;
				break;
			}
		}
		
		if(k==0){
			chr=0x00;
		}
		
		if(*(str+1)=='.'){
			chr|=0x80;
			Write_Dat(i*2,chr);
			str++;
		}else{
			Write_Dat(i*2,chr);
		}
		str++;
		if(*str=='\0')break;
	}
}

/***********************************************************************************************
*Function Name: TM1638_Init		
*Purpose      : the initialization of tm1638
*params       : none
*return       : none
***********************************************************************************************/
void TM1638_Init(){
	int i=0;
	RCC_Config();
	GPIO_Config();
	Write_Cmd(0x8a);
	Write_Cmd(0x40);
	for(i=0;i<16;i++){
		Write_Byte(0x00);
	}
}

展开阅读全文

没有更多推荐了,返回首页