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

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

[复制链接]
STMCU小助手 发布时间:2022-5-25 18:00
一 认识二级管
# c. x4 k0 p3 Y' q% {0 g2 b
" {' w5 }, d* J常用的二级管分为两种
. C, V$ H# T& O4 v% Q* o8 A1 U* J- e2 Z% H
1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各端为低电平。9 j# h  a- u- N8 z$ u  Z. D

7 z" a+ S3 S) N' _2 P# E; W2 A2,(c)图共阳极结构:是把所有 LED 的阳极作为公共端(COM) 连起来,接高电平,通常接电源(如+5V )。通过控制每一 个LED 的阴极电平使其发光或熄灭,阴极为低电平时LED 发光,为高电平时 LED熄灭。# _+ f: K0 Z5 l4 d2 h
% o' N! D' ^+ T- W
如下图
* ]7 H5 A& ]( ?  F  ~, y. Q5 i5 h* z: e9 e! b# s) D
c5a6bf63ee9247ec8fc75c99cb9b856b.jpg 1 l( t  ]' ]# m. c6 P5 h# j( t

  l- D: j) J* ]& k' m- g0 d$ [ f51d5de3e4be4e2c9fac3fee15a90f74.jpg 5 R  q( o* I4 [+ D2 j2 j9 c
