|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
& _' y3 ?: v$ u/ f, C/ O# v! A程序:
& n0 v" `+ S. D1 f( q#define uchar unsigned char //定义一下方便使用
; h1 S; r! R0 I, m; ]3 P5 d#define uint unsigned int8 I& l( }; V7 X% r# t0 k
#define ulong unsigned long; }) U8 ~5 j! N7 O g' X/ k
#include <reg52.h> //包括一个52标准内核的头文件! k* x% \7 o( l! d# b, D0 ?
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了6 x4 b6 F' j/ K' o0 p
sbit P11 = P1^1;& V7 y, N" M Q4 l. B3 y
sbit P12 = P1^2;
: d! V2 t! ~" @sbit P13 = P1^3;
. B) N( M/ ^4 A- |9 H; f; ~* Vbit ldelay=0; //长定时溢出标记,预置是0/ {3 Y' l) z8 D$ p$ v
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的2 f7 E) O+ z& i! B
//定时器中断方式的跑马灯# F. z* e* Q3 }8 A1 r
void main(void) // 主程序! B& m( Y9 ^ a6 g% W* n- O
{
f4 e3 u0 H8 o3 sunsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?$ ~! ? O# _: H. V+ A
unsigned char ledi; //用来指示显示顺序
5 r- {) d, X1 i8 }- Z0 B7 H( i$ mRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟+ X8 L' e* E4 a- A5 g: p$ X' B
RCAP2L =0x00;
# c! ~. d2 V N7 V( R0 ]TR2=1; //启动定时器
5 v, J6 ]: ]) T& ~ET2=1; //打开定时器2中断" f* D" L: J7 f; }! s% R- g
EA=1; //打开总中断
" z* I; V: V8 g. uwhile(1) //主程序循环, d1 l6 N5 D `, e$ o+ Z
{+ F; [ H# S: z6 X% o/ _ |% Y
if(ldelay) //发现有时间溢出标记,进入处理
4 `' _8 U% s* H. ?! Y{9 R+ j0 O( D, e3 c+ \2 J. W+ m
ldelay=0; //清除标记
, D0 d, P3 S8 r( GP1=ledp[ledi]; //读出一个值送到P1口
0 ^+ u. R1 N' Bledi++; //指向下一个
( ^% g0 R- d) N, p# S- aif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
* r0 H; R* p2 [% q9 x6 d: u}5 v7 E1 Z8 L8 {* p+ Z: p
}! U. o' W6 P- {, K4 p- e2 j9 P
}0 U" m8 E3 T- I, C' \& W8 c9 {) p
//定时器2中断' n1 ~, C2 q/ {% ^/ z- F
timer0() interrupt 5
# Q, a4 J7 O& T, p5 ]2 F: m{
9 z% F8 L# ?- C6 {0 y2 Gstatic unsigned char t;% }2 y5 \2 p# |
TF2=0;
" `/ G) I+ @5 ~t++;
# t4 o& ~# G6 ~8 Y$ `if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
2 X2 o' ^: B% j1 A: `/ W{
% e0 G" B5 y0 g1 j- n% O% J0 Zt=0;
1 @' h) s5 z3 P3 R7 Sldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
$ w4 b$ T/ J4 C& b}! Z: F# V; ?& l4 m, W* X
}' ^/ R c$ a$ j; U+ t( u1 d
×××××××××××××××××××××××××××8
; K/ [& c, Q$ y4 [就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
I- A S7 V6 kledi++; //指向下一个* W) f. M' T o3 {9 k- k
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
P( R( i( O- i改为
0 l; |0 a0 `+ A6 D. D/ \) cledi--; //指向下一个) y* e+ @& E# @" O& I
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个' w _0 G0 r0 G' O' V: Z
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了# O5 a+ v3 L2 }( D+ G' _
C3 ]0 m* T9 D2 o4 v[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|