|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下4 m* M# w. E' }7 O9 l
程序:
) M2 U( B; V0 B; |6 ~#define uchar unsigned char //定义一下方便使用
R; ^1 g" }3 p' ?' i1 z& R3 X#define uint unsigned int
: {. s) ] u& ^& V" ^% ?# d#define ulong unsigned long4 V8 g: ~3 T/ Z4 s* n C
#include <reg52.h> //包括一个52标准内核的头文件4 L( z" h0 G( u( E
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
! \) D9 G7 _6 }" Y& G; X# msbit P11 = P1^1;
5 d/ {8 M5 I N' l Ssbit P12 = P1^2;
/ t5 N- V" T0 q7 ]: nsbit P13 = P1^3;
; R# G2 t+ P$ gbit ldelay=0; //长定时溢出标记,预置是0& ~5 u G/ e. O; b5 y |! v" p* }
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的& b1 f) v1 K+ ]% l) S! e
//定时器中断方式的跑马灯
6 ]) ^7 k y" M) x1 v! { lvoid main(void) // 主程序5 j1 T! J4 D5 }( ~
{5 ^ E' t' j% R" v8 G* m
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
8 |$ `. J1 ^5 I, funsigned char ledi; //用来指示显示顺序8 H+ }; r7 l$ c5 M) m1 e+ D$ A
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
0 P0 C* w/ m! D. E, g0 p: S& U$ O5 {RCAP2L =0x00;* Z! @# H0 Z; Y( K
TR2=1; //启动定时器
' C, \. a/ j3 P3 z/ o# H. p& iET2=1; //打开定时器2中断
' m9 k- u% D' Z1 T) ZEA=1; //打开总中断% v% s$ h$ s0 x- k7 T
while(1) //主程序循环
, b& L/ f, A; e6 v! x( s& f{
) V7 H1 d6 n. a' A2 R1 G5 Wif(ldelay) //发现有时间溢出标记,进入处理
F( U- r0 J" \! ?0 @{
- e$ E6 r' q. _2 P7 a7 Eldelay=0; //清除标记
! `6 ?% Z9 [6 f3 hP1=ledp[ledi]; //读出一个值送到P1口
3 ]$ ~5 V$ r! K) f3 _, Qledi++; //指向下一个
3 E e& f5 T) e$ T" o$ mif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
! H) f$ N; Q' j}8 d/ b6 H; ~/ `) N2 k& _; K
}
& `. y. w, p6 A% }$ s}/ h3 [/ C& e9 ^) @: p
//定时器2中断6 ^, t: J9 F( @5 [
timer0() interrupt 5$ E" F* S2 ?) w- C
{
( v5 s$ }- ^- k8 W1 [% Vstatic unsigned char t;
o5 H/ y3 n9 ` VTF2=0;
7 v( b# f2 t/ Z; x5 h0 T O, \% Ct++;% t% p9 _8 J& Y, S4 X. ?* }8 U$ W
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ0 | [. ^; O! E* f# d5 h) t
{) W6 s/ p" M" Q2 O7 t1 U
t=0;
, K' t8 m6 q8 i7 R. a8 Zldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
% l3 `; h% x) D _2 m* B8 \9 o}1 g1 r) r+ w0 L; c: c1 v5 N
}
* W! Z( n. ?# B0 j* t% V4 }. m- y3 ^×××××××××××××××××××××××××××82 t8 H( v5 U* d
就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
( X/ ^* C2 X( G8 S* s% |& Fledi++; //指向下一个
* {: j4 O# k; V4 R# u" iif(ledi==4)ledi=0; //到了最后一个灯就换到第一个 ! v8 \& G. X7 E6 r( Q- C0 J
改为! n; w, l% z W6 i
ledi--; //指向下一个
$ o( s6 C$ f: Cif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
. W8 P: c; Y( ^只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
+ }6 ^: _& H6 }
+ Q6 w. o$ d5 Z+ x2 r( x, ]' r[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|