tm1638.h
#ifndef _TM1638_H
#define _TM1638_H
#include "stm32f10x.h"
#define DATA_COMMAND 0X40 //0100 0000 ?????ü??????
#define DISP_COMMAND 0x80 //1000 0000 ?????ü??????
#define ADDR_COMMAND 0XC0 //1100 0000 ???·?ü??????
#define STB1 GPIO_SetBits(GPIOF,GPIO_Pin_0)
#define STB0 GPIO_ResetBits(GPIOF,GPIO_Pin_0)
#define CLK1 GPIO_SetBits(GPIOF,GPIO_Pin_1)
#define CLK0 GPIO_ResetBits(GPIOF,GPIO_Pin_1)
#define DIO1 GPIO_SetBits(GPIOF,GPIO_Pin_2)
#define DIO0 GPIO_ResetBits(GPIOF,GPIO_Pin_2)
#define DIO2 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_2)==SET
void TM1638_Write(unsigned char DATA); //??????????
unsigned char TM1638_Read(void); //??????????
void Write_COM(unsigned char cmd); //·????ü??×?
unsigned char Read_key(void); //????°??ü????????
void Write_DATA(unsigned char add,unsigned char DATA);//???¨???·???????? addr?????????????? DATA????????????
void Write_DATA(unsigned char add,unsigned char DATA);//???¨???·???????? addr?????????????? DATA????????????
void Write_allLED(unsigned char LED_flag);//????????LED??????LED_flag±í???÷??LED×???
void Write_oneLED(unsigned char num,unsigned char flag);
void TM1638_Init(void); //TM1638??????????
void GPIO1_Init(void);
#endif
tm1638.c
#include "tm1638.h"
#include "stm32f10x.h"
void GPIO1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//?ò??PB???±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
//PB5,PE5?????è??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
//????????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//?????????????????????ì????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//????????????????
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
void TM1638_Write(unsigned char DATA) //??????????
{
unsigned char i=0;
for(i=0;i<8;i++)
{
CLK0;
if(DATA&0X01) //??DATA????8???ò×ó??????,??×???????1??????????
DIO1;
else
DIO0;
DATA>>=1;
CLK1;
}
}
unsigned char TM1638_Read(void)
{
unsigned char i=0;
unsigned char temp=0x00;
for(i=0;i<8;i++)
{
CLK1;
temp>>=1;
if(DIO2)
{
temp|=0x80;
}
CLK0;
}
return temp;
}
void Write_COM(unsigned char cmd) //·????ü??×?
{
STB0;
TM1638_Write(cmd);
STB1;
}
unsigned char Read_key(void) //????°??ü????????
{
unsigned char c[4],i,key_value=0;
STB0; //????
TM1638_Write(0x42); //???ü?¨?????ü??
for(i=0;i<4;i++)
c =TM1638_Read(); //????????×?????????4??
STB1; //????????
for(i=0;i<4;i++)
key_value|=c<<i; //4??×???????????????×???
for(i=0;i<8;i++)
if((0x01<<i)==key_value) //KEY_VALUE????I????1
break;
return i; //·???I????????????°??ü°???
}
void Write_DATA(unsigned char add,unsigned char DATA)//???¨???·???????? addr?????????????? DATA????????????
{
Write_COM(0x44); //?????ü??0100 0100 ???·?????????????¨???·
TM1638_Write(0xc0|add); //???·??1100 0000???????ò???? ????
TM1638_Write(DATA); //????DATA
STB1; //??±?????
}
void Write_oneLED(unsigned char num,unsigned char flag) //????????????LED??????num???è????????led?ò????flag??0?±?¨????????0?±????
{
if(flag)
Write_DATA(2*num+1,1);
else
Write_DATA(2*num+1,0);
}
void Write_allLED(unsigned char LED_flag)//????????LED??????LED_flag±í???÷??LED×???
{
unsigned char i;
for(i=0;i<8;i++)
{
if(LED_flag&(1<<i))
//Write_DATA(2*i+1,3);
Write_DATA(2*i+1,1); //2*i+1?????· 1????????????
else
Write_DATA(2*i+1,0);
}
}
void TM1638_Init(void) //TM1638??????????
{
unsigned char i;
Write_COM(0x8b); //???? (0x88-0x8f)8?????????÷
Write_COM(0x40); //???????·×?????1
STB0; //????????
TM1638_Write(0xc0); //?è?????????·
for(i=0;i<16;i++) //????16??×?????????
TM1638_Write(0x00);
STB1; //????????
}
main.c
#include <stdio.h>
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "beep.h"
#include "usart.h"
#include "adc.h"
#include "lcd.h"
#include "tm1638.h"
int main(void)
{
u8 t;
LED_Init();//LED??????
KEY_Init();//°??ü??????
SysTick_Init();//???±??????
USART1_Int(9600);
LCD_Init();
GPIO1_Init();
POINT_COLOR=RED;
STB1;
DIO1;
CLK1;
while(1)
{
t=Read_key();
LCD_ShowString(30,150,200,16,16,"abcdefgABCDEFG");
LCD_ShowxNum(90,220,t,2,16,0);
Write_oneLED(5,1);
STB1;
DIO1;
CLK1;
}
}
哪位大侠有tm1638 的32驱动程序分享下也行
|