【洋桃一号板】STM32F103CBT6标准库函数驱动TM1640点亮数码管

news2024/9/30 23:35:48

一、今天介绍如何使用STM32F103CBT6驱动TM1640点亮数码管,硬件用的洋桃开发板,点亮后效果如下,六个数码管依次显示0.1.2.3.4.5.6.7
在这里插入图片描述
硬件原理图如下,只用到了单片机的两个IO口即可实现上图的效果,该开发板上用的是PA11和PA12两个IO口,用来模拟IIC通信,其中PA11接SCLK,PA12接DIN。另外可以看到TM1640的VDD接的是5V,规格书里面也是说需要接5V电压,但实际我试过了,接3.3V也是可以驱动的。在这里插入图片描述

二、TM1640介绍
TM1640通信方式其实就是常用的的IIC通信,这点可以在规格书里面看到相关介绍
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、写程序
1、先将重要的一些参数进行宏定义
a.固定地址模式上面分析过了,是0x44,后面进行配置会用到
b.设置亮度,上面也分析过了
c.通过上面的数据通信的过程我们知道需要用到SCLK和DIN两个信号,我们在硬件上接的是PA11和PA12两个脚,所以用TM1640_DIN_HTM1640_DIN_HTM1640_SCLK_LTM1640_SCLK_H来表示DIN和SCLK为高低电平。

#include "TM1640.h"
#include "delay.h"
#define DEL  1   //宏定义 通信速率(默认为1,如不能通信可加大数值)
//地址模式的设置
//#define TM1640MEDO_ADD  0x40   //宏定义	自动加一模式
#define TM1640MEDO_ADD  0x44   //宏定义 固定地址模式(推荐)

//显示亮度的设置
//#define TM1640MEDO_DISPLAY  0x88   //宏定义 亮度  最小
//#define TM1640MEDO_DISPLAY  0x89   //宏定义 亮度
//#define TM1640MEDO_DISPLAY  0x8a   //宏定义 亮度
//#define TM1640MEDO_DISPLAY  0x8b   //宏定义 亮度
#define TM1640MEDO_DISPLAY  0x8c   //宏定义 亮度(推荐)
//#define TM1640MEDO_DISPLAY  0x8d   //宏定义 亮度
//#define TM1640MEDO_DISPLAY  0x8f   //宏定义 亮度 最大
#define TM1640MEDO_DISPLAY_OFF  0x80   //宏定义 亮度 关

#define TM1640_DIN_H    GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1))
#define TM1640_DIN_L    GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0))

#define TM1640_SCLK_H 	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1))
#define TM1640_SCLK_L 	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0))

2、通信的开启和结束代码
在这里插入图片描述

void TM1640_start()
{ 
	//通信时序 启始
	TM1640_DIN_H; //DIN输出高电平1	
	TM1640_SCLK_H; //SCLK输出高电平1	
	delay_us(DEL);//延时一段时间
	TM1640_DIN_L; //DIN输出低电平0	
	delay_us(DEL);//延时一段时间
	TM1640_SCLK_L; //SCLK输出低电平0	
	delay_us(DEL);//延时一端时间
}
void TM1640_stop()
{ //通信时序 结束
	TM1640_DIN_L; //DIN输出低电平0	
	TM1640_SCLK_L; //SCLK输出低电平0	
	delay_us(DEL);//延时一段时间
	TM1640_SCLK_H; //SCLK输出高电平1	
	delay_us(DEL);
	TM1640_DIN_H; //DIN输出高电平1	
	delay_us(DEL);
}

3、底层函数,信号传输,写8位数据

void TM1640_write(u8 date)
	{	//写数据(低层)
		u8 i;
		u8 aa;
		aa=date;
		TM1640_DIN_L; //DIN输出0	
		TM1640_SCLK_L; //SCLK输出0	
		for(i=0;i<8;i++)
		{
			TM1640_SCLK_L; //SCLK输出0		
			delay_us(DEL);

			if(aa&0x01)
			{
				TM1640_DIN_H; //DIN输出1
				delay_us(DEL);
			}
			else
			{
				TM1640_DIN_L; //DIN输出0
				delay_us(DEL);
			}
				TM1640_SCLK_H; //SCLK输出1
				delay_us(DEL);
				aa=aa>>1;//右移一位
		 }
			TM1640_DIN_L; //DIN输出0
			TM1640_SCLK_L; //SCLK输出0
	}

安装上面的代码传输二进制10110001的时序图如下,左边为高位,右边为低位。所以实际是从低位开始传输数据。
在这里插入图片描述
4、TM1640驱动函数
a、GPIO初始化、配置固定地址,设置亮度

