STM32物联网项目——TM1620驱动数码管显示

这篇具有很好参考价值的文章主要介绍了STM32物联网项目——TM1620驱动数码管显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

程序功能:

    tm1620,物联网,学习,笔记,stm32

 TM1620

这里主要说说关于TM1620指令与数据传输,其他概述等内容详细见TM1620手册:

链接:https://pan.baidu.com/s/1C4I_oy9n9QjSPu8UD-FJRg 
提取码:9ec0 
--来自百度网盘超级会员V2的分享

TM1620一共有4条指令:

tm1620,物联网,学习,笔记,stm32

(1) 显示模式命令设置: 
该指令用来设置选择段和位的个数(4~6 位,8~10 段)。当该指令被执行时,显示被强制关闭。在显示模式不变时,显存内的数据不会被改变,显示控制命令控制显示开关。

tm1620,物联网,学习,笔记,stm32

 本项目使用的是6位8段的数码管,即0x020。

(2) 数据命令设置: 
该指令用来设置数据写和读,B1和B0位不允许设置01或11。

tm1620,物联网,学习,笔记,stm32

(3) 显示控制命令设置: 
该指令用来设置显示的开关以及显示亮度调节。共有8级辉度可供选择进行调节。  

tm1620,物联网,学习,笔记,stm32

(4) 地址命令设置: 
该指令用来设置显示寄存器的地址。 最多有效地址为12位(00H-0BH)。上电时,地址默认设为00H。

tm1620,物联网,学习,笔记,stm32

 ▲注意:芯片显示寄存器在上电瞬间其内部保存的值可能是随机不确定的,此时我们直接发送开屏命令,将有可能出现显示乱码。所以建议对显示寄存器进行一次上电清零操作,即上电后向12位显存地址(00H-0BH)中全部写入数据0x00。具体操作方法是:初始化TM1620时使用(2)数据命令中的自动地址增加命令,依次给所有地址写0x00.

串行数据传输格式

tm1620,物联网,学习,笔记,stm32

空闲时,时钟和STB线均被拉高;STB线拉低,准备发送数据;CLK线拉低,此时准备数据位,之后拉高CLK线,发送数据(在CLK上升沿发送数据),循环此步骤8次,可发送1Byte数据。

两种地址模式的传输

tm1620,物联网,学习,笔记,stm32

tm1620,物联网,学习,笔记,stm32 两种模式的区别就是发送数据时,固定地址模式必须先发送地址地址命令,才能发送数据,而地址增加模式不用。

强调:起始地址命令字发送完毕,“STB”不需要置高紧跟着传数据,最多14BYTE,数据传送完毕才将“STB”置高。

数码管

本项目使用的是共阴极数码管,即单片机发送高电平点亮。

tm1620,物联网,学习,笔记,stm32

tm1620,物联网,学习,笔记,stm32

 若想让数码管显示“0”字样,只需要向00H(GRID1)地址中从低位开
始写入0x3F数据点亮相应的段选位,低位到高位依次对应图中的a、b、c、d、e、f、g、dp或SEG1~SEG8。

数码管位选与地址关系如图:

tm1620,物联网,学习,笔记,stm32

 即GRID1的低4位为00HL,高4位为00HU...

功能实现

 硬件电路:

tm1620,物联网,学习,笔记,stm32

 TM1620的STB、CLK、DIN引脚分别连接单片机的PC0、PC1、PC2引脚。

 初始化:

初始化TM1620的3个输出引脚:

tm1620,物联网,学习,笔记,stm32

tm1620,物联网,学习,笔记,stm32 初始化Key1按键引脚并在NVIC中打开外部中断0:

tm1620,物联网,学习,笔记,stm32

 tm1620,物联网,学习,笔记,stm32

 代码部分:

定义结构体类型:

typedef struct
{
	Brightness_level_t  Brightness;
	
	void (*TM1620_Init)(void);                          //TM1620初始化
	void (*Disp)(Disp_NUM_t,uint8_t,Disp_DP_Status_t);  //数码管显示
} Display_t;

 还定义了6个枚举,分别定义了显示模式、写数据地址模式、辉度等级、显示寄存器地址、数码管编号、小数点状态(即数码管dp段),这里就不一一列举。

写入字节函数:

/*
	* @name   TM1620_Write_Byte
	* @brief  TM1620写入字节
	* @param  dat -> 待写入数据
	* @retval None      
*/
static void TM1620_Write_Byte(uint8_t dat) 
{
	uint8_t i = 0;

	
	CLR_STB;
	
	for(i=0;i<8;i++)
	{
		CLR_CLK;
		//准备数据位
		if((dat & BIT0) == BIT0) //BIT0为宏定义,为0x01
			SET_DIN;
		else
			CLR_DIN;
		dat = dat >> 1; //移位,为发送下一位做准备
		//拉高CLK,发送数据	
		SET_CLK;	
		__nop();
	}	
}

TM1620初始化函数:

/*
	* @name   TM1620_Init
	* @brief  TM1620初始化
	* @param  None
	* @retval None      
*/
static void TM1620_Init() 
{
	uint8_t i = 0;
	
	//设置显示模式
	TM1620_Write_Byte(Disp_Mode_GRID6_SEG8); 
	SET_STB;  
	
    //设置地址自动增加模式
	TM1620_Write_Byte(Write_Data_Addr_Auto_Add); 
	SET_STB;
	
	//利用循环清除显示寄存器地址
	TM1620_Write_Byte(Disp_SFR_Addr_00H); //首地址

	for(i=0;i<Disp_SFR_Addr_Num;i++)
		TM1620_Write_Byte(0x00); 
    SET_STB; 

	//调节数码管辉度
    TM1620_Write_Byte(Display.Brightness);
	SET_STB; 
}

