你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-数码管显示实验

[复制链接]
STMCU小助手 发布时间:2022-7-1 12:13
通过STM32F1 芯片的IO 口控制板载的一个共阳数码管显示。

1 [- E, g$ n  w0 ]# E! D' ~
数码管介绍
    数码管是一种半导体发光器件,其基本单元是发光二极管。数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1 位、2 位、3 位、4 位、5 位、6 位、7 位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
    了解LED 数码管的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。LED 数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED 数码管内部引脚图,如下图所示。
: x3 @- Z; a( N5 z7 \
微信图片_20220701121228.jpg

+ N% ]: M/ _" K5 Z$ i1 i2 s1 K
    如果开发板上使用的是一个共阳数码管,即8 个LED 的阳极全部并联一起引出,阴极分别引出如A、B...DP。如果要让共阳极数码管显示数字0,即对应的段ABCDEF 要点亮即给它低电平,其他的段熄灭即给它高电平
硬件设计
    通常数码管模块电路如下图所示。
微信图片_20220701121223.jpg
. v) f- n% A( Z% w7 t
微信图片_20220701121220.jpg
0 n$ @" t" Y/ L% n4 t$ M, u' G
    相同网络标号表示它们是连接在一起的,因此数码管的8 个段选口(A-DP)是连接在STM32 的PC0-7 管脚上,这个和LED 模块电路是共用PC0-7 引脚的,因此控制数码管时也会控制LED,控制LED 也会控制数码管。由于开发板上使用的数码管是共阳,所以要点亮对应的数码管段,需要让PC 引脚输出一个低电平。
    本章我们所要实现的功能是让数码管间隔1 秒显示0-F。
软件设计
  • 数码管初始化函数
    3 p. j, p5 U1 F* S2 p2 m7 _/ I/ ]

    9 [/ s: {! q# w+ W( r& ?) N
在工程中新建smg.c 文件,里面代码如下:
  1. #include "smg.h", g+ ]5 C  s% Y% M
  2. /*************************************************************: o" K8 O2 V, b
  3. * 函数名: SMG_Init
    + Z) p+ E  q4 G- Z9 E
  4. * 函数功能: 数码管初始化
    # n9 L7 d, v  \+ J" V
  5. * 输入: 无" V2 R0 D# P# ]- G! m+ G; h
  6. * 输出: 无
    , x0 Q, ^+ G% h
  7. **************************************************************/
    , I  z4 q% D% H0 U* |! v
  8. void SMG_Init()& `: ~$ K& V4 D6 `
  9. {
    * X& j' d2 t# r
  10. GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用1 |& z) ^4 T: W9 p
  11. 来初始化GPIO' J; K4 K  v, x/ k7 _8 m# \
  12. /* 开启GPIO 时钟*/" w" X. e# m- L
  13. RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);
    % J  D3 ]+ x) P* M8 n& \; X
  14. /* 配置GPIO 的模式和IO 口*/
    8 Q: }4 u# K; I& c; y% v
  15. GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择你要设置的IO 口
    6 t. x1 X( s! W0 x" v
  16. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    8 J6 d  k0 }  B1 v( v
  17. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;3 }  Y8 k4 i+ X* E- X
  18. GPIO_Init(SMG_PORT,&GPIO_InitStructure); /* 初始化GPIO */
    # \3 ]- K: y+ f( L
  19. }
复制代码
3 b- u. Z4 ~! r2 |( E  \- ~3 W/ _
    SMG_Init()函数用来初始化蜂鸣器的端口及时钟,同样的在函数内我们看到有几个参数不是库函数内的,这种情况一般是我们自己定义的宏,通常放在对应的头文件内,我们打开smg.h,可以看到如下代码:
  1. #ifndef _smg_H! h4 Y8 H8 w$ k* m
  2. #define _smg_H# J( [( f  _, I7 h  \1 x
  3. #include "system.h"
    / L6 _2 O9 M0 J# C/ J7 l+ M( e
  4. /* 数码管时钟端口、引脚定义*/
    , {& P& l4 P4 ^/ Z. g
  5. #define SMG_PORT GPIOC$ @" x" ^9 L: N; r( U; }
  6. #define SMG_PIN6 B/ j- X: V7 d& p! G
  7. (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_
    % x# F: `, I  r' b% F& J9 j; u
  8. 5|GPIO_Pin_6|GPIO_Pin_7)6 I/ l3 X5 L/ {# c$ F
  9. #define SMG_PORT_RCC RCC_APB2Periph_GPIOC
    " m' B+ a" O* H8 a$ A
  10. void SMG_Init(void);//数码管初始化5 b( ~; T/ U# ^
  11. #endif
复制代码
1 N' f( ?* x9 j2 e2 S
    里面就将数码管的GPIO 端口及管脚进行了宏定义,这样做是方便大家移植程序,只需要对这个宏修改就能实现数码管的初始化修改。
% T' q8 J" P: N2 g) h( U. d
主函数
    我们打开工程中main.c 文件,里面代码如下:
  1. /************************************************************( F5 S3 V0 ~. L
  2. * 函数名: main
    1 `: k5 L9 M& D8 |. y
  3. * 函数功能: 主函数9 O# _0 s' i, H1 r# E% |# B
  4. * 输入: 无
    : G8 Q3 x- ~4 I! P+ d" l
  5. * 输出: 无% u+ C, p4 u4 |! A- h
  6. ************************************************************/
    ( N* [0 B, Y1 h1 ^  ?. v
  7. int main()
    + X: p% c: P% c$ F
  8. {! P6 E+ Y+ e5 q" R/ m
  9.   u8 i=0;$ f( V( E5 Y- P( X8 ^2 n+ ]; @2 S) ]
  10.   SysTick_Init(72);
    ! G- N; S- m" N: [8 X) Q
  11.   LED_Init();6 n$ N) M3 Q; a- R
  12.   SMG_Init();
    ) _9 q( t$ ^+ L
  13.   while(1)& b4 h" Y# U+ C
  14.   {- G( R2 `. f4 L) X  T' R7 b
  15.     for(i=0;i<16;i++)  J! `5 ]2 N% H6 |# D) z
  16.     {
    / G( z. v3 r# r" j7 C$ h
  17.       GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));
    ( D8 d0 l# R  L$ M; X
  18.       delay_ms(1000);
    + v! u1 S: W& |4 w) Q4 ^! t
  19.     }- l. K4 E5 y; P& `- |. J5 o
  20.   }
    / B+ Y$ [# I1 a1 D) S
  21. }
复制代码

; |; S* q3 ?' M4 X( _! X: z$ @+ j2 M
    主函数实现的功能比较简单,首先将使用到的外设硬件进行初始化,然后进入while 循环,通过GPIO_Write 库函数将数码管段码数据发送到数码管段选口,我们将0-F 的段码数据存储在smgduan 数组内,这是共阴数码管的段码数据,而我们使用的数码管是共阳,只需要将此数据取反即可。smgduan 数组如下:
  1. //0~F
    + P2 K% H( I/ }2 q1 c2 I; m  b) s
  2. u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
复制代码
; b0 o( |4 K7 n2 H

% V$ U8 q4 i1 c
赞 收藏 评论0 发布时间:2022-7-1 12:13

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版