?
?
#include "TM1638.h"
//************************************************************
#define DISP_CMD0 0x00 //4位13段
#define DISP_CMD1 0x01 //5位12段
#define DISP_CMD2 0x02 //6位11段
#define DISP_CMD3 0x03 //7位10段
//执行DISP_CMDx会把显示亮度关掉,但显示内容不变
//************************************************************
//************************************************************
#define cmdwr1 0x40 //地址自动加一
#define cmdwr2 0x44 //固定地址
#define cmdwr3 0x40 //mcu写给TM1638
#define cmdwr4 0x42 //mcu读按键值(TM1638)至少延时1us
//************************************************************
#define DISP_OFF 0X80 //关
#define DISP_LV0 0X88 //最暗0x88--0x8F
#define DISP_COMMAND 0x80 //小数点
#define ADDR_COMMAND 0XC0 //地址从0x00开始
//*************************************************************
//共阴数码管显示代码
u8 code_tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void TM1638_Write(unsigned char DATA){//写数据函数(没有STB—ENABLE)
u8 ji;
for(ji=0;ji<8;ji++)
{
CLK=0;
if(DATA&0X01) DIO=1;
else DIO=0;
DATA=DATA>>1;
CLK=1;
}
}
/*u8 TM1638_Read(void){ //读单个数据DIO要设为输入
u8 ir,Datar=0x00;
DIN=1;
for(ir=0;ir<8;ir++)
{
Datar>>=1;
CLK=0;
if(DIN)
Datar|=0x80;
CLK=1;
}
return Datar;
}*/
void Write_COM(unsigned char cmd){ //发送命令字
STB=0;
TM1638_Write(cmd);
STB=1;
}
/*u8 TM1638_ReadKey(void) //读按键值DIO要设为输入
{
u8 ki; u8 keybuff[4]; u8 keyvalue=0;
STB=0;
TM1638_Write(0x42); //读数据命令
delay_us(5); ///不同mcu不同的延时?????****
for(ki=0;ki<4;ki++)
{
keybuff[ki]=TM1638_Read();
}
STB=1;
// 8键 col:K3 row:KS1~KS8
if((keybuff[0]&0x01)==0x01) keyvalue=1;
if((keybuff[0]&0x10)==0x10) keyvalue=2;
if((keybuff[1]&0x01)==0x01) keyvalue=3;
if((keybuff[1]&0x10)==0x10) keyvalue=4;
if((keybuff[2]&0x01)==0x01) keyvalue=5;
if((keybuff[2]&0x10)==0x10) keyvalue=6;
if((keybuff[3]&0x01)==0x01) keyvalue=7;
if((keybuff[3]&0x10)==0x10) keyvalue=8;
return keyvalue;
}*/
void Write_DATA(u8 add,u8 DATA){ //指定地址写入数据
Write_COM(0x44);//固定地址
STB=0;
TM1638_Write(0xc0|add);
TM1638_Write(DATA);
STB=1;
}
void init_TM1638(void){ //三个输出端口初始化
u8 i;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟
GPIO_InitStructure.GPIO_Pin = TM1638_DIO | TM1638_CLK| TM1638_STB; //定义IO接口; //选择端口号(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);
GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO); //三个输出置高输出高
GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);
GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);
Write_COM(0X40);
Write_COM(0x8f); //亮度 (0x88-0x8f)8级亮度可调
STB=0; //
TM1638_Write(0xc0); //设置起始地址
for(i=0;i<16;i++) //传送16个字节的数据
TM1638_Write(0x00);
STB=1;
}
void init_TM1638Read(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟
GPIO_InitStructure.GPIO_Pin = TM1638_CLK| TM1638_STB; 选择端口号(0~15或all)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);
}
/*void initTM1638DIN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); //A,B,C,时钟
GPIO_InitStructure.GPIO_Pin = TM1638_DIN; 选择端口号(0~15或all)
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //选择IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(TM1638_GPIOPORT, &GPIO_InitStructure);
GPIO_SetBits(TM1638_GPIOPORT,TM1638_DIO); //三个输出置高输出高
GPIO_SetBits(TM1638_GPIOPORT,TM1638_CLK);
GPIO_SetBits(TM1638_GPIOPORT,TM1638_STB);
}*/
void TM1638_display_Fix(unsigned char add,unsigned char DATA){//固定地址传送
const u8 buff[22]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//数字0~9及0~9加点显示段码表
//--------------- 0 1 2 3 4 5 6 7 8 9 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 无
Write_COM(0X44);
STB=0;
TM1638_Write(0xC0+2*add);
delay_us(1);
TM1638_Write(buff[DATA]);
STB=1;
}
//***********************************************
void TM1638_OneLED(u8 num,u8 flag) //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
{
Write_COM(0x44);
if(!flag)
Write_DATA(2*num+1,1);
else
Write_DATA(2*num+1,0);
}
void TM1638_AllLED(u8 LED_flag) //控制全部LED函数,LED_flag表示各个LED状态
{
u8 i;
Write_COM(0x44);
for(i=0;i<8;i++)
{
if(LED_flag&(1<<i))
Write_DATA(2*i+1,1);
else
Write_DATA(2*i+1,0);
}
}
/*
选择IO接口工作方式:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_AF_PP 复用推挽输出
GPIO_Mode_AF_OD 复用开漏输出
*/
#ifndef __TM1638_H
#define __TM1638_H
#include "sys.h"
#include "delay.h"
#define TM1638_GPIOPORT GPIOA //定义IO接口
#define TM1638_STB GPIO_Pin_5 //定义IO接口
#define TM1638_DIO GPIO_Pin_12 //定义IO接口
#define TM1638_CLK GPIO_Pin_11 //定义IO接口
#define STB PAout(5) //定义输出
#define DIO PAout(12) //
#define CLK PAout(11) //
//*******************************
#define DIN PAin(4)
#define TM1638_DIN GPIO_Pin_4//定义输入管脚
//**************************************************************
void TM1638_Write(unsigned char DATA);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/* void initTM1638DIN(void);
u8 TM1638_Read(void);
u8 TM1638_ReadKey(void); //读按键值*/
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void init_TM1638(void);
void Write_DATA(u8 add,u8 DATA);//指定地址写入数据
void Write_COM(unsigned char cmd);//写命令
void TM1638_display_Fix(unsigned char add,unsigned char DATA);//固定地址传送
void TM1638_OneLED(u8 num,u8 flag); //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
void TM1638_AllLED(u8 LED_flag); //控制全部LED函数,LED_flag表示各个LED状态
#endif
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "TM1638.h"
//#include "led.h"
int main (void){//主程序
RCC_Configuration(); //时钟设置
init_TM1638();//亮度0x8b,7位10段//固定地址模式
while(1){
TM1638_display_Fix( 0,1);//固定地址传
TM1638_display_Fix( 1,1);
TM1638_display_Fix( 2,2);
TM1638_display_Fix( 3,3);
TM1638_display_Fix( 4,20);
TM1638_display_Fix( 5,15);
TM1638_display_Fix( 6,16);
TM1638_display_Fix( 7,17);
// TM1638_OneLED(1,1); //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
// TM1638_OneLED(2,0); //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
// TM1638_OneLED(3,1);
// TM1638_OneLED(4,0);
// TM1638_OneLED(5,1); //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
// TM1638_OneLED(6,0); //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
// TM1638_OneLED(7,1);
// TM1638_OneLED(8,0);
TM1638_AllLED(0xAA); //控制全部LED函数,LED_flag表示各个LED状态
}
}
【变量定义】
u32 a; //定义32位无符号变量a
u16 a; //定义16位无符号变量a
u8 a; //定义8位无符号变量a
vu32 a; //定义易变的32位无符号变量a
vu16 a; //定义易变的 16位无符号变量a
vu8 a; //定义易变的 8位无符号变量a
uc32 a; //定义只读的32位无符号变量a
uc16 a; //定义只读 的16位无符号变量a
uc8 a; //定义只读 的8位无符号变量a
#define ONE 1 //宏定义
delay_us(1); //延时1微秒
delay_ms(1); //延时1毫秒
delay_s(1); //延时1秒
*/
|