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

/**********************************************************************************************
**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<>=1;
	for(i=0;i<8;i++){
		if(0x01<

你可能感兴趣的:(驱动原创,stm32原创)