一 认识二级管- 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
+ C; {" P, C! ^7 a8 u: z0 R2 P
# s5 d P5 |2 A1 e S
7 q1 f0 H. L; ~ j
* Z, j" F, ~& q6 h8 @
我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下
" Y0 j3 e% G' K+ I7 u( n' n# `/ k" q6 M
( L4 ~9 {, x' R3 ^- y5 D" d
$ 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
- 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- #include "stm32f10x.h"
9 y% K% ~7 B4 R' e6 s' p - //定义0~9十个数字的字形码表
. l: p, F. |* m$ o z, H0 A: S - uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};# e( z* y0 f' h9 _+ J5 d/ s9 F, ~8 V# W
- uint16_t disp[2];5 E+ w' Q8 P+ R6 o& W; N
- uint16_t temp,i;
' D) i3 u. Y6 U# b2 x - ( r' `/ {3 ?* L! N# p/ _' W+ f `
- void Delay(unsigned int count) //延时函数
" n2 z+ m, ] E h, {% j - {) u. s& j' p# H i6 l% D$ W
- unsigned int i;$ {) a" t+ K$ z1 C. k
- for(;count!=0;count--)- X6 C Q- `9 Z% R( Y
- {
9 w* J$ q+ f# i8 L* U! o3 C* I- k - i=5000;9 s" G3 n7 H& {6 m3 v
- while(i--);5 e( [( R/ a9 f2 E4 h% f
- }9 E: d$ O( z5 S
- }9 p0 g3 I v6 b# D% P# m; |5 t
- void main(void)) i3 S6 q" N" r
- {
9 r3 S v% Z, u8 ] - GPIO_InitTypeDef GPIO_InitStructure;
1 D3 r6 j2 P2 v: z - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
9 }$ o" M: p) i; b g7 z - GPIO_InitStructure.GPIO_Pin = 0xffff; //PC0-PC15引脚配置
/ g3 j7 Z) ~$ m6 U2 e - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出6 Y7 Y7 C1 d! B
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
: D( ]& g' [2 p# _7 b( ~ - GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PC0-PC15
8 n/ h& j+ s2 f. R1 [ - while(1) 0 e) j, m: C2 D/ @
- {
0 Q4 Y- j/ O1 j1 H3 R& Z+ r$ k0 U - for(i=0;i<=20;i++)
0 Y9 B- a% G. e$ Z2 [& s+ n - {
@5 t2 |! p& I2 f, W4 \ - disp[1] = table[i/10]; //数码管显示十位数字的字形码/ s9 E# M x" L7 g* W
- disp[0] = table[i%10]; //数码管显示个位数字的字形码6 ?) S- i6 Y6 K8 b8 o
- //十位数的字形码左移8位,然后与各位数的字形码合并% D2 P+ M1 j5 W/ h& U
- temp = (disp[1]<<8)|(disp[0]&0x0ff);
& J% m( |+ c9 i# V - GPIO_Write(GPIOC,temp);3 m7 |& M+ N2 O# b# h% ]
- Delay(100);
]0 M+ E7 Y G - } 1 ?: m8 T$ s- F; A) U) o9 q
- }
7 A' F2 ^5 f% h
( S4 w% V8 F7 D' u) K4 C7 S. F- }. ~: 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
- //头文件
- S- d+ U5 J+ i - #include "stm32f10x.h"- A! w1 f0 a5 H& }' w3 Q
- #include "GPIOLIKE51.h" * I% W! F" H, P: {+ `& i
1 D1 _5 o A8 a2 [- : P' Q* J- k$ c6 j% h2 z# }3 c3 r$ c
- #define CLK PBout(8)
' e w, \0 D, t - #define DAT PBout(9)
5 {! I s" L" c - #define W1 PBout(4)% m' a; I; t# ~& e7 y: b
- #define W2 PBout(5)
q! S7 T& H. F+ o5 ~7 _ - #define W3 PBout(6)
0 G& r8 p0 T. r9 S8 A; R - #define W4 PBout(7)
7 R0 u: F/ H: w6 f& p' R& {) r
* Y+ ?9 {5 z* x% ]/ \$ k5 L
6 Q# n( W! H# R6 o- //函数声明 ?% X/ \% \& @; A% U
- void GPIO_Configuration(void);
# R2 S1 b. b+ `- H3 M) ] - : Z5 H* g% }2 q% m, k9 ^" ^
- void delay(int m)
" {' M0 W) l( v: o - {) Y" E7 W# _' W3 U
- int i,j;1 V' D+ D* t# _3 O) p7 P
- for(i=0;i<m;i++)- M9 I5 Y" f, [! m! T& @; X3 i1 h
- for(j=0;j<1000;j++);4 K- q n5 m3 L; w+ p
- }
0 K, ?% A9 }$ Y! ^2 C D7 r
' v) Q- N3 g9 s& p" l6 g) T* X4 T- void Delay(uint32_t nCount) //延时函数7 W' }- C2 E4 K
- {7 f; l2 {; d+ \1 Q4 C# x% {1 W/ }
- for(; nCount != 0; nCount--); //函数说明:nCount:延时长短5 t( R r) U s2 H r& w
- }7 X$ m$ Q& Y+ z
- 1 T, \/ Y( u! T- @% F$ b! I( T
- void Smginit(void) //定义数码管,进行配置. m7 G/ d. W+ ?8 i4 u
- {3 L1 ?/ q. V6 Z) A) A
- GPIO_InitTypeDef GPIO_InitStructure;5 `# T9 d. Z3 O" ~7 @3 F6 Z
- / Z, O- p8 ^1 u& _0 ^5 m/ L
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
. J$ U0 X O2 F5 b' z0 w- J2 H - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 8 K7 s* j( a: B5 @( i2 Q) E1 F% M
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;! \3 z2 o/ P; `' _9 o$ b. d
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
8 `/ T) G5 B' c. Z - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; % ~9 `7 ?# P/ @6 v; `6 _5 s
- GPIO_Init(GPIOB, &GPIO_InitStructure);8 u9 Z9 Q) J8 B3 q" Z
- ( `( P: P# d- f+ D
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
8 u* k5 Z Q( g; U1 v - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
4 {' m% X( H% I7 x9 B - GPIO_Pin_8 | GPIO_Pin_9; & S& U$ C# M, I/ a- l
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
' ]+ ^0 f) ]# O8 n, z5 U - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; " w0 z0 ?. Q6 u' N% W9 l' i
- GPIO_Init(GPIOB, &GPIO_InitStructure);6 y1 f" J9 z# {
- : t8 q/ h: Y0 N) a
- }
- v0 O* |- S( B7 [
) | `* [0 |/ N( h- //定义字形码4 i8 A& ^0 P5 r
- unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};+ r0 ~2 ^9 s% E
7 _$ d+ M& S! ?. Z. O9 k; b- A- void Disled(int m) 6 C$ W' W7 Y; d# z* u
- {
/ r4 t! Y/ f: L8 C7 w$ e/ |" J - int i;
) `# L8 }/ G) |8 S2 h - CLK=0;
) W$ D( i0 r$ V: O - for(i=0;i<8;i++)8 y, e0 w+ b7 r" G- A
- {
0 ^# f% J- A' |& {3 |4 V. p% F - CLK=0; , R) J: M2 M6 d; ~- U4 o5 }8 m
- delay(1);& b, @$ S4 i, g) P; B
- if (m&0x80) $ {( x7 H4 l \! H6 Y1 k2 u
- DAT=1;
& _" p8 }# W0 u* s - else. [4 o" f& f; @
- DAT=0;0 N- p4 X; a" ?3 @& B }
- CLK=1; - p) j+ H: F' k6 Y, t
- delay(1);
. d& P, R, a4 N3 N - m=m<<1; # @( F g/ o+ M3 P
- }1 o3 U7 B: \1 s q" g' f% v2 ~
- }
# c; f+ k T- R @ - 1 y" t# i. E6 H" I$ ]& @: \& k
- int main(void)1 W c. t! M O
- {
* [/ A% j0 a8 i: R: n8 X - int i;% h; M6 h- x6 T+ a+ z' J
- Smginit();
9 d& E" [5 g7 [! Z) ]: j$ T0 L - W1=1; # [: H* x7 R# s9 D' F" B, q
- W2=1;
" S8 i- B8 g n y, m3 U - W3=1;% h& l2 T) t( H# K W
- W4=1;
; m* }% F" |: U( e - while (1)4 b7 |2 I' E) {
- {% j0 p* P5 Z( m, h( Q
- for(i=0;i<10;i++)
* a7 J: Z0 ^% ]5 `* B% m, v/ A0 U* w$ ~ - {
1 T! ~9 h$ c1 O" X - Disled(code<i>);4 o2 [& ]: D, \+ w% A+ g- Y
- delay(10000);
9 _( e* ]3 V1 E - } q$ C& r, L& ^
- }
* [2 F* O6 p0 j8 [ - }</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 |