找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4984|回复: 2
收起左侧

基于STM32F103zet6的TM1638驱动

[复制链接]
ID:223425 发表于 2017-7-30 19:33 | 显示全部楼层 |阅读模式
  • /**********************************************************************************************
  • **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);  
  •     }  
  • }  

回复

使用道具 举报

ID:199141 发表于 2017-10-12 09:51 | 显示全部楼层
调用格式 请告知最好写个测试程序。感谢你
回复

使用道具 举报

ID:344623 发表于 2019-8-4 09:59 | 显示全部楼层
多谢分享,我下载来试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表