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

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

[复制链接]
STMCU小助手 发布时间:2022-5-25 18:00
一 认识二级管
; I$ ?) m7 \% q
6 f! c/ Q! H  w$ G8 N常用的二级管分为两种) y( z4 B; ~$ l# z4 L! Q; Z
' w4 e3 u1 R: _) A
1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各端为低电平。
) Z, f' I- V) P, u2 w" j) D. f5 y) p) {3 i; s
2,(c)图共阳极结构:是把所有 LED 的阳极作为公共端(COM) 连起来,接高电平,通常接电源(如+5V )。通过控制每一 个LED 的阴极电平使其发光或熄灭,阴极为低电平时LED 发光,为高电平时 LED熄灭。: B7 e, f7 z# P6 D
6 q7 d0 R( e8 [3 H! |
如下图( f: K7 Q% u! U& p& s) n% F
8 c3 e# c5 V# K" D3 x! e) V7 \
c5a6bf63ee9247ec8fc75c99cb9b856b.jpg
2 ^0 w% j' x# i9 ?3 N
# [) f6 c$ G, c; W# Z# ` f51d5de3e4be4e2c9fac3fee15a90f74.jpg + `9 E/ {& ?/ ~5 o6 D, x

0 N' Z7 @" O5 S  R1 P我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下. ~* h& m; m6 P9 Y. Y' |

' Y3 v  o# Q- C2 T a13ad5e8585849269a282c8547c96e16.jpg
) H* D  g0 v+ Q fc2f9ece545b49ff92a7f86093186183.jpg
  r$ H7 R+ f* g' {2 o# G, [' X3 D0 W0 q; E- n8 b' k1 y  {
以此列表可以看出,对于同一个字符,共阴极和共阳极的字形码是相反的
6 y( T. t4 J- N) H; `
& {$ o3 `% K0 b; S6 j* c( F) L& `二 程序的实现
" k* W* s( l; t" O* }# E( t
5 x7 m2 v" m! ^& B/ {  Y数码管静态显示电路图
8 k9 h& @' |/ N; \9 O
2 n/ }7 l+ y0 h5 F* h: m cdf72a536b1e4bdfaf5501c650c29559.jpg
  V5 h& ^0 N# o7 v' B8 G+ P
4 x; B- R4 p6 }$ W$ M! [ 代码实现数码管也有两种方式
6 j6 D: U' d5 e" B8 e
3 @, H4 n3 Y  Q  T, p; Z一如上电路图,亮两个数码管7 y: l' Q) k4 g% N( a9 n

% r8 C0 g1 n! m# Q7 M1 }
  1. #include "stm32f10x.h"9 e5 X2 y) m& b* o$ t
  2. //定义0~9十个数字的字形码表9 }7 F- A! W7 m4 y& L
  3. uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};
    4 o( V" f2 d% d
  4. uint16_t disp[2];
    + P8 k5 P. y% D) }- j$ ?
  5. uint16_t temp,i;
    ' K1 Y5 K" S+ N; h' G4 i" q/ g
  6. $ L. e% ^0 g( b7 _7 Z) h
  7. void Delay(unsigned int count)               //延时函数' u0 b) I6 C7 E: _/ s0 Q$ X/ P
  8. {
    : d  W. V& o3 R% g, N
  9.     unsigned int i;
    ! W7 B' f. R) H1 `9 C9 f* L
  10.     for(;count!=0;count--)8 Z  W- o3 a/ X/ s; x- [/ ~8 `) W
  11.     {; y4 U# n8 H. p
  12.         i=5000;
    * ]& P7 r) T9 z6 j% S1 z
  13.         while(i--);
    ) t& U5 f8 q* X" Q3 ~0 `
  14.     }& q5 r+ f) `  S+ P! ]5 ~
  15. }" o$ C6 A; ~3 x4 G' e
  16. void main(void)
    * Y$ t2 E& g' G2 `- J% o+ x% E
  17. {
    % M9 K4 P9 o/ R2 _9 O
  18.                 GPIO_InitTypeDef GPIO_InitStructure;
    5 G. S5 N" b6 ]" t
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                 //使能GPIOB时钟, {% l9 H3 |( |6 a' p0 ~4 h* I9 H) Z3 @
  20.                 GPIO_InitStructure.GPIO_Pin = 0xffff;                       //PC0-PC15引脚配置6 t, {4 u; K0 {5 E! \* U. z! }
  21.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //配置引脚为推挽输出
    & l, u9 p, D6 ?# `$ R+ Y" i
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //GPIOB速度为50MHz# }, x1 j2 O  y) o
  23.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                      //初始化PC0-PC15
    $ n9 h1 m  s. j1 e
  24.         while(1)               
    - \; F% z  E* z! a( N4 b
  25.         {4 @2 v2 U1 o" I- m- L
  26.             for(i=0;i<=20;i++)  Y8 F, k( Y. Z3 I! e  l  m
  27.             {$ l# j4 u* ^% \$ |' A! Z
  28.               disp[1] = table[i/10];              //数码管显示十位数字的字形码
    ! v- u, O  e' E0 ?
  29.               disp[0] = table[i%10];              //数码管显示个位数字的字形码
    4 r& y) p1 w/ n/ S: _
  30.               //十位数的字形码左移8位,然后与各位数的字形码合并/ t9 t; Z) S! {' j5 ~3 @
  31.               temp = (disp[1]<<8)|(disp[0]&0x0ff);
    ; C# p6 H* U: C- {' Q; m6 }! J& ?0 d
  32.               GPIO_Write(GPIOC,temp);5 Y" U8 A+ _" w' N
  33.               Delay(100);/ t4 R* w/ n6 \
  34.             }                                 
    " x3 r5 j$ N- l+ w9 Q4 N. R) _* T- o
  35.         }& \- q( t/ b6 T9 R7 ]5 E
  36. $ A: R7 D) I8 X' [7 J
  37. }
    0 ?2 ^0 n+ b* b8 y/ ?( U
复制代码
* j; i2 \2 O+ Q  |! t
代码说明:+ D3 t  j# i  p* a# c( H( {7 {
9 t& u6 N- X. b) f
(1)语句"GPIO_InitStructure.GP1O_ Pin = Oxfff:” 用来配置 PCO~PC15 引1脚。为什么使用Oxfit)参数就可以配置 PCO-PC15引1脚呢?可以参考stm32110x_gpio.h 头对 GPIO Pin_x的定义。
+ |! i" f, x* i6 G/ D1 [4 e+ X(2)disp1数组存放数码管将显示十位和个位数字的字形码,是经常用到的显示缓冲区。5 l1 S( y7 ], p: a# x$ G! b

