13.[STM32]从原理开始,带你驱动单位数码管

  🍌
🍌🍌
作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步
   🍋
 🍋🍋
 系列专栏:STM32
    🍎
  🍎🍎
🍎🍎🍎
 🍎小实验目标:在单位数码管上显示数字0-F🍎
 🍊如有写得不好的地方欢迎大家指正🍊
创作时间:🍊🍊🍊2022年5月3日🍊🍊🍊 

目录

1 PB3、PB4引脚这个坑,你踩过吗?

2. 数码管基本介绍

 2.1 引脚连接 

3. 程序编写 

附录代码


1 PB3、PB4引脚这个坑,你踩过吗?

PB引脚连接数码管对应引脚,烧录程序后,发现与七段数码管对应引脚连接的PB3、PB4引脚输出不正常,经过几番折腾,发现这两个引脚属于JTAG下载调试相关端口,这两个端口不能作为普通IO使用,需要进行相关配置才可以使用。

通过查找STM32F103相关资料,我找到了如何配置该端口的方法,该引脚的说明如下图所示 :

 想要同时配置PB3和PB4为IO口,有两种方法,

法一:关闭JTAG-DP,启用SW-DP

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
//改变指定引脚的映射,JTAG-DP禁用,SW-DP使能  PB3 PB4可用

法二:关闭JTAG-DP,关闭SW-DP

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
//改变指定引脚的映射,完全禁用JTAG-D和SW-DP	PB3 PB4可用

小提示:

当使用PB4 /PB3之后,JTAG不能使用,可以用SW来下载程序,只需在下载软件里选择SW接口就可以了(用的是j-link )

至此,这个问题就解决了,希望对大家有用。

2. 数码管基本介绍

7段数码显示器能够显示十进制和16进制数字及某些简单字符。根据发光材料的不同,常见的七段数码管显示器有发光二极管和液晶显示器(LCD)两种类型。这种数码管的每个线段都是一个发光二极管(或液晶显示),因此也称LED数码管或LED七段显示器。一个七段数码管内部是由8个发光二极管组成的,其中七个发光二极管构成字形“8”的各个笔画(a~g),另一个发光二极管作为小数点(dp),数码管根据公共端的连接方式,可以分为共阴极数码管和共阳极数码管,外部结构和个对应段如下图所示:


 

本次实验用的是共阳极数码管,a-dp为低电平时点亮。 以阳极数码管为例,其公共端接高电平1,当在某一段发光二极管(如a段)上施加低电平时,该段二极管被点亮。如要显示一个数字‘0’,则dp~a各段的电平情况为:1100 0000(0xc0)。为了保护各段LED不因电流过大二损坏,需要在各段上外加限流电阻保护,阻值为100~510Ω。共阳极7段LED显示0~F的编码表如下图所示:

u8 code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0-F

共阴极数码管对应的段选码表为:

u8 code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   //0-F

 2.1 引脚连接 

共阴极数码管的公共端接地,而共阳极数码管的公共端接电源。

3. 程序编写 

(1)选择PB0~PB7引脚

#define Smg 0X00FF		//选择PB0~PB7引脚
#define Smg_PROT	GPIOB

(2)引脚初始化

void DW_Smg_UserConfig(void){
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//改变指定引脚的映射,JTAG-DP禁用,SW-DP使能  PB3 PB4可用
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//改变指定引脚的映射,完全禁用JTAG-D和SW-DP	PB3 PB4可用
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);//禁用JSAG 
	GPIO_InitStructure.GPIO_Pin  = Smg;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(Smg_PROT,&GPIO_InitStructure);
	
	GPIO_SetBits(Smg_PROT,Smg);//熄灭状态
}

(3)数字显示

void DW_Smg_Dispaly(void){
	
	u8 code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0-F
	
	for(u8 i=0;i<16;i++){
		
		GPIO_Write(Smg_PROT,code[i]);
		delay_ms(500);
	}
}


 int main(void)
 {		
 	
	delay_init();	    	 //延时函数初始化	  
	 DW_Smg_UserConfig();

	
	while(1){
		 DW_Smg_Dispaly();
	
	}
 }

使用共阴极数码管只需要修改对应的编码即可。

实验现象:

  今天的分享就到这里,谢谢大家的耐心阅读,如果觉得有用的话给个👍👍👍

🌜🌜🌜本章结束,我们下一章见🌜🌜🌜


参考资料:
1.STM32固件库手册
2.正点原子STM32不完全手册_库函数版本
3.参考视频
4.数字电子技术基础 

资料已上传,需要自取

附录代码

//main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "DW_Smg.h"



 int main(void)
 {		
 	
	delay_init();	    	 //延时函数初始化	  
	 DW_Smg_UserConfig();

	
	while(1){
		 DW_Smg_Dispaly();
	
	}
 }

//DW_Smg.c

#include "DW_Smg.h"


void DW_Smg_UserConfig(void){
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    //改变指定引脚的映射,JTAG-DP禁用,SW-DP使能  PB3 PB4可用

	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
    //改变指定引脚的映射,完全禁用JTAG-            D和SW-DP	PB3 PB4可用

	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);//禁用JSAG 

	GPIO_InitStructure.GPIO_Pin  = Smg;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(Smg_PROT,&GPIO_InitStructure);
	
	GPIO_SetBits(Smg_PROT,Smg);//熄灭状态
}
void DW_Smg_Dispaly(void){
	
	u8 code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0-F
	
	for(u8 i=0;i<16;i++){
		
		GPIO_Write(Smg_PROT,code[i]);
		delay_ms(500);
	}
}
//DW_Smg.h
#ifndef __DW_Smg_H
#define __DW_Smg_H

#include "sys.h"
#include "delay.h"

#define Smg 0X00FF		//选择PB0~PB7引脚
#define Smg_PROT	GPIOB

void DW_Smg_UserConfig(void);
void DW_Smg_Dispaly(void);

#endif


  • 25
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
驱动数码管的方法可以通过控制数码管的段选和位选来实现。在引用\[1\]的代码中,`DW_Smg_Dispaly`函数用于显示数码管的内容。其中,`code`数组存储了0-F的段选码,通过循环遍历该数组并将对应的段选码写入到数码管的引脚上,从而实现数码管的显示。在引用\[2\]中,`buff`数组定义了0-9和小数点的段选码,通过将对应的段选码写入到数码管的引脚上,可以显示相应的数字和小数点。如果要熄灭数码管,则可以将待显示的数字设置为20。在引用\[3\]中,`code`数组定义了共阴极数码管的段选码表,通过将对应的段选码写入到数码管的引脚上,可以显示相应的数字。至于引脚连接的问题,需要根据具体的硬件电路来确定。 #### 引用[.reference_title] - *1* *3* [13.[STM32]从原理开始,驱动单位数码管](https://blog.csdn.net/qq_48796593/article/details/124550202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32学习100步之第四十五-四十六步——数码管驱动程序](https://blog.csdn.net/Dreamer_HHH/article/details/95790488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依点_DW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值