|
- /**********************************************************************************************
- **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);
- }
- }
|
|