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

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

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

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

5 i& N: j4 a( ^: p
微信图片_20220701121228.jpg

% |! x' Q) v- ]% e; w
    如果开发板上使用的是一个共阳数码管,即8 个LED 的阳极全部并联一起引出,阴极分别引出如A、B...DP。如果要让共阳极数码管显示数字0,即对应的段ABCDEF 要点亮即给它低电平,其他的段熄灭即给它高电平
硬件设计
    通常数码管模块电路如下图所示。
微信图片_20220701121223.jpg

5 }' g$ X" D; Z6 i8 h  i
微信图片_20220701121220.jpg
7 u' C1 x  ?* ~1 A- g0 B" g
    相同网络标号表示它们是连接在一起的,因此数码管的8 个段选口(A-DP)是连接在STM32 的PC0-7 管脚上,这个和LED 模块电路是共用PC0-7 引脚的,因此控制数码管时也会控制LED,控制LED 也会控制数码管。由于开发板上使用的数码管是共阳,所以要点亮对应的数码管段,需要让PC 引脚输出一个低电平。
    本章我们所要实现的功能是让数码管间隔1 秒显示0-F。
软件设计
  • 数码管初始化函数
    / T7 U, |9 e! G! a; Q

      i: p3 F. o( D4 p# Z
在工程中新建smg.c 文件,里面代码如下:
  1. #include "smg.h"
    8 F1 X0 T5 }3 l' Y2 [4 \
  2. /*************************************************************
    3 H% h; b$ {+ M; W7 H5 G+ b, o
  3. * 函数名: SMG_Init$ P9 I4 G( @% k* c* S& t. [
  4. * 函数功能: 数码管初始化
    . {, e' Z. h8 B+ k8 Y1 m! L
  5. * 输入: 无( f, N9 B# G( G# t
  6. * 输出: 无' U2 P" M3 c- s7 l+ {
  7. **************************************************************/4 _  I/ q4 c' s6 p- T2 K
  8. void SMG_Init()
    " u+ p1 a: L: _; v6 w; n: c
  9. {& _9 }) B9 f$ [: T! p
  10. GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用# j# ^: I6 \* r+ q; a9 {8 i5 t
  11. 来初始化GPIO
    6 U: ?  t/ ~- P- X
  12. /* 开启GPIO 时钟*/
    1 ]+ f0 Q6 k7 I" F
  13. RCC_APB2PeriphClockCmd(SMG_PORT_RCC,ENABLE);
    2 X6 |/ w- }( O) V
  14. /* 配置GPIO 的模式和IO 口*/
    3 Q$ H5 ^0 f/ u& C  \+ b( }
  15. GPIO_InitStructure.GPIO_Pin=SMG_PIN; //选择你要设置的IO 口
    $ Z$ x4 D, g6 f' |* `
  16. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;& j' u( E6 j; m0 w0 s# R! r
  17. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    # ^% x. |2 q$ p* F! ?
  18. GPIO_Init(SMG_PORT,&GPIO_InitStructure); /* 初始化GPIO */+ V" @! @- @, G& x% m2 ]0 b" ?
  19. }
复制代码

2 o# C3 Q9 K3 U4 t
    SMG_Init()函数用来初始化蜂鸣器的端口及时钟,同样的在函数内我们看到有几个参数不是库函数内的,这种情况一般是我们自己定义的宏,通常放在对应的头文件内,我们打开smg.h,可以看到如下代码:
  1. #ifndef _smg_H
    6 g6 H8 ^0 X0 @/ y* s8 {
  2. #define _smg_H  K4 w6 b5 l; {
  3. #include "system.h"5 e( K7 V9 d  o
  4. /* 数码管时钟端口、引脚定义*/( A% J! X, A3 `1 d
  5. #define SMG_PORT GPIOC* B% M+ p  n/ k2 b
  6. #define SMG_PIN
    9 r! V$ I/ {4 Z1 ?4 U$ y" G
  7. (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_) }0 H4 Z% R) o
  8. 5|GPIO_Pin_6|GPIO_Pin_7)
    ( k' \+ d& A! r2 F" y1 }$ h
  9. #define SMG_PORT_RCC RCC_APB2Periph_GPIOC
    5 W+ ?7 g+ }4 X: V$ q5 F
  10. void SMG_Init(void);//数码管初始化* Z! g  H4 ?7 z  k8 J0 D
  11. #endif
复制代码
% v# m- O* D, \8 w, m
    里面就将数码管的GPIO 端口及管脚进行了宏定义,这样做是方便大家移植程序,只需要对这个宏修改就能实现数码管的初始化修改。
# t0 I6 x1 i4 _5 H
主函数
    我们打开工程中main.c 文件,里面代码如下:
  1. /************************************************************
    7 ?; y- Z- W+ ?8 C4 ]" m* \( g
  2. * 函数名: main
    ) k( v( p( y& r5 |  L* M6 u
  3. * 函数功能: 主函数
    ) S) J* H: q, {. U& g7 d* `
  4. * 输入: 无$ T8 T, w' _- I( w6 r4 e! w) u
  5. * 输出: 无, l1 g9 w: Z! i/ M
  6. ************************************************************/7 B% ]1 p3 Y# {
  7. int main()" ~7 i# l" Q/ J0 Q  ~3 q* y1 B8 s
  8. {
    7 {- u4 P+ @6 G4 O* d' i9 R
  9.   u8 i=0;
    ; C1 ~4 b8 W' Y5 \+ z% ^( I5 H
  10.   SysTick_Init(72);( t  ~* {3 X0 Q5 j5 j/ s
  11.   LED_Init();0 k" t8 v7 U" d* x1 y
  12.   SMG_Init();
    ' v% b: B6 Q& C) g
  13.   while(1)# ~, A; }$ i! d# c! x- R7 B/ O
  14.   {0 d1 _6 C5 ^; g5 m  [& c
  15.     for(i=0;i<16;i++)8 Y  h4 K8 {& r, k2 K5 N2 [( I
  16.     {
    7 U4 l4 k# s- z
  17.       GPIO_Write(SMG_PORT,(u16)(~smgduan[i]));4 |3 A& O& _" o) b
  18.       delay_ms(1000);2 ]9 [9 V4 O+ b9 r1 w
  19.     }0 j! O% B& e6 B2 l
  20.   }% @& t: W, X% C/ t
  21. }
复制代码
+ E" N: f5 n5 c$ w7 ?7 D# k
    主函数实现的功能比较简单,首先将使用到的外设硬件进行初始化,然后进入while 循环,通过GPIO_Write 库函数将数码管段码数据发送到数码管段选口,我们将0-F 的段码数据存储在smgduan 数组内,这是共阴数码管的段码数据,而我们使用的数码管是共阳,只需要将此数据取反即可。smgduan 数组如下:
  1. //0~F3 R3 `, ]8 f" T/ q
  2. u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
复制代码
/ T) W3 }  }" W9 r4 ?
- [: h0 d# I  g* j+ m% W
收藏 评论0 发布时间:2022-7-1 12:13

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版