STM32F103ZET6【标准库函数开发】-----TM1638模块驱动4位8段共阴极数码管

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.hTM1638.cmain.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);		
	}
} 

猜你喜欢

转载自blog.csdn.net/wsq_666/article/details/114224342