一 认识二级管
; 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 \
2 ^0 w% j' x# i9 ?3 N
# [) f6 c$ G, c; W# Z# `
+ `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
) H* D g0 v+ Q
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
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 }- #include "stm32f10x.h"9 e5 X2 y) m& b* o$ t
- //定义0~9十个数字的字形码表9 }7 F- A! W7 m4 y& L
- uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};
4 o( V" f2 d% d - uint16_t disp[2];
+ P8 k5 P. y% D) }- j$ ? - uint16_t temp,i;
' K1 Y5 K" S+ N; h' G4 i" q/ g - $ L. e% ^0 g( b7 _7 Z) h
- void Delay(unsigned int count) //延时函数' u0 b) I6 C7 E: _/ s0 Q$ X/ P
- {
: d W. V& o3 R% g, N - unsigned int i;
! W7 B' f. R) H1 `9 C9 f* L - for(;count!=0;count--)8 Z W- o3 a/ X/ s; x- [/ ~8 `) W
- {; y4 U# n8 H. p
- i=5000;
* ]& P7 r) T9 z6 j% S1 z - while(i--);
) t& U5 f8 q* X" Q3 ~0 ` - }& q5 r+ f) ` S+ P! ]5 ~
- }" o$ C6 A; ~3 x4 G' e
- void main(void)
* Y$ t2 E& g' G2 `- J% o+ x% E - {
% M9 K4 P9 o/ R2 _9 O - GPIO_InitTypeDef GPIO_InitStructure;
5 G. S5 N" b6 ]" t - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟, {% l9 H3 |( |6 a' p0 ~4 h* I9 H) Z3 @
- GPIO_InitStructure.GPIO_Pin = 0xffff; //PC0-PC15引脚配置6 t, {4 u; K0 {5 E! \* U. z! }
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出
& l, u9 p, D6 ?# `$ R+ Y" i - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz# }, x1 j2 O y) o
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PC0-PC15
$ n9 h1 m s. j1 e - while(1)
- \; F% z E* z! a( N4 b - {4 @2 v2 U1 o" I- m- L
- for(i=0;i<=20;i++) Y8 F, k( Y. Z3 I! e l m
- {$ l# j4 u* ^% \$ |' A! Z
- disp[1] = table[i/10]; //数码管显示十位数字的字形码
! v- u, O e' E0 ? - disp[0] = table[i%10]; //数码管显示个位数字的字形码
4 r& y) p1 w/ n/ S: _ - //十位数的字形码左移8位,然后与各位数的字形码合并/ t9 t; Z) S! {' j5 ~3 @
- temp = (disp[1]<<8)|(disp[0]&0x0ff);
; C# p6 H* U: C- {' Q; m6 }! J& ?0 d - GPIO_Write(GPIOC,temp);5 Y" U8 A+ _" w' N
- Delay(100);/ t4 R* w/ n6 \
- }
" x3 r5 j$ N- l+ w9 Q4 N. R) _* T- o - }& \- q( t/ b6 T9 R7 ]5 E
- $ A: R7 D) I8 X' [7 J
- }
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
- //头文件
$ K! v; Z- f+ m3 `/ E - #include "stm32f10x.h"
. W) o) d1 d; K+ c r/ ` - #include "GPIOLIKE51.h" % R @7 f( ^- g
5 z+ B. y2 J y: D- D6 U
1 r8 J4 W, ?/ q* |, s; ^3 U# z- #define CLK PBout(8)
1 Z8 R) C' {; W" ~1 \ - #define DAT PBout(9)
5 `# C! w: J/ r/ [; \$ Z - #define W1 PBout(4): ]9 r3 E* M' r& V& Z7 E6 g
- #define W2 PBout(5)6 w5 v; \7 W: X0 Z2 @# P, q7 y
- #define W3 PBout(6)
# w) ~3 V, a9 ~9 y1 z - #define W4 PBout(7)' ?* y5 l. p S
, t! {4 ]) r0 e4 P7 Y6 V' v- : ~0 |+ I2 I% q; c+ J' m- B" Z, u
- //函数声明! h5 H' G( B* i# @) P: i
- void GPIO_Configuration(void);
. u% H$ G8 W% h8 d) E
) D' j, `; O! C3 x7 ^- void delay(int m) $ u* A) [$ K6 L" ^+ {
- {
) }5 x3 b! r! X- P - int i,j;
6 q3 I* p3 Y( H. m# `' ^ - for(i=0;i<m;i++)
5 k% W$ Y# F' l3 | - for(j=0;j<1000;j++);
# Q/ x- r+ {0 u; W" f - }
+ W1 q: o% \% f9 a% {4 R7 q
8 K2 v3 p2 W8 Z! G- void Delay(uint32_t nCount) //延时函数
- K4 F. L. Z; T. K1 ~, v! W - {
# z% C. G. G0 B( V - for(; nCount != 0; nCount--); //函数说明:nCount:延时长短
8 P* `" m2 b) I q$ b9 W* p0 y - }
! j. V0 e, L% t; Y9 P' Y
% \5 a. b' o" g' ?, g7 r9 b/ O& k- void Smginit(void) //定义数码管,进行配置: k1 K! x1 Q1 b- M7 a1 d. u" x' [
- {
& `5 x5 h! K; h) }' Y1 @6 g9 t' _ - GPIO_InitTypeDef GPIO_InitStructure;
" }; i: D5 W7 H5 P5 K, d: g -
4 U' G4 w y( Q0 r& A - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
4 J5 ?; S5 \/ s/ L& k9 W0 X - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 0 F# V3 S3 S0 o. c
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
9 `! i$ i9 [. {) N* Q - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6 t0 B& p2 {: ~! \ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
7 I4 R+ I y. C: s. F% T - GPIO_Init(GPIOB, &GPIO_InitStructure);
9 f3 N( v+ p3 ^6 r -
! V. @. K9 [* h) l8 R - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); / q3 b* q% ?& v( a/ h4 _6 X5 s+ m
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | % g5 T! k/ o$ Q3 E$ \: S# e6 ]- s
- GPIO_Pin_8 | GPIO_Pin_9; 2 P! r: K6 F( t* d6 p3 u
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. v K* [: @2 P, m: W
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
4 a% D8 T* H$ k: Z# r. M. I - GPIO_Init(GPIOB, &GPIO_InitStructure);
: `, Z5 P R" H$ i- t' \ - / |! d' y& q6 ` |7 N( h/ i
- }
3 z5 v% B& V% y' }0 o1 J - 3 J0 l) d- p: B; U* U, n
- //定义字形码
9 K0 E2 y% e. K! j8 R - unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/ t' g3 t! E( Q, C1 i, v2 d - ; N% _& D8 T' i, F6 S; z
- void Disled(int m) 3 t; k/ ?1 w3 T' x, l- \: \
- {
9 l4 ^- s: I4 \ - int i;
+ R M5 J' D. V/ Q) z G( s% S9 o - CLK=0; ' V- F+ g* b% X) P: _/ M; S
- for(i=0;i<8;i++)
+ a# W: Z8 d5 h1 f* L) ? - {, X0 z7 l& m6 W; S4 L5 K
- CLK=0; 2 {. ?4 ~, D* I8 a& h Z
- delay(1);5 ?4 K9 `- }9 r, V8 Q+ g" @8 R
- if (m&0x80)
. J+ M f7 [+ T% i* B' S4 U2 n - DAT=1;
( }5 |' ~ T) ? p7 Z3 C: R - else+ u, O# ~1 D6 A- h# M
- DAT=0; ?+ s" K8 s {1 i% G2 l
- CLK=1;
. s1 [+ P# _, ^ F, ` C - delay(1);
3 f" x" q( T, C - m=m<<1; 0 m% ?9 i; q2 @9 _
- }
& p% d; e$ |& G- F% y1 w+ v* f( V - }" G$ V1 j9 |* q4 N. M2 X/ F8 P
- + X% X6 }; i1 I" P S& T
- int main(void)/ n7 r2 s1 ~, {
- {+ R) ?" g4 E+ C/ H6 \
- int i;
' U' ^+ q" K- R0 m - Smginit();5 W# }3 n* j5 p: ~2 g
- W1=1; . b ~) f- k' \- p9 K
- W2=1;
$ B' ]5 Y/ q7 ?- y8 R2 n' ^ - W3=1;
' H: ?- n0 T& S' K0 U7 X( i - W4=1;& E* b: K3 f: Y" y
- while (1)
0 u- O4 `% ?1 r2 J2 Z - {2 ~# H9 [! I- R8 D" V9 ?7 g8 A2 `
- for(i=0;i<10;i++)
2 k& h$ G+ D6 H6 q0 ` ~ - {9 u+ @/ I8 N( d2 h ^" Y
- Disled(code<i>);
! v! Z8 L# w) ` - delay(10000);: e( A* M g9 g, T9 e
- }
+ ]1 M& {* A: \' f" J7 x - }0 [% d/ e2 L [
- }</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
|