4个LED采用共阳极接法,其阴极接在STM32F103芯片的PB8,PB9,PB10和PB11引脚上
, Y! n' a4 m9 o7 y' ^+ a; `* M: ~- _+ _) S7 a
如图所示! Y6 Q9 y7 \: N5 J; z/ u$ O
1 F( j4 G" b6 A {
4 i1 s9 \& }2 N9 W下面是代码的实现,和数学一样实现一个目的代码可以有很多种编程方法,下面列举3个
. V/ a: A, x0 h: S' l, I4 c P, B0 j) I; g
第一种方法( T1 |7 j& S% c: N; d8 b4 d" r! d
. Q# O/ T/ x, k
- #include "stm32f10x.h"& e" p1 \' P7 P0 _# ?
- uint16_t temp,i;# d$ i7 C% T3 ?4 ~3 R, Y
- void Delay(unsigned int count) //延时函数
! g: \- F1 \! k8 {# d9 _# o - {
7 y9 d) D- s) J0 l# a7 I8 k- W* F - unsigned int i;3 P1 \* R* c i; }; |2 P) Q6 T
- for(;count!=0;count--)/ F7 ~7 @2 B- @9 w2 g
- {: C" I5 R4 ]9 f1 F) e$ L
- i=5000;
# u4 t9 m1 |3 X - while(i--);1 n- p" r8 `1 b: b9 W
- }
$ t' w3 U8 k$ E - }2 u! ~* [3 N7 V. S
- void main(void)
: E( u* I8 H b1 C3 E% r - {9 G5 W' u) A w% A8 C: l: y
- GPIO_InitTypeDef GPIO_InitStructure;
, F4 g k9 n K) g* H B! h - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟" v* A- A# t( O! ?$ Q( `
- GPIO_InitStructure.GPIO_Pin =
; S/ K1 d8 W4 F& U - GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //PB8-PB11引脚配置
% J/ {- [* H. y7 e5 D# D - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出
% p! I' X, k) f! F& I) |# H0 Q/ x - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz5 G9 i4 V: Z2 F8 B" H
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8-PB11
2 r9 N0 T+ E, M" x. B+ S - while(1)
7 B" o' v/ x: @ - {. F1 M; p$ k% k" P7 j. P
- temp=0x0100; //设置初始控制码0 v, D, y6 V5 O- [4 v6 \% `" ?
- for(i=0;i<4;i++)# V$ a( @0 ~* l3 W. x
- {
; B) a& o4 q$ [ |$ ^ - GPIO_Write(GPIOB,~temp); //向GPIOB口写点亮LED的控制码
& J) G5 _$ j+ U - Delay(100);8 o$ f4 m/ B0 \) t' g, h: {7 A
- temp=temp<<1; //上一位控制码左移一位,获得下一个控制码6 _2 W# `2 O) Y. F; s' @ T% N- y7 {2 y
- }
# t. f# d& @/ N7 s - }
. R; d; J6 W& Z9 p' ? - }
复制代码 # q8 o, ?3 y, I7 W
5 E5 a& e7 L5 D4 @4 E代码说明:“GPIO_Write(GPIOB,~temp);”语句将初始控制码取反后,从GPIOB口输出,使得PB8为低电平,点亮D1,其他点位为高电平;然后延时一段时间;让控制码左移一位,获取下一个控制码;以此类推,就实现了LED循环点亮的效果了( N& W2 v4 A5 t6 V) b7 [7 }
# H8 ^# |5 Y) k# ?+ ]* u( a& Y' q/ c第二种方法
. _' A3 }6 E5 k& H4 Z2 ]8 P. _2 t% R! p) h
- //这一段程序与上面的while(1)实现的效果是一样的) g* g. l" h$ t
- while(1)5 a9 H5 ]/ y+ C* h: [5 t
- {
" H5 a% u2 _ \; y" @; m - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);0 g3 f/ T& ?5 p+ g) V/ m! X
- GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB8输出低电平,D1点亮
4 E9 t8 \, M; ~4 O - Delay(100);0 D3 }0 i7 S1 q# R
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
" ^% G/ k4 p. M# l2 f2 z1 ^8 i8 S - GPIO_ResetBits(GPIOB,GPIO_Pin_9); //PB9输出低电平,D2点亮
* L/ O2 r& J7 b5 H* y - Delay(100);
1 L( U1 }6 n" p9 b) Z6 k - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
; P4 k1 K: i o- J5 k! Y - GPIO_ResetBits(GPIOB,GPIO_Pin_10); //PB10输出低电平,D3点亮
( I1 _" d0 E+ G: a2 d - Delay(100);
! k3 H! z3 G2 @ - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
" w- m, i) m7 \" N) F - GPIO_ResetBits(GPIOB,GPIO_Pin_11); //PB11输出低电平,D4点亮3 |: @1 t# [& v' b6 U, g
- Delay(100);$ R! W: j8 Z* R, z- q, s8 J
- }
复制代码 : S9 r% Z* Q1 I5 W5 M
1 Y! ]' d9 Y0 _, t1 }2 \! d$ ^* ~代码说明:GPIO_SetBits()函数可以同时对多个I/O口进行置位,这样也可以实现LED循环点亮
. Z# B# X- Z' Z. S* ^4 G: F
: Y% f* S5 _* |% } f第三种方法
" @; t* G1 P/ {# Y0 A
$ V# A2 \7 I( H( u- //这一段程序与上面的while(1)实现的效果是一样的* t8 u) a4 v0 u1 u- ^$ c
- while(1) 0 }$ v& C! |* ^& W
- {$ y4 _5 h+ J/ S6 ]+ g. L
- temp=0x0100; //设置初始控制码
* y! {3 L. @0 _ - for(i=0;i<4;i++)
/ c, a$ r/ J- q# a( S) S4 C$ C - {
4 u$ u" u V3 H. n2 c& c" m; b - GPIO_SetBits(GPIOB,0x0FFFF); //GPIOB口输出高电平,4个LED熄灭& M4 v9 L, ?1 G+ z2 W5 Y O s
- GPIO_ResetBits(GPIOB,temp); //控制码对应的GPIOB口引脚上的LED点亮# f) r F% t5 Q, u
- Delay(100);
/ T* ^5 ?" O. J \4 H5 j2 B - temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
4 C# H7 B) g6 B - }
; s- @) k# P1 V' Z - }
复制代码
: S* I! ^5 q1 q/ G% L0 B代码说明:使用for语句 ,比较简单,控制几个LED灯就让for循环几次即可 \+ ]' t2 d. _% z1 X) c8 [
. K E" _4 \+ T" r+ S6 S
8 F" V. s6 g4 y4 a7 _1 N2 k* c5 h+ S, h
|