基于STM32CUBE MX 的TM1640的使用例程

基于STM32CUBE MX 的TM1640的使用例程

TM1640是一种LED驱动控制专用电路 内部集成有MCU数字接口(SCLK与DIN)即时钟脉冲引脚与数据输入引脚、数据锁存器、LED驱动电路。因此在使用单片机控制LED点阵或数码管时能减小单片机的资源,本例程将带大家了解TM1640的使用方法即如何编写相关的驱动代码(基于STM32CUBE MX开发工具)。

在这里插入图片描述本例程使用两种延时方法,一种是基于SysTick也就是24位的系统节拍定时器,具有自动重载和溢出中断功能。另一种就是定时器设置TIMx_CNT的值,从而实现精确延时。(如果不认识TIMx_CNT可以问问度娘,有详细的解释,本文不作赘述。)这里需要占用一个定时器。
在这里插入图片描述GPIO使用PB8、PB9模式为推挽输出,这是使用GPIO默认上拉,这部分比较简单,基本点一下即可。

定时器延时与SysTick延时函数

void delay_us(uint16_t us)
{
	uint16_t differ=0xffff-us-5; 

	
	HAL_TIM_Base_Start(&htim1);
	__HAL_TIM_SetCounter(&htim1,differ); 
	while(differ < 0xffff-5) 
	{ 
		differ = __HAL_TIM_GetCounter(&htim1); 
	} 
	HAL_TIM_Base_Stop(&htim1);
 
}
void delay_ms(uint16_t nms)
{
 uint32_t temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do
 {
  temp=SysTick->CTRL;//读取当前倒计数值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}`

TM1640.c文件

#include "TM1640.h"
#include "main.h"

#define TM1640_SCK_HIGHT  	  HAL_GPIO_WritePin(GPIOB, SCK_Pin, GPIO_PIN_SET)
#define TM1640_SCK_LOW  	    HAL_GPIO_WritePin(GPIOB, SCK_Pin, GPIO_PIN_RESET)
#define TM1640_DOUT_HIGHT		  HAL_GPIO_WritePin(GPIOB, DOUT_Pin, GPIO_PIN_SET)
#define TM1640_DOUT_LOW     	HAL_GPIO_WritePin(GPIOB, DOUT_Pin, GPIO_PIN_RESET)

void TM1640_Start(void)
{
	TM1640_SCK_HIGHT;
  TM1640_DOUT_HIGHT;
	delay_us(10);
	TM1640_DOUT_LOW;
	delay_us(10);
	TM1640_SCK_LOW;
	delay_us(10);
}

void TM1640_Stop(void)
{
  TM1640_DOUT_LOW;
	TM1640_SCK_HIGHT;
	delay_us(10);
	TM1640_DOUT_HIGHT;
	delay_us(10);
}

void TM1640_Write_Byte(uint8_t date)
{
	uint8_t i;
	uint8_t Temp;
	Temp=date;
	TM1640_SCK_LOW;
  TM1640_DOUT_LOW;
	for(i=0;i<8;i++)
	{
		TM1640_SCK_LOW;
		delay_us(2);
		if(Temp&0x01)
		{	
			TM1640_DOUT_HIGHT;
			delay_us(10);
		}
		else
		{
			TM1640_DOUT_LOW;
			delay_us(10);
		}
		TM1640_SCK_HIGHT;
		delay_us(1);
		Temp = Temp >> 1;
	}
	TM1640_SCK_LOW;
  TM1640_DOUT_LOW;
}

void Write_Com(uint8_t date)//发送命令字
{
	TM1640_Start();
	TM1640_Write_Byte(date);
	TM1640_Stop();
}

void Write_DATA(unsigned char add,unsigned char DATA)		//指定地址写入数据
{
	Write_Com(0x44);
	TM1640_Start();
	TM1640_Write_Byte(0xc0|add);
	TM1640_Write_Byte(DATA);
	TM1640_Stop();
}

void cls_TM1640(void)//清屏函数
{
	unsigned char i;	
	Write_Com(0x40);//连续地址模式
	TM1640_Start();
	TM1640_Write_Byte(0xc0);
	for(i=0;i<16;i++)
		TM1640_Write_Byte(0x00);
	TM1640_Stop();
}

void init_TM1640(void)
{
	cls_TM1640();
	Write_Com(0x8f);//亮度
}

TM1640.h

#ifndef __TM1640_H
#define __TM1640_H
#include "gpio.h"

void TM1640_Init(void);
void TM1640_Start(void);
void TM1640_Stop(void);
void TM1640_Write_Byte(uint8_t date);
void Write_Com(uint8_t date);//发送命令字
void Write_DATA(unsigned char add,unsigned char DATA);		//指定地址写入数据
void cls_TM1640(void);
void init_TM1640(void);
#endif

TM1640.c文件中主要对器件的数据手写去编写时序,其中包括起始信号、停止信号、以及指令地址、命令字、清屏函数等。
运行的流程:首先设置器件地址,其中器件地址有四种模式,最主要的是第一种(0x40)是地址自动加一和第二种(0x44)是固定地址模式,第三种和第四种我们没有使用。
在这里插入图片描述
我们的代码中设置的器件地址模式在void Write_Com(uint8_t date)发送命令字中设置为指定地址写入数据。在void cls_TM1640(void)清屏函数中使用了地址连续模式。
在这里插入图片描述
对每个LED的亮度一共有8种亮度设置,本程序将亮度设置为最高。
在这里插入图片描述
接着就到了我们对期间的地址进行设置和发送相应的数据去控制GRID1-GRID16。

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	unsigned char i,j;
  /* USER CODE END 2 */
	init_TM1640();
	for(i=0;i<8;i++)Write_DATA(i,tab0[i]);//红色
	for(i=0;i<8;i++)Write_DATA(i+8,~tab0[i]);//绿色
	colour^=0x08;
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
  }
  /* USER CODE END 3 */
}

由于TM1640中自带了数据锁存器、LED 驱动,减小了MCU的负担,MCU只需与TM1640通信一次,即可保留显示画面,不需要耗费MCU的资源。
本人使用的测试模块为某宝上的TM1640,由于点阵的扫描特性,就不上传运行图片。本文文字转载、图片收集自网络,如有侵权,请及时告知我们,我们将在最短的时间内删除。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页