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

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

[复制链接]
STMCU小助手 发布时间:2022-5-25 18:00
一 认识二级管- Z# ]6 B1 A- e3 e/ ?9 U6 ~% A
7 _3 c4 u; u  J7 [
常用的二级管分为两种0 M- N: s- X5 z+ R
- W2 J6 V8 Q  v5 s
1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各端为低电平。
3 P/ }' Z9 b) q
+ W' P3 k4 s; {5 y- s9 s2,(c)图共阳极结构:是把所有 LED 的阳极作为公共端(COM) 连起来,接高电平,通常接电源(如+5V )。通过控制每一 个LED 的阴极电平使其发光或熄灭,阴极为低电平时LED 发光,为高电平时 LED熄灭。
$ R2 m. E1 J) j4 j8 o% S( v  h
7 V0 z( R9 V3 l# m( a! w如下图& H  r3 a. Q" }, G/ V
1 U8 o2 e  P+ l8 c
c5a6bf63ee9247ec8fc75c99cb9b856b.jpg + C; {" P, C! ^7 a8 u: z0 R2 P
# s5 d  P5 |2 A1 e  S
f51d5de3e4be4e2c9fac3fee15a90f74.jpg 7 q1 f0 H. L; ~  j
* Z, j" F, ~& q6 h8 @
我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下
" Y0 j3 e% G' K+ I7 u( n' n# `/ k" q6 M
a13ad5e8585849269a282c8547c96e16.jpg
( L4 ~9 {, x' R3 ^- y5 D" d fc2f9ece545b49ff92a7f86093186183.jpg
$ M! F' [$ N# j( C# ?
+ ~$ B3 v$ N* a( U/ v 以此列表可以看出,对于同一个字符,共阴极和共阳极的字形码是相反的
! [1 B0 H$ m7 s: b# ~4 D& i9 K3 V+ I: V
二 程序的实现
6 @# e/ B1 p  x. X, Y# W9 ]! Q, h
# K* G6 J& |. o* Z* o数码管静态显示电路图# Z1 z, p; z) ^9 T
: Y6 z3 X' V8 t% D
cdf72a536b1e4bdfaf5501c650c29559.jpg
- c4 C% E* G" C- e5 _0 e( x9 o: w- [4 E) h
代码实现数码管也有两种方式$ n$ \* n* U' ?2 b9 R6 D
9 ?! t" b7 v& Q  T
一如上电路图,亮两个数码管$ Z: Q! j# O3 e0 O# W

1 U1 v9 B" \9 w$ C2 X# \9 ~. @$ D
  1. #include "stm32f10x.h"
    9 y% K% ~7 B4 R' e6 s' p
  2. //定义0~9十个数字的字形码表
    . l: p, F. |* m$ o  z, H0 A: S
  3. uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};# e( z* y0 f' h9 _+ J5 d/ s9 F, ~8 V# W
  4. uint16_t disp[2];5 E+ w' Q8 P+ R6 o& W; N
  5. uint16_t temp,i;
    ' D) i3 u. Y6 U# b2 x
  6. ( r' `/ {3 ?* L! N# p/ _' W+ f  `
  7. void Delay(unsigned int count)               //延时函数
    " n2 z+ m, ]  E  h, {% j
  8. {) u. s& j' p# H  i6 l% D$ W
  9.     unsigned int i;$ {) a" t+ K$ z1 C. k
  10.     for(;count!=0;count--)- X6 C  Q- `9 Z% R( Y
  11.     {
    9 w* J$ q+ f# i8 L* U! o3 C* I- k
  12.         i=5000;9 s" G3 n7 H& {6 m3 v
  13.         while(i--);5 e( [( R/ a9 f2 E4 h% f
  14.     }9 E: d$ O( z5 S
  15. }9 p0 g3 I  v6 b# D% P# m; |5 t
  16. void main(void)) i3 S6 q" N" r
  17. {
    9 r3 S  v% Z, u8 ]
  18.                 GPIO_InitTypeDef GPIO_InitStructure;
    1 D3 r6 j2 P2 v: z
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                 //使能GPIOB时钟
    9 }$ o" M: p) i; b  g7 z
  20.                 GPIO_InitStructure.GPIO_Pin = 0xffff;                       //PC0-PC15引脚配置
    / g3 j7 Z) ~$ m6 U2 e
  21.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //配置引脚为推挽输出6 Y7 Y7 C1 d! B
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //GPIOB速度为50MHz
    : D( ]& g' [2 p# _7 b( ~
  23.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                      //初始化PC0-PC15
    8 n/ h& j+ s2 f. R1 [
  24.         while(1)                0 e) j, m: C2 D/ @
  25.         {
    0 Q4 Y- j/ O1 j1 H3 R& Z+ r$ k0 U
  26.             for(i=0;i<=20;i++)
    0 Y9 B- a% G. e$ Z2 [& s+ n
  27.             {
      @5 t2 |! p& I2 f, W4 \
  28.               disp[1] = table[i/10];              //数码管显示十位数字的字形码/ s9 E# M  x" L7 g* W
  29.               disp[0] = table[i%10];              //数码管显示个位数字的字形码6 ?) S- i6 Y6 K8 b8 o
  30.               //十位数的字形码左移8位,然后与各位数的字形码合并% D2 P+ M1 j5 W/ h& U
  31.               temp = (disp[1]<<8)|(disp[0]&0x0ff);
    & J% m( |+ c9 i# V
  32.               GPIO_Write(GPIOC,temp);3 m7 |& M+ N2 O# b# h% ]
  33.               Delay(100);
      ]0 M+ E7 Y  G
  34.             }                                 1 ?: m8 T$ s- F; A) U) o9 q
  35.         }
    7 A' F2 ^5 f% h

  36. ( S4 w% V8 F7 D' u) K4 C7 S. F
  37. }. ~: u; A' C4 Z! e; c  S# r* z+ ?
复制代码
! [/ F. q: z; l  O1 o8 b4 J
代码说明:7 `$ C4 L: C4 i4 T
; R0 ~% z3 {( I/ z0 s5 R/ z
(1)语句"GPIO_InitStructure.GP1O_ Pin = Oxfff:” 用来配置 PCO~PC15 引1脚。为什么使用Oxfit)参数就可以配置 PCO-PC15引1脚呢?可以参考stm32110x_gpio.h 头对 GPIO Pin_x的定义。
$ E7 C- ]7 I# ]4 x4 N& R(2)disp1数组存放数码管将显示十位和个位数字的字形码,是经常用到的显示缓冲区。
- d: {. ~7 k. r2 }$ W' \
0 r; X- @7 @6 C5 T- {- @(3)语句"temp = (disp[1]<<8)|(disp[0]&0x0ff);” 的作用:disp[1]<<8是把显示十位数字的字形码左移8 位(移到高 8位),disp[0]&0x0ff 是保留低8位,其他位清零(高8 位清零),然后把高8位(十位)和低8 位(个位)合并,完成循环显示 0-20字形码的显示效果。
# @1 @/ a7 d1 Q2 M. ~9 q  ]% @5 N
二 第二种代码实现的方法9 {- q* E0 p1 V- W/ h6 i- F% t' m
# M$ p2 n) o1 v3 Z. g: e' V/ H
  1. //头文件
    - S- d+ U5 J+ i
  2. #include "stm32f10x.h"- A! w1 f0 a5 H& }' w3 Q
  3. #include "GPIOLIKE51.h"        * I% W! F" H, P: {+ `& i

  4. 1 D1 _5 o  A8 a2 [
  5. : P' Q* J- k$ c6 j% h2 z# }3 c3 r$ c
  6. #define CLK  PBout(8)
    ' e  w, \0 D, t
  7. #define DAT  PBout(9)
    5 {! I  s" L" c
  8. #define W1   PBout(4)% m' a; I; t# ~& e7 y: b
  9. #define W2   PBout(5)
      q! S7 T& H. F+ o5 ~7 _
  10. #define W3   PBout(6)
    0 G& r8 p0 T. r9 S8 A; R
  11. #define W4   PBout(7)
    7 R0 u: F/ H: w6 f& p' R& {) r

  12. * Y+ ?9 {5 z* x% ]/ \$ k5 L

  13. 6 Q# n( W! H# R6 o
  14. //函数声明  ?% X/ \% \& @; A% U
  15. void GPIO_Configuration(void);
    # R2 S1 b. b+ `- H3 M) ]
  16. : Z5 H* g% }2 q% m, k9 ^" ^
  17. void delay(int m)   
    " {' M0 W) l( v: o
  18. {) Y" E7 W# _' W3 U
  19.    int i,j;1 V' D+ D* t# _3 O) p7 P
  20.    for(i=0;i<m;i++)- M9 I5 Y" f, [! m! T& @; X3 i1 h
  21.       for(j=0;j<1000;j++);4 K- q  n5 m3 L; w+ p
  22. }
    0 K, ?% A9 }$ Y! ^2 C  D7 r

  23. ' v) Q- N3 g9 s& p" l6 g) T* X4 T
  24. void Delay(uint32_t nCount)           //延时函数7 W' }- C2 E4 K
  25. {7 f; l2 {; d+ \1 Q4 C# x% {1 W/ }
  26.   for(; nCount != 0; nCount--);           //函数说明:nCount:延时长短5 t( R  r) U  s2 H  r& w
  27. }7 X$ m$ Q& Y+ z
  28. 1 T, \/ Y( u! T- @% F$ b! I( T
  29. void Smginit(void)                  //定义数码管,进行配置. m7 G/ d. W+ ?8 i4 u
  30. {3 L1 ?/ q. V6 Z) A) A
  31.     GPIO_InitTypeDef GPIO_InitStructure;5 `# T9 d. Z3 O" ~7 @3 F6 Z
  32.         / Z, O- p8 ^1 u& _0 ^5 m/ L
  33.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);         
    . J$ U0 X  O2 F5 b' z0 w- J2 H
  34.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);            8 K7 s* j( a: B5 @( i2 Q) E1 F% M
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;! \3 z2 o/ P; `' _9 o$ b. d
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    8 `/ T) G5 B' c. Z
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  % ~9 `7 ?# P/ @6 v; `6 _5 s
  38.         GPIO_Init(GPIOB, &GPIO_InitStructure);8 u9 Z9 Q) J8 B3 q" Z
  39.         ( `( P: P# d- f+ D
  40.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);                 
    8 u* k5 Z  Q( g; U1 v
  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
    4 {' m% X( H% I7 x9 B
  42.                                    GPIO_Pin_8 | GPIO_Pin_9; & S& U$ C# M, I/ a- l
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ' ]+ ^0 f) ]# O8 n, z5 U
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; " w0 z0 ?. Q6 u' N% W9 l' i
  45.         GPIO_Init(GPIOB, &GPIO_InitStructure);6 y1 f" J9 z# {
  46. : t8 q/ h: Y0 N) a
  47. }
    - v0 O* |- S( B7 [

  48. ) |  `* [0 |/ N( h
  49. //定义字形码4 i8 A& ^0 P5 r
  50. unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};+ r0 ~2 ^9 s% E

  51. 7 _$ d+ M& S! ?. Z. O9 k; b- A
  52. void Disled(int m)  6 C$ W' W7 Y; d# z* u
  53. {
    / r4 t! Y/ f: L8 C7 w$ e/ |" J
  54.    int i;
    ) `# L8 }/ G) |8 S2 h
  55.    CLK=0;  
    ) W$ D( i0 r$ V: O
  56.    for(i=0;i<8;i++)8 y, e0 w+ b7 r" G- A
  57.    {
    0 ^# f% J- A' |& {3 |4 V. p% F
  58.       CLK=0; , R) J: M2 M6 d; ~- U4 o5 }8 m
  59.           delay(1);& b, @$ S4 i, g) P; B
  60.       if (m&0x80) $ {( x7 H4 l  \! H6 Y1 k2 u
  61.       DAT=1;
    & _" p8 }# W0 u* s
  62.       else. [4 o" f& f; @
  63.       DAT=0;0 N- p4 X; a" ?3 @& B  }
  64.       CLK=1; - p) j+ H: F' k6 Y, t
  65.           delay(1);
    . d& P, R, a4 N3 N
  66.       m=m<<1; # @( F  g/ o+ M3 P
  67.    }1 o3 U7 B: \1 s  q" g' f% v2 ~
  68. }
    # c; f+ k  T- R  @
  69. 1 y" t# i. E6 H" I$ ]& @: \& k
  70. int main(void)1 W  c. t! M  O
  71. {
    * [/ A% j0 a8 i: R: n8 X
  72.           int i;% h; M6 h- x6 T+ a+ z' J
  73.           Smginit();
    9 d& E" [5 g7 [! Z) ]: j$ T0 L
  74.           W1=1;            # [: H* x7 R# s9 D' F" B, q
  75.           W2=1;
    " S8 i- B8 g  n  y, m3 U
  76.           W3=1;% h& l2 T) t( H# K  W
  77.           W4=1;
    ; m* }% F" |: U( e
  78.     while (1)4 b7 |2 I' E) {
  79.                 {% j0 p* P5 Z( m, h( Q
  80.                         for(i=0;i<10;i++)
    * a7 J: Z0 ^% ]5 `* B% m, v/ A0 U* w$ ~
  81.                         {
    1 T! ~9 h$ c1 O" X
  82.                          Disled(code<i>);4 o2 [& ]: D, \+ w% A+ g- Y
  83.                          delay(10000);
    9 _( e* ]3 V1 E
  84.                         }  q$ C& r, L& ^
  85.     }
    * [2 F* O6 p0 j8 [
  86. }</i>
复制代码

+ ~* o) K$ ~9 [- B: E7 `代码说明:  t) k) Q8 T6 s2 j7 A. j2 E+ H! l
# o9 B/ S) c  h' ~
(1)这个程序是电亮4个数码管。
1 _* R" e. b) A8 P& L
' A' ^' |1 S$ x: @2 g: Y) u(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件
$ {1 j) N% `6 K% A9 C! i% I+ m9 Z3 ?+ V0 W
(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。
) O- Q- e3 P. \% g8 x8 U( I  j' G+ M+ [7 j
/ Y9 T; }$ ^; z" y

1 j% @+ X+ {& |- F( e( k8 j
收藏 评论0 发布时间:2022-5-25 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

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