1.环境介绍
硬件:正点原子战舰开发板,TM1638数码管模块、JLINK下载器
软件:Keil uVision5
2.TM1638模块简介
下图为TM1638模块的电路原理图,用的数码管为8段4位共阴极数码管。
虽然TM1638的规格书里面写的逻辑电源电压典型值为5V,见下图。没有写最小值和最大值,但是实际使用的使用,接3.3V也是可以使用的,只不过接5V电源时候亮度更高,同时高电平输入电压最小为0.7VDD,如果按照5V来算的话,0.7VDD=3.5V,但是实际使用过程中,发现哪怕是接5V,STM32单片机也是可以正常使用的。众所周知STM32的电源供电为2.0~3.6V,如果按照规格书来看的话,那么只要低于3.5V都不算高电平,但实际验证却发现不是这样的,使用的时候要注意即可。
3.线路连接
STM32 | TM1638模块 |
---|---|
5V/3.3V | VCC |
GND | GND |
PC7 | STB |
PC9 | CLK |
PC8 | DIO |
4.时序图分析
CLK为时钟输入,上升沿有效
DIO为数据输入输出,上升沿有效
STB为片选,低电平有效
5.指令解析
6.代码分析
下面为TM1638.h
和TM1638.c
和main.c
源代码
//TM1638.h
#ifndef _TM1638_H
#define _TM1638_H
#include "sys.h"
//TM1638模块引脚定义
#define STB PCout(7)
#define DIO PCout(8)
#define CLK PCout(9)
#define DIO_INT GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8);
#define DISP_OFF 0X00 //全灭
#define DISP_ON 0Xff //全亮
#define DISP_COMMAND 0x80 //小数点
#define ADDR_COMMAND 0XC0 //地址从0x00开始
#define DATA_COMMAND 0X40 //写数据到显示寄存器,地址自动增加,普通模式
void init_TM1638(void);//初始化
void Write_DATA(unsigned char add,unsigned char DATA); //指定地址写入数据
unsigned char Read_key(void);
void Write_allLED(unsigned char LED_flag);
#endif
//TM1638.c
#include "TM1638.h"
void TM1638_Write(unsigned char DATA) //写数据函数
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK=0;
if(DATA&0X01)
DIO=1;
else
DIO=0;
DATA>>=1;
CLK=1;
}
}
void Write_COM(unsigned char cmd) //发送命令字
{
STB=0;
TM1638_Write(cmd);
STB=1;
}
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
{
Write_COM(0x40);
STB=0;
TM1638_Write(0xc0|add);
TM1638_Write(DATA);
STB=1;
}
//TM1638初始化函数
void init_TM1638(void)
{
unsigned char i;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOC,GPIO_Pin_7); //PC.7 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOC,GPIO_Pin_8); //PC.8 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOC,GPIO_Pin_9); //PC.9 输出高
Write_COM(0x8b); //亮度 (0x88-0x8f)8级亮度可调
Write_COM(0x40); //写数据到显示寄存器,地址自动增加,普通模式
STB=0;
TM1638_Write(0xc0); //设置起始地址为0x00
for(i=0;i<16;i++) //传送16个字节的数据
TM1638_Write(0x00);
STB=1;
}
//main.h
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "TM1638.h"
//共阴数码管显示代码
unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0-f
unsigned char tab_del[]={0x00,0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//全灭,0-f
int main(void)
{
unsigned char i,j;
delay_init(); //初始化延时函数
init_TM1638(); //初始化TM1638
for(j=0;j<8;j++)
{
Write_DATA(0<<1,DISP_OFF);
Write_DATA(1<<1,tab[1]); //显示数字1
Write_DATA(2<<1,tab[2]); //显示数字2
Write_DATA(3<<1,tab[3]+DISP_COMMAND); //显示数字3+小数点
Write_DATA(4<<1,tab[4]); //显示数字4
Write_DATA(5<<1,tab[5]); //显示数字5
Write_DATA(6<<1,tab[6]); //显示数字6
Write_DATA(7<<1,tab[7]); //显示数字7
delay_ms(800);
}
}