void TM1640_Init(void)
	{ //TM1640接口初始化
		GPIO_InitTypeDef  GPIO_InitStructure; 	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);       
		GPIO_InitStructure.GPIO_Pin = TM1640_DIN | TM1640_SCLK; //选择端口号(0~15或all)                        
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
		GPIO_Init(TM1640_GPIOPORT, &GPIO_InitStructure);

		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1	
		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1	
		
		TM1640_start();
		TM1640_write(TM1640MEDO_ADD); //设置数据,0x40,0x44分别对应地址自动加一和固定地址模式
		TM1640_stop();
		TM1640_start();
		TM1640_write(TM1640MEDO_DISPLAY); //设置亮度
			//控制显示,开显示,0x88,  0x89,  0x8a,  0x8b,  0x8c,  0x8d,  0x8e,  0x8f分别对应脉冲宽度为:
			//------------------1/16,  2/16,  4/16,  10/16, 11/16, 12/16, 13/16, 14/16	 //0x80关显示
		TM1640_stop();					
}

b、TM1638显示函数
在这里插入图片描述

void TM1640_display(u8 address,u8 date)
	{ //固定地址模式的显示输出
 	const u8 buff[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};//数字0~9及0~9加点显示段码表
    //---------------   0    1    2    3    4    5    6    7    8    9    0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   无   
   TM1640_start();
   TM1640_write(0xC0+address);//传显示数据对应的地址
   TM1640_write(buff[date]);//传1BYTE显示数据
   TM1640_stop();
}

5、主函数
有了上面的铺垫,主函数就很简单了,只需要初始化TM1640,然后调用显示函数即可

