/**********************************************************************************************
**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);
}
}
TM1638八位数码管八按键驱动程序(stm32f103驱动,使用了stm32 3.5库)
最新推荐文章于 2024-08-07 12:26:11 发布