跑马灯程序的设计思路与我前面发的LED循环点亮程序总体思路很像,就是跑马灯第一个灯亮完,接着是第一个和第二个灯一起亮,而循环点亮时每次是只能亮一个灯,明白了这些代码的设计也就手到拿来了。
7 l' D; k3 L; e6 ~" }' H
; @" L0 ^9 U8 H6 o! F8 z2 _+ n程序也有两种编程方法, G- p9 H. h! L( i3 q6 l/ G- H
2 R5 n: {8 \9 x7 ^! O4 |4 E下面展示第一种
. F0 \: b( H8 c2 U- J6 S* U9 k2 P4 D1 M
- #include "stm32f10x.h"
0 S; Y$ |; d3 B1 S - uint16_t temp,i,j;; `2 x8 G2 ?& Y8 w% M& b
- void Delay(unsigned int count) //延时函数
) D% _2 S1 l$ J5 y- t, o0 V - {6 ]4 [* d3 q" \+ f; z9 w8 M" T
- unsigned int i;
6 s0 Q: N5 t, o% z - for(;count!=0;count--)
- b: Y' t$ L5 M5 k7 |& q - {
7 o4 y" x- X7 k2 M. m/ X - i=5000;
2 }* y5 B1 z1 J8 c5 e8 | - while(i--);
, h) B z3 E) ]( L; h9 @ - }
: M0 R6 u! b/ P1 B - }
! C/ h* q$ h+ y- U: I - int main(void)
: t9 r) S" [5 A' I - {$ o1 ?5 t7 k* U$ X% Y8 J: f
- GPIO_InitTypeDef GPIO_InitStructure;8 ^( f3 \$ t* c, }3 {5 y# x
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟! q/ I5 ]& g$ ~& N
- GPIO_InitStructure.GPIO_Pin = 0x03FF;3 n$ }3 V; l8 b) R3 _
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出/ x) `8 I8 k; B% l
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
: Q: u+ p, q! W% R+ M. U3 m - GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8-PB11+ M$ `7 u# f% @
- while(1) ' W- p+ @6 m Z1 L% e9 s
- {
* a( f p9 E6 B* q, b) H$ E# ^3 o4 L7 [ - temp = 0x0FFFE; //设置初始控制码
( c4 d/ b7 _9 W! S' i - for(i=0;i<4;i++)
$ B+ L* K% W5 U9 ] - {8 q" e8 F b4 D
- GPIO_Write(GPIOB,temp); //向GPIOB口写点亮LED的控制码) B- f2 G7 e# t$ h; Q7 J) w7 _
- Delay(100);! [8 e* m- }% ^! ]3 s
- temp=temp<<1; //控制码左移一位,获得下一个控制码0 G& [3 S$ g' ~( B
- }
x: M. K8 Q% s( I) n - temp = 0x0FE00; //设置初始控制码; f4 S. P0 v6 l3 s) l
- for(j=0;j<4;j++)* G- U5 }2 ^# j0 N2 L
- {7 [& f/ u! ]0 p
- GPIO_Write(GPIOB,temp); * M: A# Y, u% y5 K
- Delay(100);
0 D1 M0 k$ |. L' y- A - temp=(temp>>1)+ 0x8000; //右移一位加0x8000,获得下一个控制码! W: j' Z% Q. _9 ]
- }
* O; w# B$ F) [ B# s3 S1 x - }5 |1 \0 P/ x) [! u3 A( a
- }
复制代码
2 H; v U3 H9 l: T1 J0 w3 J7 L/ @ D5 k
代码说明:“ temp=(temp>>1)+ 0x8000; ”语句为什么要加0x8000,因为temp右移一位时,最高位到此高位,最高位补0。temp右移一位后,加上0x8000使temp的最高位置1。3 S# w7 P" p1 B7 y! `4 ?
6 R4 n. Q& `8 N' L
第二个编程方法
* y9 f, k, h, m* n8 g
- l7 l* A* z) E$ N- while(1): ]' z7 y3 ]: Q) e5 ?7 ^2 x
- {# @% ^+ ~4 o/ Z# h
- GPIO_SetBits(GPIOB,0x0FFFF); //先熄灭所有LED! r/ k2 J3 [8 ~1 U( |
- temp = 0x0001;
% Z' n; ~" O+ M* u* ?2 x, M - for(i=0;i<4;i++)2 x, w% X; P( O, q# V
- {
" g( O2 Z+ O+ V/ R2 {+ W+ g - GPIO_ResetBits(GPIOB,temp); //向GPIOB口写控制码
' M2 A# n* z, ~* E. b& C - Delay(100);5 m7 p2 Y7 Y$ }) M# d* N G l
- temp = (temp<<1)+1; //temp左移一位加1获得下一控住码! n1 r4 p" B& U1 D
- }8 m r" ?. i, ^( f H. H
- temp = 0x0FE00;
0 P5 W8 T; Z. u& P+ g/ S - for(j=0;j<4;j++)
' e. s2 K; J) c' @9 |% H! X - {
+ B3 Q. p# @5 U - GPIO_SetBits(GPIOB,temp); //向GPIOB口写控制码
; T+ h! v( B$ Q$ E: o, e' }. t - Delay(100);/ ?" C9 b% ~+ U" ^3 u
- temp = (temp>>1)+0x8000; //右移一位加0x8000获得下一控住码
- O0 N" L3 j! n2 Z - }
2 A" C* G m& ^0 y5 A
! X7 }; F$ c" \7 U5 e# ^- x- }
复制代码 ! [4 g: y- b" ~4 H* A4 N8 a
4 W4 r3 M: l& y0 P8 V V Q
代码说明:使用GPIO_SetBits()和GPIO_ResetBits()函数替代GPIO_Write()函数。(个人认为这样更简单更好理解)% ?' n" D" a& Y, ?' ]
# _/ e( C& I4 {( m* |
GPIO_ResetBits()函数负责点亮LED,GPIO_SetBits()函数负责熄灭LED' C6 i( x y. m
4 N7 l6 k$ a" d+ B F
8 q4 O% ~/ }/ A0 L" a, @5 u
|