int main ()
{
	TM1640_Init(); //TM1640初始化
	while(1)
		{
			TM1640_display(0,0);	
			TM1640_display(1,1);
			TM1640_display(2,2); 
			TM1640_display(3,3);
			TM1640_display(4,4);	
			TM1640_display(5,5);
			TM1640_display(6,6);
			TM1640_display(7,7);
		}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chapter-3 -数据库数据模型

以下内容来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 概述 关系及关系模式 笛卡尔积 定义在一组域上的有序对的集合&#xff0c; 域是一组具有相同类型的集合&#xff0c;比如自然数&#xff0c;长度小于n的字符串结合等【比如int age】 从n个域的每…

Linux工具make与makefile

Linux项目自动化构建工具-make/Makefile 目录Linux项目自动化构建工具-make/Makefile引言1、make && makefile2、make执行步骤2.1 依赖关系2.2 依赖方法3、项目清理4、伪目标 .PHONY5、文件的三个时间6、make的工作原理7、Linux下的第一个小程序认识缓冲区进度条①函数…

T5模型简单介绍

目录 一、概要 二、深入扩展 2.1 两个要素 2.2 预训练方法 一、概要 谷歌公司的研究人员提出的 T5&#xff08;Text-to-Text Transfer Transformer&#xff0c;有5个T开头的单词&#xff0c;所以叫做T5&#xff09;模型采用了一种与前述模型截然不同的策略&#xff1a;将不…

RUAS论文阅读笔记

这是CVPR2021的一篇暗光增强的论文 Retinex增强和去噪部分 第一部分的核心公式是一种retinex公式&#xff08;用于暗图增强的retinex公式有几种类型&#xff0c;虽然本质一样但是对于各个分量的定义不一样&#xff09;&#xff1a;yx⊗tyx\otimes tyx⊗t&#xff0c;其中x是正…

Trie|并查集|堆|

目录 初始化 插入 查询 合并集合 连通块中点的数量 堆排序 模拟堆 Trie树是用来快速存储和查找字符串集合的数据结构 #include<iostream> using namespace std; const int N 100010; int son[N][26];//本题为小写因为字母&#xff0c;每个节点最多有26个子节点…

JUC编程之——synchronized的底层实现与分析

1 synchronized关键字 synchronized 是 Java 中的关键字&#xff0c;是一种同步锁(也是一种悲观锁)。它修饰的对象有以下几种&#xff1a; 作用于实例方法&#xff0c;当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁——对象锁&#xff1b;作用于代码块&#xff…

水文水利数据对接详解

数据对接 水雨情监测及视频监控系统需要与什么平台进行对接&#xff1f; 答&#xff1a;水雨情监测及视频监控系统由省统一接收的方式&#xff0c;数据接收中心设在***水利云。 2.水雨情数据接收中心有哪些组成部分&#xff1f; 答&#xff1a;水雨情数据接收中心主要由硬件…

pdf如何压缩变小,pdf压缩教程四招快速学

PDF是我们日常工作中经常使用的文件格式之一。这种文件格式方便易用&#xff0c;能够确保文件在传输和接收过程中不会出现错版等问题。为了方便发送&#xff0c;我们通常会将编辑好的内容转换为PDF格式。但是有时候文件过大&#xff0c;无法通过传输渠道发送怎么办&#xff1f;…

字节5年测试工程师对“测试开发”的理解

写在前面&#xff1a; 写这篇文章的目的是为了能够更好的帮助刚入职的新人了解这个岗位和自己的工作&#xff0c;也想谈谈自己工作一年来对这个领域的了解程度&#xff0c;做一个小小总结吧&#xff5e; 一、我理解的测试开发 测试开发与开发、测试的关系 以前在没有接触测试…

樱花树盛开的季节,我用简单的C代码绘制了一棵樱花树向她表白~『C/C++图形库EasyX』

文章目录&#x1f490;专栏导读&#x1f490;文章导读绘制一根线条绘制一个简易的树干优化树干&#xff0c;使其更加细致绘制樱花树增加随机树形与渐变色效果如何设置随机数进阶——通过鼠标点击来控制生成樱花树进阶——生成樱花树并展示生长过程&#x1f490;专栏导读 &#…

通过阿里云函数计算解决ChatGPT API的调用问题

ChatGPT系列文章 与其被ChatGPT取代&#xff0c;不如征服ChatGPT&#xff0c;做它的主人&#xff01; 文章目录ChatGPT系列文章前言命令行部署准备工作两行命令实现部署应用中心部署使用代理访问API总结前言 自2022年11月30日 OpenAI 发布 ChatGPT 以来&#xff0c;虽然时有唱…

最新版本VSCode配置Python、PyQt5、QtDesigner环境并创建一个ui界面测试

参考链接&#xff1a;最新版本VSCode配置Python、PyQt5、QtDesigner环境并创建一个ui界面测试 一、安装Python3 PyQt5所支持的python版本是从3.5开始的&#xff0c;因此安装的Python3版本必须大于3.5。 我安装的位置是C:\Python\Python38。 参见真小白入门Pyhton的安装 二、安…

图-文多模态,大模型,预训练

参考老师的无敌课程 多模态任务是指需要同时处理两种或多种不同类型的数据&#xff08;如图像、文本、音频等&#xff09;的任务。例如&#xff0c;图像描述&#xff08;image captioning&#xff09;就是一种典型的多模态任务&#xff0c;它需要根据给定的图像生成相应的文本描…

XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层,消除电子噪声干扰

​ XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层&#xff0c;消除电子噪声干扰 dcs合理、可靠的系统接地&#xff0c;是dcs系统非常重要的内容。为了保证dcs系统的监测控制精度和安全、可靠运行&#xff0c;必须对系统接地方式、接地要求、信号屏蔽、接地线截面选择、接…

【C++学习】map和set的封装

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; map和set的封装&#x1f349;map和set中的红黑树&#x1f34c;set中的键值和map中的键值&#x1f349…

CTF杂项提纲

CTF的杂项是涉及编码&#xff0c;图片隐写&#xff0c;音频隐写&#xff0c;压缩包分析的方向&#xff0c;本文对MISC的知识点做了一个简单列举 常见编码 ASCII 0-9,48-57 A-Z 65-90 a-z 97-122 URL url编码又叫百分号编码&#xff0c;是统一资源定位的编码方式 base16/…

ModStartCMS v6.2.0 VIP权益配置功能,界面UI优化升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

【初识数据库】数据库简介及MySQL安装

目录 数据库基本概念&#xff1a; 主流的关系型数据库&#xff1a; 下载并安装数据库 我们选择的是&#xff1a;MySQL Community Server 8.0.26 卸载老版本MySQL 数据库基本概念&#xff1a; 数据库&#xff1a;是数据的仓库&#xff0c;存储数据的地方 数据库管理系统&am…

RK3568平台开发系列讲解(调试篇)debugfs 分析手段

🚀返回专栏总目录 文章目录 一、enable debugfs二、debugfs API三、使用示例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图: 从这…

进程虚拟地址空间的划分

进程虚拟地址空间划分是操作系统中的一个核心概念&#xff0c;它决定了进程可以访问的内存范围和方式。在本文中&#xff0c;我们将介绍进程虚拟地址空间的划分方法和各个部分的作用。 进程虚拟地址空间的划分方法 在操作系统中&#xff0c;每个进程都有自己的虚拟地址空间&am…