|
你好, 这个是我的练习, 看看能帮到你吗! m" u0 m# U) K% {
/**********************************************
; w# h& _6 u2 e; B- {** 文件名: 广告灯.c **
6 t: f3 X! W$ f Y5 p2 ]** 晶振频率: 11.0592MHZ **
* f$ Y! O! U' ~" }# N, n** 日 期: 2022年03月28日 **
, ` |# y. o/ g9 Y; S* K' e** 程 序: 利用移位指令实现拉幕闭幕式 **3 X- v9 P1 l, X2 W
**********************************************/3 ^( v' k) g0 j' d; ^
: q9 A0 L" P t, \6 c/ U- g#include <reg52.h>
6 k: X. y& H/ K9 D; s#define uchar unsigned char! \! @7 Q% k A0 P; V8 M( C4 x
#define uint unsigned int
! ~6 Y _* [5 o#define LED P0; i2 `* M+ j0 K
4 |' l" _: |0 V/ v3 X/********* 时间延时程序 *********/9 E0 X, ~% t& }% g
1 I! \. X! d1 c9 Xvoid delayms(uint ms)
" _; Y: l/ z4 c{
8 X: ] ~6 a. T' j7 n2 F* s# n5 k! F2 N uint t;% I% j( ^0 a' v, v2 s% ]0 j) a& ?
while(ms--)
[9 j+ c& D4 }& M S/ m8 r6 }% u {; \( Q, Z% \% ]/ K
for(t=0; t<100; t++);! t( V+ m1 q" U3 x* K. ^
}
- M3 \, s% ^+ X3 H8 N}7 S- R" ~0 A% C& i% q# p+ q1 Y
+ e3 x/ a$ h7 W3 Z! Z% L
/************ 主程序 ************/ O' ^* Y0 N4 w; m4 C) g- z: l
/ J# @3 D& g+ r2 O
void main(void)
/ o$ Q5 ^3 w2 V{
5 @' F6 g5 S. ], K# q/ ^' I uchar i, HW, LW; //HW 高4位 LW 低4位/ V/ {' w6 |4 Z/ ?! A7 ]1 o. ^
while(1)
# ~+ v; i: p/ s' Q+ x {' `2 h: [2 N1 n3 R
LW = 0x08; //LW=0000 1000! X% f* v$ K7 S r/ n
HW = 0x10; //HW=0001 0000* L K: t2 Z$ N7 N3 w1 C7 R- M# g# b
' U6 s; c4 j3 Y& P4 Y/ H A
for(i=0; i<4; i++) //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次
' L6 p' S2 r v( j {" b4 H) b c4 m0 q
LED = ~(HW|LW) ; //HW|LW = 0001 0000 | 0000 1000 = 0001 1000 ~反相= 1110 0111
9 m5 a6 d! C# q+ ~% d$ f delayms(250);
' d- K5 S% @* `7 d+ f8 @ LW=(LW>>1)|0x08; //LW移位後补1 LW原 0000 1000 >>移位 0000 0100 || 0000 1000 = 0000 1100! ^* @; I* Y" k; |: @9 K+ f
HW=(HW<<1)|0x10; //HW移位後补1 HW原 0001 0000 >>移位 0010 0000 || 0001 0000 = 0011 0000
1 U6 f) a* k. u3 Q0 R9 ^2 t) i } //HW|LW 0011 0000 || 0000 1100 = 0011 1100 ~反相 1100 0011 5 v. l4 X1 }& I) e6 Y4 o
2 S. q0 Z) g$ u5 x8 [ LW = 0x01; //LW=0000 0001
) o, s- c* V; j' H5 W* o" A HW = 0x80; //HW=1000 0000
" q) j3 t) |7 `1 P$ r {: M* U- H( N, T
for(i=0; i<4; i++) //由於 8个LED, 中间作拉开及向中关闭 所以只需要移动 4次( P# a. x9 V) D' I5 H" M; e0 v
{* Z8 \2 n0 {5 a: j+ v7 A3 s$ X
LED = HW|LW ; //HW|LW = 1000 0000 | 0000 0001 = 1000 0001
" V1 Q5 D/ B# k# t# F/ ~; G9 J! L delayms(250);
8 ^( T% z/ }4 a5 V; U* c LW=(LW<<1)|0x01; //LW移位後补1 LW原 0000 0001 >>移位 0000 0010 || 0000 0001 = 0000 0011
9 c% n4 H5 J% n HW=(HW>>1)|0x80; //HW移位後补1 HW原 1000 0000 >>移位 0100 0000 || 1000 0000 = 1100 0000/ G9 U* N" T* Q9 o
} //HW|LW 1100 0000 || 0000 0011 = 1100 0011 : s* U' _5 K- K( Z, J J8 k9 l
}9 X4 r4 n% {! J% I! S# X/ G
}
8 H+ n% Y3 I$ g1 j |
|