9 F, j! {; x- M
我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下0 K! l7 u8 I/ ?! W/ h4 B

; h* F' M# v/ I- l! x a13ad5e8585849269a282c8547c96e16.jpg
8 N& W4 X( B* I# [' U1 u/ r fc2f9ece545b49ff92a7f86093186183.jpg & `% M# _; {  f2 i+ t. z; R, N' W
/ F6 g, ?4 s& K( I2 Y: H
以此列表可以看出,对于同一个字符,共阴极和共阳极的字形码是相反的5 @4 W/ {& [- ]3 b
9 f; h5 f2 g  f: f; Y
二 程序的实现. I, W& g' d% b* t) V
) X8 K4 d- U2 S$ k: v
数码管静态显示电路图
: ]# h; d( P1 q2 G* A5 j( K- P9 X+ m# i# {% {+ d
cdf72a536b1e4bdfaf5501c650c29559.jpg
. ]3 o/ D- @- C, g1 J% p# R* {( k) l. d) u- T
代码实现数码管也有两种方式" q2 j3 |0 `3 K' Y+ r* g) u

% g, [$ |; `. X一如上电路图,亮两个数码管, {" x7 J# ~9 S+ I$ e: T' |
) ]6 e/ q: ]4 Q) `( I, w1 B
  1. #include "stm32f10x.h"
    2 q" \- d0 k: }% ~$ Q# N* m
  2. //定义0~9十个数字的字形码表
    $ m/ t6 |' V9 }) y$ v4 e
  3. uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};' K; `1 T+ P# y4 a
  4. uint16_t disp[2];
    ( x  S4 Y0 H- |: Q& x0 a
  5. uint16_t temp,i;6 e% x: Z3 ~! n* m2 z

  6. 8 ?1 Y! H! U% ^& B
  7. void Delay(unsigned int count)               //延时函数) t& _3 u7 u5 h$ T$ a; ?2 d
  8. {
    8 F0 |. z  t% [! h. j2 y8 \9 Y
  9.     unsigned int i;* \4 ~5 V/ R+ l; ^; a
  10.     for(;count!=0;count--)
    3 ~, _- z' Q# R
  11.     {8 r/ B$ t7 ^: A& M/ }* \
  12.         i=5000;
    8 j3 T* M/ Z$ o- m
  13.         while(i--);
    ! t9 X( c' W: M: a
  14.     }
    & G! D4 S% Z( j, p/ h( U: F
  15. }
    5 B% T& K$ i; j  m
  16. void main(void)
    ) a* n, c! {% Z1 O# n' r7 j
  17. {# K: y8 y" s, ^$ b9 I
  18.                 GPIO_InitTypeDef GPIO_InitStructure;
    9 \+ t# t* [0 n4 P% |' v
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                 //使能GPIOB时钟
    5 x6 C1 u8 @; L/ q
  20.                 GPIO_InitStructure.GPIO_Pin = 0xffff;                       //PC0-PC15引脚配置* ?5 Y* K/ \, y8 E: m) Q1 j
  21.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //配置引脚为推挽输出$ ~9 e5 ~- s$ A/ m* q
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //GPIOB速度为50MHz
    : T2 X* M: j5 Y3 b1 u
  23.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                      //初始化PC0-PC15) H* b9 f! {3 K) |8 C
  24.         while(1)                ' C2 I- Z* d' S/ w! I9 n* Y8 X
  25.         {
    3 [; M3 W. X+ s0 G! E( i, b1 E# }
  26.             for(i=0;i<=20;i++)
    ( C+ _% L$ O/ H8 r6 X+ a
  27.             {
    # ^: x! v( X7 g: l' Q6 B
  28.               disp[1] = table[i/10];              //数码管显示十位数字的字形码
    * y  m! |2 _  R- V, D) E, ?2 D% r
  29.               disp[0] = table[i%10];              //数码管显示个位数字的字形码4 ^& K' n' b2 J- C2 p
  30.               //十位数的字形码左移8位,然后与各位数的字形码合并
    : F$ r9 A* i* F6 s, d4 C& C
  31.               temp = (disp[1]<<8)|(disp[0]&0x0ff);
    1 E- c; `' X9 ?- A1 i* T
  32.               GPIO_Write(GPIOC,temp);
    * @% m. @" H8 F' y
  33.               Delay(100);
    : \: p# I5 O( t( E8 |
  34.             }                                 
    ' R' k; D+ g; n4 E; N) `
  35.         }& g: v+ Q+ R. _$ c( ^! J

  36. / \" H9 W  j& z* f
  37. }* w2 U. F& C0 s; Q: i* g' X
复制代码
( C9 q5 K' Z# k1 V7 ?; `, W: m
代码说明:4 ~' i0 m% ^' D7 y
% Q7 U' S: i8 g( l, T) U
(1)语句"GPIO_InitStructure.GP1O_ Pin = Oxfff:” 用来配置 PCO~PC15 引1脚。为什么使用Oxfit)参数就可以配置 PCO-PC15引1脚呢?可以参考stm32110x_gpio.h 头对 GPIO Pin_x的定义。
9 ~4 C' v( h( _4 Y(2)disp1数组存放数码管将显示十位和个位数字的字形码,是经常用到的显示缓冲区。* D$ y+ I  C+ ]# p4 _7 B

4 q) g% D- E6 Y(3)语句"temp = (disp[1]<<8)|(disp[0]&0x0ff);” 的作用:disp[1]<<8是把显示十位数字的字形码左移8 位(移到高 8位),disp[0]&0x0ff 是保留低8位,其他位清零(高8 位清零),然后把高8位(十位)和低8 位(个位)合并,完成循环显示 0-20字形码的显示效果。
0 [+ b3 R) A! x; G1 \8 C9 Y5 H- \8 p! q8 E
二 第二种代码实现的方法
3 D+ i: a1 y+ `- T; }+ K) @& A+ |# P( b' [3 k6 [1 q+ }$ [- l
  1. //头文件$ B  s1 Q+ b6 {6 Q$ o; d7 r
  2. #include "stm32f10x.h"/ K: j3 u9 r/ k# E. p* h
  3. #include "GPIOLIKE51.h"        6 p5 B7 c! I& j: ^
  4. 2 g  n8 s4 ~: Q( u6 P% x
  5. 5 g% m) L8 C3 E8 v
  6. #define CLK  PBout(8)
    ! ?# u: g% U0 }1 ]. `; d
  7. #define DAT  PBout(9)
    ! E& e0 k# V: e) j" X" r  f
  8. #define W1   PBout(4)$ G" O( d! {- S) s6 s
  9. #define W2   PBout(5)
    0 A( T- I' y' |1 V& D. {( z  d
  10. #define W3   PBout(6)
    3 F5 L  {) H0 n
  11. #define W4   PBout(7)- q$ L' L/ N& A0 r- P7 Y' A/ y
  12. 9 v: I/ C  L# S# M5 q4 L

  13. 9 H5 P- B& t1 h* s* h
  14. //函数声明1 q- b# O6 }9 t/ U9 }
  15. void GPIO_Configuration(void);. k, ]# w# M5 g0 @8 w5 I/ C
  16. 1 q7 a3 f) w  m3 B$ h
  17. void delay(int m)   ) C4 d) m7 Q$ `% ^# H1 ]7 P- T, G2 Q3 E
  18. {
    & y. }* g7 r, ]! G& N5 d
  19.    int i,j;7 v+ n9 S" l0 t& e9 ~- z
  20.    for(i=0;i<m;i++)/ ^4 e- N2 A. u& }2 }0 |! f
  21.       for(j=0;j<1000;j++);5 l7 T* ]. z& ^) C
  22. }
    $ E6 @. b* n9 r3 G1 t
  23. " i% i+ l) R" O% c. K
  24. void Delay(uint32_t nCount)           //延时函数
    * ]) S  f9 G+ p+ q+ W. q
  25. {' |  O. o. p. X
  26.   for(; nCount != 0; nCount--);           //函数说明:nCount:延时长短
    3 ?9 w" N' b! N! o) T# u6 P  ^1 {# ?
  27. }
    5 R% A2 R: ^  J

  28. ! S2 j% t. B6 H/ _7 ^
  29. void Smginit(void)                  //定义数码管,进行配置4 v# ^" a( \; A3 T7 }; n
  30. {; M/ m, i) N3 o
  31.     GPIO_InitTypeDef GPIO_InitStructure;# f. V2 _/ d3 U" a& a9 r
  32.           [/ R# z: a, S9 m  E1 q
  33.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);         
    9 [! m0 ?: @5 Q' z( g% M% L6 E
  34.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);            
    + R- M; V( q5 y3 A  p
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    & S5 u* H5 q" A( Y; }% |: U
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    , ]3 X" G8 _/ f( {5 A$ i- N- H
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    # l1 P& `8 K* }2 S
  38.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    8 d0 u. t; a( c2 |' L
  39.         
    - J7 g5 b1 T& W3 r0 e( C3 t
  40.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);                 7 Q' E( J' [5 \- S5 t
  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
    , U9 I2 q: J( j0 j
  42.                                    GPIO_Pin_8 | GPIO_Pin_9; * P4 e( N8 j7 [" T$ {+ e! [
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ; Z; S: ]- Y7 s2 T
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ( G+ H1 [/ Y9 s) x: j: v  f
  45.         GPIO_Init(GPIOB, &GPIO_InitStructure);, z( }0 ]8 ]" Y3 g# p& @9 Q

  46. 8 B8 e2 F1 g3 ~+ G0 x, e0 L
  47. }
    * s9 r* D& R" ]% b3 A$ u" v
  48.   |1 ?8 ~8 F7 R1 x
  49. //定义字形码
    0 m  s' t# O5 O$ S+ S4 z& b
  50. unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    6 A7 z4 p* a3 g0 ~
  51. 1 ~- a$ w% X: Y2 [
  52. void Disled(int m)    y0 y2 ~  T( s8 t- d
  53. {) B- j" ~+ k+ d0 z
  54.    int i;
    0 V, _  ?* u; c4 X
  55.    CLK=0;  
    2 B% i' J( L% ]' D) l% A
  56.    for(i=0;i<8;i++). Q$ R* C$ u$ r; M3 U
  57.    {( [3 S3 E# Z! t5 L7 N) d" T
  58.       CLK=0;
    7 s9 o' D$ y2 M" v- h& k) u
  59.           delay(1);" C4 i7 L$ i$ V0 _7 V% [. T
  60.       if (m&0x80)
    . R3 B2 ~8 @" A$ I
  61.       DAT=1;7 M5 [) m/ j0 `- z, j
  62.       else* G8 A: Q  j' e* B
  63.       DAT=0;
    5 {) B4 ^5 \5 [& e9 ?4 G$ ]2 v
  64.       CLK=1;
    # s5 x$ ]/ {$ J* ]. l0 O
  65.           delay(1);
    0 u5 C) i: E9 w! G% i* `
  66.       m=m<<1;
    * g9 f7 x- U  x4 b  Q) q3 U# l
  67.    }" J* A0 W% B# r+ y
  68. }
    - K+ N/ s" W/ m  _- `8 E. c; J
  69. 0 X8 B$ n" ^! o1 A5 g8 f5 e' {
  70. int main(void)( {3 ]' i6 i2 Q( B. X
  71. {0 X; X6 S- F* |! [4 u( Q
  72.           int i;
    3 q) J/ n0 L$ s
  73.           Smginit();" T# L3 m# [( X, f
  74.           W1=1;            
    ( C+ b0 v$ q' i- B4 I/ R
  75.           W2=1;4 k) }6 @! b0 K
  76.           W3=1;- R5 F4 I/ A* e. y: D: Y
  77.           W4=1;# I. D9 l* J; y) a" X8 H
  78.     while (1)
    * a  a, Z2 |- h) w" g) b& g
  79.                 {
    & ~0 {" O) w/ {  f% s% V$ B
  80.                         for(i=0;i<10;i++)
    * f. s8 c$ I# @- x
  81.                         {- g7 T4 I$ I7 h1 o! b
  82.                          Disled(code<i>);) J$ Y0 ]5 b9 {# a3 W' U
  83.                          delay(10000);
    : }& E" l6 {- j
  84.                         }
    ) F& X7 Y, l) }1 \' M8 G4 f, w# p& \$ V
  85.     }3 F8 F  `6 o; J1 T* r# l1 \
  86. }</i>
复制代码
$ o! Z  L& |" b
代码说明:
: R4 a6 p2 [$ ]: Q9 v
& e0 |& Y  s  Y% D* q9 H3 j(1)这个程序是电亮4个数码管。
$ I* W8 I$ k* |/ A- ]5 R# ?" T& S/ v1 Z2 r) J2 P
(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件
3 F% i; J. f( k4 j
" _* n& e+ z0 A1 P$ y& q(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。. @- d, D/ c' y6 m1 @6 t) w# `6 @
5 z2 L1 m; ?0 p$ \
" z# O* y  a9 X, z5 x

" d7 r1 H! K9 i) W" c
赞 收藏 评论0 发布时间:2022-5-25 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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