4个LED采用共阳极接法,其阴极接在STM32F103芯片的PB8,PB9,PB10和PB11引脚上' e" _$ i* n x- ] f# I
3 p+ v$ H$ Q3 M: k* l4 s- g6 p 如图所示
. G5 l# |6 I; ]
- @+ p7 b' x- c( s6 S2 [
5 X( |$ x- _- q) `; {
下面是代码的实现,和数学一样实现一个目的代码可以有很多种编程方法,下面列举3个5 M- U7 v) @$ d9 `1 I. l
9 j: \$ u$ X; P! Q! m
第一种方法
# v+ N9 G+ G9 `, ?& y5 ]6 W6 O2 C
- #include "stm32f10x.h"' B7 o, g) z" f- L: g" r& T
- uint16_t temp,i;
2 ^; i5 Z' u9 g - void Delay(unsigned int count) //延时函数
! [/ J9 z! o7 l. z3 u+ u% I - {/ `( K) J# X- B% ]8 R
- unsigned int i;4 D8 x" A3 m5 E6 r% b# G3 u5 e9 q
- for(;count!=0;count--)+ c' M' D0 b1 p' K* V' O! N
- {0 n- v- D+ u/ ]& F' f5 _; o. T+ ?
- i=5000;$ C4 _9 F9 ^1 l8 D- O5 F9 r
- while(i--);3 k( H; L* R; f, H0 Q* U
- }
' b, w0 V; ` e M8 h! x - }
; E4 g4 c! t% S2 X) x - void main(void)
, x" ^$ m# y( b2 `0 |; y - {0 [* s# O' t3 f+ A& x% B
- GPIO_InitTypeDef GPIO_InitStructure;- K4 x. i0 S8 l, `
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
: x7 `0 _5 w$ o# }( m) Q- m3 I+ Q - GPIO_InitStructure.GPIO_Pin = 4 n% B1 I! f% P2 i2 A( D
- GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //PB8-PB11引脚配置8 e" B- Z$ ^* `6 f& n7 J
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出
# q( E) J8 ~8 {5 E3 S, J - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
! y3 e0 [! d' y1 ` - GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8-PB11
% e+ s' J6 ], t" } X) q2 `+ ?# G - while(1) / z4 k* o- ?5 z* x
- {
6 t, _' K" B) M' L - temp=0x0100; //设置初始控制码# v) O/ T' U7 T: U9 L( I( j
- for(i=0;i<4;i++)
8 V+ K" S+ E& S& b4 |9 Z- W8 x - {6 Q! \/ H I) C0 d0 b7 [# c5 ^0 ^6 d
- GPIO_Write(GPIOB,~temp); //向GPIOB口写点亮LED的控制码/ r5 b% h+ w& s$ T8 V1 C6 z, L
- Delay(100);) H I( ]& D" X' f# \
- temp=temp<<1; //上一位控制码左移一位,获得下一个控制码( G: \8 n1 i; Z8 F- P0 r
- }
/ [: r& t4 n8 F - }
8 M% \+ {4 Z5 S - }
复制代码 . h9 p- E: F5 [
$ \2 I7 ~( Y- X! y& m( d代码说明:“GPIO_Write(GPIOB,~temp);”语句将初始控制码取反后,从GPIOB口输出,使得PB8为低电平,点亮D1,其他点位为高电平;然后延时一段时间;让控制码左移一位,获取下一个控制码;以此类推,就实现了LED循环点亮的效果了+ d P% a7 ~- t- m% q
6 b: n' ~8 K9 B$ [6 s第二种方法% M- F9 [ t5 G# b9 i7 [
- ]( w" a9 x8 t
- //这一段程序与上面的while(1)实现的效果是一样的5 M' {1 I4 p E5 H! l X
- while(1)' s, r/ E% a+ L, S, L6 i9 t v/ ~
- {
; f s2 [7 m) u" P# p - GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);, G" R) V4 j" v9 ?5 ^* E
- GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB8输出低电平,D1点亮! F9 V' R h. O e5 T# `* x
- Delay(100);8 N: y6 M8 o4 x6 K
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);+ s; n; K& U/ c6 u! \1 [3 n
- GPIO_ResetBits(GPIOB,GPIO_Pin_9); //PB9输出低电平,D2点亮
* |# }8 ^, l$ b, @$ h! F/ i - Delay(100);/ `: P' q# {8 W- j
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
" X/ `! v c# N8 p( H' C+ C# v. h2 s+ x - GPIO_ResetBits(GPIOB,GPIO_Pin_10); //PB10输出低电平,D3点亮4 U- R7 e( A* P( X
- Delay(100);- o4 |% [) M* e5 J1 ^5 }
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
" S* V, P- C: T - GPIO_ResetBits(GPIOB,GPIO_Pin_11); //PB11输出低电平,D4点亮1 Y3 [0 v9 N3 b/ e
- Delay(100);
! C& H3 Y& R% I! g, Z - }
复制代码
( |% A) v w3 T( K/ ^% j E+ [8 A* Y+ d! m) M+ G5 P0 ?" l
代码说明:GPIO_SetBits()函数可以同时对多个I/O口进行置位,这样也可以实现LED循环点亮
, e7 y D2 u$ z( W3 L2 G$ j$ ~* | K
第三种方法8 ]) j, v; _3 E' r+ u
& b7 s- O7 X) |5 A3 v. J+ Y' y! d! d
- //这一段程序与上面的while(1)实现的效果是一样的 @6 s* z: b6 w% L
- while(1) # C9 G3 Q8 P# M5 u
- {
+ @ t" e* d( Q6 J3 H - temp=0x0100; //设置初始控制码7 U& a" e/ ^& |' F% Z+ y
- for(i=0;i<4;i++)
, l1 U+ b. P# `7 x6 ~/ N9 b O1 X - {4 P2 F/ i+ h/ J# v! T: B+ B, j
- GPIO_SetBits(GPIOB,0x0FFFF); //GPIOB口输出高电平,4个LED熄灭
5 ] j) ^- [# f. h - GPIO_ResetBits(GPIOB,temp); //控制码对应的GPIOB口引脚上的LED点亮
6 f/ P8 ]$ |* C2 N! F, @ - Delay(100);
) l8 O9 ?' f9 c5 Y - temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
8 \8 v- f7 @, q' x4 m$ x9 v# X! \ - }
% G: L! X1 F% `. n - }
复制代码
, P. D8 r7 @* d代码说明:使用for语句 ,比较简单,控制几个LED灯就让for循环几次即可
( A2 N+ I2 z$ l/ S( j- g% T
# I6 l( Q9 ?& ?, {, [4 v. Z; ^
+ s* P+ D w4 D5 M( E+ S/ m' n, [" W
|