5 I3 v( Z% y/ V" B# O(3)语句"temp = (disp[1]<<8)|(disp[0]&0x0ff);” 的作用:disp[1]<<8是把显示十位数字的字形码左移8 位(移到高 8位),disp[0]&0x0ff 是保留低8位,其他位清零(高8 位清零),然后把高8位(十位)和低8 位(个位)合并,完成循环显示 0-20字形码的显示效果。
* f- g# s  O5 |/ m& l+ w) P9 r6 N4 Z$ u/ f& ~1 I
二 第二种代码实现的方法
, Y& i8 U/ g  }* ?1 U4 x2 t+ J2 ?7 {* T5 b. n. d7 A2 i
  1. //头文件
    $ K! v; Z- f+ m3 `/ E
  2. #include "stm32f10x.h"
    . W) o) d1 d; K+ c  r/ `
  3. #include "GPIOLIKE51.h"        % R  @7 f( ^- g

  4. 5 z+ B. y2 J  y: D- D6 U

  5. 1 r8 J4 W, ?/ q* |, s; ^3 U# z
  6. #define CLK  PBout(8)
    1 Z8 R) C' {; W" ~1 \
  7. #define DAT  PBout(9)
    5 `# C! w: J/ r/ [; \$ Z
  8. #define W1   PBout(4): ]9 r3 E* M' r& V& Z7 E6 g
  9. #define W2   PBout(5)6 w5 v; \7 W: X0 Z2 @# P, q7 y
  10. #define W3   PBout(6)
    # w) ~3 V, a9 ~9 y1 z
  11. #define W4   PBout(7)' ?* y5 l. p  S

  12. , t! {4 ]) r0 e4 P7 Y6 V' v
  13. : ~0 |+ I2 I% q; c+ J' m- B" Z, u
  14. //函数声明! h5 H' G( B* i# @) P: i
  15. void GPIO_Configuration(void);
    . u% H$ G8 W% h8 d) E

  16. ) D' j, `; O! C3 x7 ^
  17. void delay(int m)   $ u* A) [$ K6 L" ^+ {
  18. {
    ) }5 x3 b! r! X- P
  19.    int i,j;
    6 q3 I* p3 Y( H. m# `' ^
  20.    for(i=0;i<m;i++)
    5 k% W$ Y# F' l3 |
  21.       for(j=0;j<1000;j++);
    # Q/ x- r+ {0 u; W" f
  22. }
    + W1 q: o% \% f9 a% {4 R7 q

  23. 8 K2 v3 p2 W8 Z! G
  24. void Delay(uint32_t nCount)           //延时函数
    - K4 F. L. Z; T. K1 ~, v! W
  25. {
    # z% C. G. G0 B( V
  26.   for(; nCount != 0; nCount--);           //函数说明:nCount:延时长短
    8 P* `" m2 b) I  q$ b9 W* p0 y
  27. }
    ! j. V0 e, L% t; Y9 P' Y

  28. % \5 a. b' o" g' ?, g7 r9 b/ O& k
  29. void Smginit(void)                  //定义数码管,进行配置: k1 K! x1 Q1 b- M7 a1 d. u" x' [
  30. {
    & `5 x5 h! K; h) }' Y1 @6 g9 t' _
  31.     GPIO_InitTypeDef GPIO_InitStructure;
    " }; i: D5 W7 H5 P5 K, d: g
  32.         
    4 U' G4 w  y( Q0 r& A
  33.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);         
    4 J5 ?; S5 \/ s/ L& k9 W0 X
  34.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);            0 F# V3 S3 S0 o. c
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    9 `! i$ i9 [. {) N* Q
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    6 t0 B& p2 {: ~! \
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    7 I4 R+ I  y. C: s. F% T
  38.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    9 f3 N( v+ p3 ^6 r
  39.         
    ! V. @. K9 [* h) l8 R
  40.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);                 / q3 b* q% ?& v( a/ h4 _6 X5 s+ m
  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | % g5 T! k/ o$ Q3 E$ \: S# e6 ]- s
  42.                                    GPIO_Pin_8 | GPIO_Pin_9; 2 P! r: K6 F( t* d6 p3 u
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. v  K* [: @2 P, m: W
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    4 a% D8 T* H$ k: Z# r. M. I
  45.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    : `, Z5 P  R" H$ i- t' \
  46. / |! d' y& q6 `  |7 N( h/ i
  47. }
    3 z5 v% B& V% y' }0 o1 J
  48. 3 J0 l) d- p: B; U* U, n
  49. //定义字形码
    9 K0 E2 y% e. K! j8 R
  50. unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    / t' g3 t! E( Q, C1 i, v2 d
  51. ; N% _& D8 T' i, F6 S; z
  52. void Disled(int m)  3 t; k/ ?1 w3 T' x, l- \: \
  53. {
    9 l4 ^- s: I4 \
  54.    int i;
    + R  M5 J' D. V/ Q) z  G( s% S9 o
  55.    CLK=0;  ' V- F+ g* b% X) P: _/ M; S
  56.    for(i=0;i<8;i++)
    + a# W: Z8 d5 h1 f* L) ?
  57.    {, X0 z7 l& m6 W; S4 L5 K
  58.       CLK=0; 2 {. ?4 ~, D* I8 a& h  Z
  59.           delay(1);5 ?4 K9 `- }9 r, V8 Q+ g" @8 R
  60.       if (m&0x80)
    . J+ M  f7 [+ T% i* B' S4 U2 n
  61.       DAT=1;
    ( }5 |' ~  T) ?  p7 Z3 C: R
  62.       else+ u, O# ~1 D6 A- h# M
  63.       DAT=0;  ?+ s" K8 s  {1 i% G2 l
  64.       CLK=1;
    . s1 [+ P# _, ^  F, `  C
  65.           delay(1);
    3 f" x" q( T, C
  66.       m=m<<1; 0 m% ?9 i; q2 @9 _
  67.    }
    & p% d; e$ |& G- F% y1 w+ v* f( V
  68. }" G$ V1 j9 |* q4 N. M2 X/ F8 P
  69. + X% X6 }; i1 I" P  S& T
  70. int main(void)/ n7 r2 s1 ~, {
  71. {+ R) ?" g4 E+ C/ H6 \
  72.           int i;
    ' U' ^+ q" K- R0 m
  73.           Smginit();5 W# }3 n* j5 p: ~2 g
  74.           W1=1;            . b  ~) f- k' \- p9 K
  75.           W2=1;
    $ B' ]5 Y/ q7 ?- y8 R2 n' ^
  76.           W3=1;
    ' H: ?- n0 T& S' K0 U7 X( i
  77.           W4=1;& E* b: K3 f: Y" y
  78.     while (1)
    0 u- O4 `% ?1 r2 J2 Z
  79.                 {2 ~# H9 [! I- R8 D" V9 ?7 g8 A2 `
  80.                         for(i=0;i<10;i++)
    2 k& h$ G+ D6 H6 q0 `  ~
  81.                         {9 u+ @/ I8 N( d2 h  ^" Y
  82.                          Disled(code<i>);
    ! v! Z8 L# w) `
  83.                          delay(10000);: e( A* M  g9 g, T9 e
  84.                         }
    + ]1 M& {* A: \' f" J7 x
  85.     }0 [% d/ e2 L  [
  86. }</i>
复制代码
: X+ {# W" E- O
代码说明:$ Z  l& X: E" h% [  y, y
7 I4 Z1 [/ u8 @; j
(1)这个程序是电亮4个数码管。
# x) K# ^$ q9 ~0 M: E  m- `; U: \, \: s! E5 \" d1 Q; \
(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件
7 g/ l1 @2 ~2 _1 U! ?* a. ~2 c- N
(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。
- I/ _$ j9 X5 |6 K; }3 K% U* A4 M. W4 j( N* u

. U, G! ^) q5 S, Q/ X# K4 Q- q4 g& k( C& v; R
赞 收藏 评论0 发布时间:2022-5-25 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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