STM32F103ZET6 [desarrollo de funciones de biblioteca estándar] ----- El módulo TM1638 controla un tubo digital de cátodo común de 8 segmentos y 4 bits

1. Introducción al entorno
Hardware: Placa de desarrollo de acorazado atómico de puntualidad, módulo de tubo digital TM1638, software de descarga JLINK
: Keil uVision5

2. Breve introducción
del módulo TM1638 La siguiente figura es el diagrama esquemático del circuito del módulo TM1638. El tubo digital utilizado es un tubo digital de cátodo común de 8 segmentos y 4 dígitos.

Aunque el valor típico del voltaje de la fuente de alimentación lógica escrito en la especificación TM1638 es de 5 V, consulte la figura siguiente. Los valores mínimo y máximo no están escritos, pero para uso real, se puede usar cuando se conecta a 3.3V, pero el brillo es mayor cuando se conecta a una fuente de alimentación de 5V, y el voltaje de entrada mínimo de alto nivel es 0.7VDD. Si se calcula de acuerdo con 5V, 0.7VDD = 3.5V, pero en el uso real, se encuentra que incluso si está conectado a 5V, el microcontrolador STM32 se puede usar normalmente. Es bien sabido que la fuente de alimentación de STM32 es de 2.0 ~ 3.6V. Si lo mira de acuerdo con la especificación, no se considerará alto siempre que sea inferior a 3.5V. Sin embargo, la verificación real ha encontrado que este no es el caso, preste atención cuando lo utilice.

3. Conexión de línea

STM32 Módulo TM1638
5 V / 3,3 V VCC
GND GND
PC7 STB
PC9 CLK
PC8 DIO

4. Análisis del diagrama de tiempos

CLK es entrada de reloj,
DIO es entrada y salida de datos cuando el borde ascendente es válido,
STB es la selección de chip cuando el borde ascendente es válido y el nivel bajo es válido

5. Análisis de instrucciones

6. Análisis de código
Lo siguiente es la TM1638.hsuma TM1638.cy el main.ccódigo fuente.

//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);		
	}
} 

Supongo que te gusta

Origin blog.csdn.net/wsq_666/article/details/114224342
Recomendado
Clasificación