|
你好, 这个是我的练习, 看看能帮到你吗2 {% s6 V' E" w0 p* H
/********************************************** x( N( Y! r7 U
** 文件名: 广告灯.c **
9 p3 r3 ?4 _+ O3 d6 k$ J** 晶振频率: 11.0592MHZ **6 h+ p, J! X7 @* ]4 \0 w
** 日 期: 2022年03月28日 **
" E6 \( C7 x9 V4 i1 X** 程 序: 利用移位指令实现拉幕闭幕式 **: _% P6 H' i9 I* _* D0 q8 J
**********************************************/1 H0 q- F: q$ T6 u4 f
1 y3 e7 X" @, k6 Z: ~" B; B5 e
#include <reg52.h>- ?* _3 d0 R+ G/ o& ~2 Z8 m3 `: D; b
#define uchar unsigned char
) o$ b) ^# n* A8 X7 p#define uint unsigned int
% A# B: D- y. g1 ?: G+ X" i. L" J#define LED P0
* ~1 _. y2 `) y! y+ g8 {0 q* n& i2 _$ H9 ~- V7 s9 Y
/********* 时间延时程序 *********/
: ^% G4 H) T* H$ L9 @: o- o4 n8 M9 N0 j* g) y* e! u
void delayms(uint ms)
6 o! b/ P, j: N, N$ _0 s# N1 e& N, }{
' K1 }7 P* |" U3 ? uint t;
1 D. v _- p2 x- w" X7 C) R while(ms--)
$ O$ |: X/ J) `1 Z6 Q3 D {* ~0 E: A( u, q b
for(t=0; t<100; t++);% h* i! F \% ?4 L$ D
}
5 E. O; O3 u- u( f}
! S9 l( t/ w5 n/ ^ n' A! b5 W: l0 M
/ f; o2 E$ C$ ?$ S1 y/************ 主程序 ************/6 U$ a5 O1 T S3 ?
6 D6 ]6 f; y. }) C- `, v2 Ivoid main(void)
9 f7 p0 K: C! `) [1 n3 m{
0 w6 ^, r& [ _ uchar i, HW, LW; //HW 高4位 LW 低4位
' ~; o, S+ Q; S. z+ q0 a while(1); L+ g7 c% T/ H& f; B5 J
{8 P& o2 z% z5 ?
LW = 0x08; //LW=0000 10000 {7 U& b5 D, z+ x$ }# L! K! Y
HW = 0x10; //HW=0001 00007 t2 |7 g6 f" Z$ Z) X% `
$ [% _; e$ T' ^3 B8 ]# ]0 q
for(i=0; i<4; i++) //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次
7 ~& N, z+ S) f k3 e {
' ~8 p! w3 a8 J' ? LED = ~(HW|LW) ; //HW|LW = 0001 0000 | 0000 1000 = 0001 1000 ~反相= 1110 0111
, N& x W5 \' U/ w* N$ D delayms(250);
1 W! ~( t% |* ~; j LW=(LW>>1)|0x08; //LW移位後补1 LW原 0000 1000 >>移位 0000 0100 || 0000 1000 = 0000 1100
* `/ o2 ^2 o# U/ h$ d; M HW=(HW<<1)|0x10; //HW移位後补1 HW原 0001 0000 >>移位 0010 0000 || 0001 0000 = 0011 0000
& y+ ~; F" ?, d& f! c5 g2 z& ]5 Z } //HW|LW 0011 0000 || 0000 1100 = 0011 1100 ~反相 1100 0011 ; _- U$ O% ^! O* m+ e
# Z! Y* i' Z; j W+ a
LW = 0x01; //LW=0000 00014 [, }6 D0 C# F3 M. p
HW = 0x80; //HW=1000 0000) z) W8 j8 L T1 U: d
2 }4 D5 C3 P$ o
for(i=0; i<4; i++) //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次
1 S+ @$ x) S6 { I8 c3 F. _ {
! H$ ^" [9 B6 \4 Z9 Q1 a( R LED = HW|LW ; //HW|LW = 1000 0000 | 0000 0001 = 1000 0001
6 ~: k" ]: Y/ }% D# b/ k9 { delayms(250);
0 ^; Q# j. [: c: `8 e' ] LW=(LW<<1)|0x01; //LW移位後补1 LW原 0000 0001 >>移位 0000 0010 || 0000 0001 = 0000 0011# I1 t1 @+ A/ B4 J3 L
HW=(HW>>1)|0x80; //HW移位後补1 HW原 1000 0000 >>移位 0100 0000 || 1000 0000 = 1100 0000
' d; |( [( r9 l% v } //HW|LW 1100 0000 || 0000 0011 = 1100 0011
J6 t# Q1 A5 y& b5 A& Y }
( [! G3 p6 L) G8 Q! y}2 i% H x( W2 Y3 S
|
|