4个LED采用共阳极接法,其阴极接在STM32F103芯片的PB8,PB9,PB10和PB11引脚上
+ Y9 @! U& J+ l( I( p; B: z7 z- O5 m+ B7 L) O9 i
如图所示9 k; o" L# q7 @7 J: e: N
0 G! F) h, a; P4 F" \
6 i2 Q0 D+ w6 c: d3 r) x下面是代码的实现,和数学一样实现一个目的代码可以有很多种编程方法,下面列举3个. x0 G) I' s% I/ z
- N! N+ j5 h3 `' m
第一种方法' U& l2 [# V4 i0 t* K
& r' \! M+ L, f9 D+ w6 s. ]
- #include "stm32f10x.h"
- f$ I% [: D+ R) c: i! ^ - uint16_t temp,i;
, Z5 X+ `" |0 j! ~( C2 l - void Delay(unsigned int count) //延时函数2 t2 q0 o4 z/ N1 [
- {
; P2 I* |' B! P0 e8 u - unsigned int i;8 m& _9 g8 N( `- ~5 A& M: k" N1 n
- for(;count!=0;count--)( S0 Z% M1 V- Z9 h6 B' s
- {
, K0 u/ D: }9 F$ {+ o' h - i=5000;8 W# E" u4 q2 n
- while(i--);
9 p' f' U8 x/ _/ m - }
( b# T# d) l- K2 x' j - }7 M2 a* _4 ^' \' B4 ~7 |4 H3 u
- void main(void): J# [+ ^9 S5 o) S( s: P" a
- {
" A& G* Z. Z& I9 L - GPIO_InitTypeDef GPIO_InitStructure;
6 p" n: V+ V- E. h - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
: m4 T. N1 r* ^% P - GPIO_InitStructure.GPIO_Pin =
0 e$ S7 B* L4 m6 Z; G; z - GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //PB8-PB11引脚配置
9 h' n9 O8 E3 `6 r" u - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出0 b% ^* N7 \+ o2 E) Y& y! F$ s" G, H1 r
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
o+ O/ A% L+ T - GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8-PB11
9 e) H. |1 x3 n: C e - while(1) ! Z& b+ S# I) t+ X: u+ U
- {
# n( U! w3 o2 o7 H/ x( \! f" M% F - temp=0x0100; //设置初始控制码" A+ v4 ^' S8 j6 u: M* Q, l" r
- for(i=0;i<4;i++)7 h; p- C% [5 a/ O, S. \$ `
- {
3 C' s& J+ f4 Q3 g, E - GPIO_Write(GPIOB,~temp); //向GPIOB口写点亮LED的控制码
0 ]$ M7 G3 Z$ V; W9 \: s - Delay(100);
8 m% ~2 O. j5 i, o - temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
, R. e. ^$ }$ @4 ]* ^ - } 9 z) N. U* K) _- u( ]: e/ E
- }; F, B- t' [7 S8 c8 B# A2 ?
- }
复制代码
9 P9 d0 g' b8 e+ Y* j
8 n; P Y6 _$ q6 n# p8 r代码说明:“GPIO_Write(GPIOB,~temp);”语句将初始控制码取反后,从GPIOB口输出,使得PB8为低电平,点亮D1,其他点位为高电平;然后延时一段时间;让控制码左移一位,获取下一个控制码;以此类推,就实现了LED循环点亮的效果了
2 i. q4 @( z7 C, X5 _4 f; X) a, V# J! s& z0 Z' n
第二种方法
# ~/ C) D3 f* e E
" ^+ ]. h2 K; d" j0 F6 {' v- //这一段程序与上面的while(1)实现的效果是一样的% Y. ?, w" H' s' W& ~+ B* X
- while(1)
3 H7 Y7 v7 w2 N. T) f9 v# z& m. j - {/ E+ N4 H# F1 [! L4 ~+ D$ R
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
8 Z& G* J+ c6 Z, g% K% E2 n - GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB8输出低电平,D1点亮! w" C0 F. P) y/ a7 M/ q7 M
- Delay(100);
! g! b7 v9 T1 r - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
7 R9 h2 o5 F, j, T - GPIO_ResetBits(GPIOB,GPIO_Pin_9); //PB9输出低电平,D2点亮
5 f$ y6 I' _0 b, t - Delay(100);
0 |+ G- f" f a - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);! F5 o& _! {3 o; `
- GPIO_ResetBits(GPIOB,GPIO_Pin_10); //PB10输出低电平,D3点亮
6 c; j4 X: K; v. D - Delay(100);+ ^. t2 z }, q9 C9 x t# x# W/ U
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
+ a8 U. z8 T& u. P" B: | - GPIO_ResetBits(GPIOB,GPIO_Pin_11); //PB11输出低电平,D4点亮
* j/ {: y5 f! `) w - Delay(100);+ @! |* i2 S) H
- }
复制代码 8 v) [6 U$ J. n n
, z& T! S- o2 p2 G+ C0 `
代码说明:GPIO_SetBits()函数可以同时对多个I/O口进行置位,这样也可以实现LED循环点亮 9 ~/ ^3 y" l! g
! V w* Z# f9 J) L, C6 Q. o第三种方法# A9 J; j! u) F3 j' ?* i* K7 ~
& `8 J& A% x, K# x- D9 p+ M) R
- //这一段程序与上面的while(1)实现的效果是一样的
0 b2 m4 {+ L: u - while(1) 5 o% l/ s! o2 v- E7 @8 T
- {
" N) c2 W! R. j9 M; ]* @6 e* { - temp=0x0100; //设置初始控制码2 Q3 O: ~( C; |4 Q+ ^
- for(i=0;i<4;i++)
& A: `! x- k5 w( h* W - {
6 h) C( g+ d8 Z3 Q8 Y% g - GPIO_SetBits(GPIOB,0x0FFFF); //GPIOB口输出高电平,4个LED熄灭+ Z# L7 K* W9 J' t, k7 W- S
- GPIO_ResetBits(GPIOB,temp); //控制码对应的GPIOB口引脚上的LED点亮; }( n3 u) a' @) Q; v/ M1 r
- Delay(100);
* G4 Y8 O: s6 y2 p+ c - temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
' G, X8 |- H5 i - }
* B u3 o+ L1 T: m6 B' c, t) X - }
复制代码
0 p/ z) V- d* x n- e' r代码说明:使用for语句 ,比较简单,控制几个LED灯就让for循环几次即可, X$ ~* l& p! M! v8 q
4 @, h3 J* p: F9 u( {; d, Q+ y
h& A: T4 Y; Y4 Y& e9 K
- k4 r4 X' r4 N" V# Z |