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