一 认识二级管
# 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
1 l( t ]' ]# m. c6 P5 h# j( t
l- D: j) J* ]& k' m- g0 d$ [
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
8 N& W4 X( B* I# [' U1 u/ r
& `% 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
. ]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
- #include "stm32f10x.h"
2 q" \- d0 k: }% ~$ Q# N* m - //定义0~9十个数字的字形码表
$ m/ t6 |' V9 }) y$ v4 e - uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};' K; `1 T+ P# y4 a
- uint16_t disp[2];
( x S4 Y0 H- |: Q& x0 a - uint16_t temp,i;6 e% x: Z3 ~! n* m2 z
8 ?1 Y! H! U% ^& B- void Delay(unsigned int count) //延时函数) t& _3 u7 u5 h$ T$ a; ?2 d
- {
8 F0 |. z t% [! h. j2 y8 \9 Y - unsigned int i;* \4 ~5 V/ R+ l; ^; a
- for(;count!=0;count--)
3 ~, _- z' Q# R - {8 r/ B$ t7 ^: A& M/ }* \
- i=5000;
8 j3 T* M/ Z$ o- m - while(i--);
! t9 X( c' W: M: a - }
& G! D4 S% Z( j, p/ h( U: F - }
5 B% T& K$ i; j m - void main(void)
) a* n, c! {% Z1 O# n' r7 j - {# K: y8 y" s, ^$ b9 I
- GPIO_InitTypeDef GPIO_InitStructure;
9 \+ t# t* [0 n4 P% |' v - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
5 x6 C1 u8 @; L/ q - GPIO_InitStructure.GPIO_Pin = 0xffff; //PC0-PC15引脚配置* ?5 Y* K/ \, y8 E: m) Q1 j
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出$ ~9 e5 ~- s$ A/ m* q
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
: T2 X* M: j5 Y3 b1 u - GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PC0-PC15) H* b9 f! {3 K) |8 C
- while(1) ' C2 I- Z* d' S/ w! I9 n* Y8 X
- {
3 [; M3 W. X+ s0 G! E( i, b1 E# } - for(i=0;i<=20;i++)
( C+ _% L$ O/ H8 r6 X+ a - {
# ^: x! v( X7 g: l' Q6 B - disp[1] = table[i/10]; //数码管显示十位数字的字形码
* y m! |2 _ R- V, D) E, ?2 D% r - disp[0] = table[i%10]; //数码管显示个位数字的字形码4 ^& K' n' b2 J- C2 p
- //十位数的字形码左移8位,然后与各位数的字形码合并
: F$ r9 A* i* F6 s, d4 C& C - temp = (disp[1]<<8)|(disp[0]&0x0ff);
1 E- c; `' X9 ?- A1 i* T - GPIO_Write(GPIOC,temp);
* @% m. @" H8 F' y - Delay(100);
: \: p# I5 O( t( E8 | - }
' R' k; D+ g; n4 E; N) ` - }& g: v+ Q+ R. _$ c( ^! J
/ \" H9 W j& z* f- }* 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
- //头文件$ B s1 Q+ b6 {6 Q$ o; d7 r
- #include "stm32f10x.h"/ K: j3 u9 r/ k# E. p* h
- #include "GPIOLIKE51.h" 6 p5 B7 c! I& j: ^
- 2 g n8 s4 ~: Q( u6 P% x
- 5 g% m) L8 C3 E8 v
- #define CLK PBout(8)
! ?# u: g% U0 }1 ]. `; d - #define DAT PBout(9)
! E& e0 k# V: e) j" X" r f - #define W1 PBout(4)$ G" O( d! {- S) s6 s
- #define W2 PBout(5)
0 A( T- I' y' |1 V& D. {( z d - #define W3 PBout(6)
3 F5 L {) H0 n - #define W4 PBout(7)- q$ L' L/ N& A0 r- P7 Y' A/ y
- 9 v: I/ C L# S# M5 q4 L
9 H5 P- B& t1 h* s* h- //函数声明1 q- b# O6 }9 t/ U9 }
- void GPIO_Configuration(void);. k, ]# w# M5 g0 @8 w5 I/ C
- 1 q7 a3 f) w m3 B$ h
- void delay(int m) ) C4 d) m7 Q$ `% ^# H1 ]7 P- T, G2 Q3 E
- {
& y. }* g7 r, ]! G& N5 d - int i,j;7 v+ n9 S" l0 t& e9 ~- z
- for(i=0;i<m;i++)/ ^4 e- N2 A. u& }2 }0 |! f
- for(j=0;j<1000;j++);5 l7 T* ]. z& ^) C
- }
$ E6 @. b* n9 r3 G1 t - " i% i+ l) R" O% c. K
- void Delay(uint32_t nCount) //延时函数
* ]) S f9 G+ p+ q+ W. q - {' | O. o. p. X
- for(; nCount != 0; nCount--); //函数说明:nCount:延时长短
3 ?9 w" N' b! N! o) T# u6 P ^1 {# ? - }
5 R% A2 R: ^ J
! S2 j% t. B6 H/ _7 ^- void Smginit(void) //定义数码管,进行配置4 v# ^" a( \; A3 T7 }; n
- {; M/ m, i) N3 o
- GPIO_InitTypeDef GPIO_InitStructure;# f. V2 _/ d3 U" a& a9 r
- [/ R# z: a, S9 m E1 q
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
9 [! m0 ?: @5 Q' z( g% M% L6 E - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
+ R- M; V( q5 y3 A p - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
& S5 u* H5 q" A( Y; }% |: U - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
, ]3 X" G8 _/ f( {5 A$ i- N- H - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
# l1 P& `8 K* }2 S - GPIO_Init(GPIOB, &GPIO_InitStructure);
8 d0 u. t; a( c2 |' L -
- J7 g5 b1 T& W3 r0 e( C3 t - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); 7 Q' E( J' [5 \- S5 t
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
, U9 I2 q: J( j0 j - GPIO_Pin_8 | GPIO_Pin_9; * P4 e( N8 j7 [" T$ {+ e! [
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
; Z; S: ]- Y7 s2 T - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ( G+ H1 [/ Y9 s) x: j: v f
- GPIO_Init(GPIOB, &GPIO_InitStructure);, z( }0 ]8 ]" Y3 g# p& @9 Q
8 B8 e2 F1 g3 ~+ G0 x, e0 L- }
* s9 r* D& R" ]% b3 A$ u" v - |1 ?8 ~8 F7 R1 x
- //定义字形码
0 m s' t# O5 O$ S+ S4 z& b - unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
6 A7 z4 p* a3 g0 ~ - 1 ~- a$ w% X: Y2 [
- void Disled(int m) y0 y2 ~ T( s8 t- d
- {) B- j" ~+ k+ d0 z
- int i;
0 V, _ ?* u; c4 X - CLK=0;
2 B% i' J( L% ]' D) l% A - for(i=0;i<8;i++). Q$ R* C$ u$ r; M3 U
- {( [3 S3 E# Z! t5 L7 N) d" T
- CLK=0;
7 s9 o' D$ y2 M" v- h& k) u - delay(1);" C4 i7 L$ i$ V0 _7 V% [. T
- if (m&0x80)
. R3 B2 ~8 @" A$ I - DAT=1;7 M5 [) m/ j0 `- z, j
- else* G8 A: Q j' e* B
- DAT=0;
5 {) B4 ^5 \5 [& e9 ?4 G$ ]2 v - CLK=1;
# s5 x$ ]/ {$ J* ]. l0 O - delay(1);
0 u5 C) i: E9 w! G% i* ` - m=m<<1;
* g9 f7 x- U x4 b Q) q3 U# l - }" J* A0 W% B# r+ y
- }
- K+ N/ s" W/ m _- `8 E. c; J - 0 X8 B$ n" ^! o1 A5 g8 f5 e' {
- int main(void)( {3 ]' i6 i2 Q( B. X
- {0 X; X6 S- F* |! [4 u( Q
- int i;
3 q) J/ n0 L$ s - Smginit();" T# L3 m# [( X, f
- W1=1;
( C+ b0 v$ q' i- B4 I/ R - W2=1;4 k) }6 @! b0 K
- W3=1;- R5 F4 I/ A* e. y: D: Y
- W4=1;# I. D9 l* J; y) a" X8 H
- while (1)
* a a, Z2 |- h) w" g) b& g - {
& ~0 {" O) w/ { f% s% V$ B - for(i=0;i<10;i++)
* f. s8 c$ I# @- x - {- g7 T4 I$ I7 h1 o! b
- Disled(code<i>);) J$ Y0 ]5 b9 {# a3 W' U
- delay(10000);
: }& E" l6 {- j - }
) F& X7 Y, l) }1 \' M8 G4 f, w# p& \$ V - }3 F8 F `6 o; J1 T* r# l1 \
- }</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 |