数码管显示函数:

/*
	* @name   Disp
	* @brief  数码管显示
  * @param  Disp_NUM:       数码管编号
            Dat             数据0~F
            Disp_DP_Status  小数点显示状态
	* @retval None      
*/
static void Disp(Disp_NUM_t Disp_NUM,uint8_t Dat,Disp_DP_Status_t Disp_DP_Status) 
{
	//检查参数范围
	if(Dat > 0x0F)
	{
		System.Assert_Failed();
	}
	
	//设置显示模式
	TM1620_Write_Byte(Disp_Mode_GRID6_SEG8); 
	SET_STB;
	
	//设置地址固定模式
	TM1620_Write_Byte(Write_Data_Addr_Fix); 
	SET_STB;
	
	//写地址(数码管编号)
	TM1620_Write_Byte(Disp_NUM);
	//写数据,并判断有无小数点
	if(Disp_DP_Status == Disp_DP_ON)
		TM1620_Write_Byte(Disp_Decode[Dat] + 0x80); 
    //Disp_Decode数组存贮的是数码管显示“0”~“F”的译码。
	else
		TM1620_Write_Byte(Disp_Decode[Dat]);
	SET_STB;
	
	//设置辉度
  TM1620_Write_Byte(Display.Brightness);
	SET_STB; 
}

 外部中断0回调函数:文章来源地址https://www.toymoban.com/news/detail-795321.html

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY1_Pin)
	{
		LED.LED_Flip(LED2);
		
		switch(Display.Brightness)
		{
			case Brightness_level_1: Display.Brightness = Brightness_level_2; break;
			case Brightness_level_2: Display.Brightness = Brightness_level_3; break;
			case Brightness_level_3: Display.Brightness = Brightness_level_4; break;
			case Brightness_level_4: Display.Brightness = Brightness_level_5; break;
			case Brightness_level_5: Display.Brightness = Brightness_level_6; break;
			case Brightness_level_6: Display.Brightness = Brightness_level_7; break;
			case Brightness_level_7: Display.Brightness = Brightness_level_8; break;
			case Brightness_level_8: Display.Brightness = Brightness_level_1; break;
			default: Display.Brightness = Brightness_level_3;
		}
	}
}

到了这里,关于STM32物联网项目——TM1620驱动数码管显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32HAL库驱动数码管

    本文档创建于2023年3月7日 本文记录了我学习数码管驱动的过程,实际是微机原理课上留的一个作业。 本文作者:RobotFreak 本文参考《NANO_STM32F103开发指南-HAL库版本_V2.0》,正点原子官网可下载。 数码管,也称LED数码管,按发光二极管单元连接方式可分为“共阳极数码管”和“

    2024年02月08日
    浏览(37)
  • 51单片机使用TM1638驱动的数码管键盘模块

    前几天差不多把清翔的视频教程写完了,然后玩了两天,这次准备把以前买的TM1638芯片驱动的数码管按键模块用在51单片机上。 这个模块我在pdd上买的,用了2块的优惠券后付款7元包邮,价格还行吧,对比了下这个价格几乎就是最低价了。TM1638芯片都要1块多,再加上PCB,焊接

    2024年02月03日
    浏览(95)
  • Arduino UNO驱动TM1637四位时钟数码管显示时间

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。  显示模式(8 段×6 位),支持共阳数码管输出  键扫描(8×2bit),增强型抗干扰按键识别电路  辉度调节电路(占空比

    2024年02月12日
    浏览(42)
  • STM32使用HAL库驱动TA6932数码管驱动芯片

    8段16位,支持共阴共阳LED数码管。 推挽配置即可。 1、使用TA6932_Init进行初始化 2、使用TA6932_Disp(uint8_t *_ucPtr,uint8_t _ucLenth)进行显示,_upPtr指针指向段码,_ucLenth为显示长度,不超过16位。

    2024年02月07日
    浏览(42)
  • STM32 数码管显示

    一 认识二级管 常用的二级管分为两种 1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各

    2024年02月08日
    浏览(47)
  • STM32-GPIO数码管动态显示

    目录 一、数码管原理 1、LED数码管的结构 2、LED数码管工作原理 3、数码管动态显示 1)动态显示的概念 2)动态显示的接口 二、代码的实现 三、仿真结果展示   本篇文章将继续进一步了解GPIO外设输出模式 知道这一部分的朋友可以直接点击目录部分跳过这段跳过 ,这里介绍

    2023年04月08日
    浏览(38)
  • STM32 4位数码管和74HC595

            在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。         当选择数码管1显示的时候,这可以

    2024年04月17日
    浏览(93)
  • 【STM32+HAL+Proteus】系列学习教程---数码管显示定时

    1、STM32 基于HAL库定时器的使用; 2、加强数码管的学习。 3、具体目标:利用定时器3实现一个60秒的定时,定时时间在数码管上显示,定时时间到,蜂鸣器响一声作为提示功能。         自动生成的代码中,中断回调函数都有一个__weak ,加上了__weak 修饰符的函数,

    2024年04月09日
    浏览(69)
  • arm学习stm32之spi总线数码管倒计时

    由于时间没有用时间计时器操作,有些误差,后续有空会翻新计时器版本 main.c spi.c spi.h

    2024年02月13日
    浏览(44)
  • 基于STM32的四位数码管计数器设计与实现

    ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进, 代码获取、问题探讨及文章转载可私信。  ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇 点击领取更多详细资料 本文介绍了一种基于STM

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包