基于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,由于点阵的扫描特性,就不上传运行图片。

基于STM32CUBE MX 的TM1640的使用例程相关推荐

  1. 基于i.MX RT1060的可编程视觉模块

    模块简介****None ^i.MX RT1060可编程视觉模块^ 基于i.MX RT的可编程视觉模块有以下特点: (1)主控芯片使用NXP i.MX RT1062,600MHz Cortex-M7, ...

  2. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具

    使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32 前言 博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流 本文旨在使用STM32Cube MX快 ...

  3. STM32Cube MX“No section matches selector - no section to be FIRST/LAST”错误解决方案

    最近在升级STM32Cube MX的时候遇到了下面的问题,生成的代码在编译的时候出现了如下错误: 我查阅了各种资料,最终误打误撞把这个问题解决了. 解决方法如下: 新建一个 New Group 然后给 ...

  4. 基于i.MX RT电磁智能车AI算法的一些讨论

      该文发布后得到了热烈的反响,也有学生提出了一些问题,典型的是适应性问题,如下:   也另外有专家针对这些问题提出了自己的看法:   在此,我想分享一下我们在进行相应的测试和实验过程中,所遇到的问题 ...

  5. STM32Cube MX USB双设备MSC+CDC 实现虚拟U盘+虚拟串口

    前言 在上一篇文章实现USB虚拟U盘之后,项目需要用同一个USB口同时实现MSC和CDC功能,既能进行串口通信又能读取片外FLASH虚拟U盘.对于USB通用串行总线如果要真正搞明白这个协议还是比较困难 ...

  6. 基于STC15系列单片机的串口中断例程

    #include <STC15F2K60S2.H>#define FOSC 12000000 //晶振频率 #define BAUD 9600 //设置波特率unsigned char r ...

  7. STM32Cube MX USB虚拟U盘+FATFS+W25Q128

    第一次写CSDN,把这两天做的一个小实验记个笔记.写的不好请见谅,有错误欢迎指正,欢迎讨论.在做之前也参考其他博主的一些文章Carry_王的博客 USB基本概念不做介绍,不懂的可以先去了解,主要说明实 ...

  8. 基于stm32f107 stm32cube 和 LWIP 协议实现 udp 组播通信

    最近在做一个基于stm32f107 实现 UDP 组播通信的项目,项目基于 stm32cube 配置生成,如下图: UDP组播头文件: #ifndef __MULTICAST_H__ #define ...

  9. at89c52串口通信c语言程序,AT89C52DEMO 基于51单片机的(89C51/52)C语言源码例程 - 下载 - 搜珍网...

    例程与源码/12864带字库测试程序/12864 例程与源码/12864带字库测试程序/12864.hex 例程与源码/12864带字库测试程序/12864.lnp 例程与源码/12864带字库测试程 ...

  10. 基于机智云的嵌入式系统应用开发—空调远程智能控制系统

    摘要: 文章主要介绍了一种基于机智云iot开发平台的空调远程控制模块的应用开发,模块功能是通过智能手机的用户界面远程控制空调的工作,包括工作条件的设置和温度环境监测,开发内容包含了硬件和软件两部分,硬 ...

最新文章

  1. python 在excel指定列添加数据_python读取excel指定列数据并写入到新的excel方法
  2. 查看tomcat启动文件都干点啥---server对象
  3. java 蓝桥杯算法训练 每月的天数(题解)
  4. cocos2dx 实现简单的文件上传到php服务器的demo
  5. CRM Online Outlook Client Configuration Wizard
  6. php 设置空数组,声明空数组,填充和迭代问题-php
  7. zabbix创建自定义监控项
  8. Qt 中利用 GNU barcode 生成一维条形码
  9. Android 抓包工具
  10. matlab 暂态稳定性,基于MATLAB的电力系统暂态稳定性仿真
  11. Win系统 - 局域网内电脑文件共享
  12. Vue 登录验证之滑动拼图验证码
  13. MYSQL默认隔离级别详解
  14. ideal在编译的时候报程序包不存在错误
  15. Emlog模板fee2.0主题商业版
  16. 如何在命令行中显示五彩斑斓的“黑”
  17. AB(罗克韦尔)PLC如何通过程序直接与外插SD卡进行数据读写?
  18. 帆船驾驶技术的物理学原理
  19. DuiLib : 做一个没有任务栏图标的Dialog
  20. 30天自制操作系统 导读

热门文章

  1. 福布斯发布区块链50强 这5家中国公司上榜
  2. SmartSVN使用
  3. Phodal 的 2018 节点:Think Big Be Long
  4. Vue中点击url下载文件-案例
  5. 宝塔linux怎么运行war,宝塔Linux面板在线解压WAR压缩文件
  6. 营业收费系统 建立报表库服务器,浅谈计算机在自来水收费系统的重要应用
  7. python实现电脑自动开机_python自动循环定时开关机(非重启)测试
  8. 使用Python Chord包画出好看的弦图
  9. 爱普生epson lq-630k打印机没有反应,发送成功,就是不打印
  10. 记录为小电机安装一个5012编码器(多摩川协议)的过程