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

来源:互联网 发布:金字塔股票交易软件 编辑:程序博客网 时间:2024/06/06 10:49
/************************************************************************************************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 pinuint16_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,GPIOfor(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 0x0fdat   ------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 7str   ------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);}}

2 0
原创粉丝点击