#define uint unsigned int #define uchar unsigned char #define N 100 uchar key=0; /*按键设置*/ sbit H1=P3^6; sbit H2=P3^7; sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7;
void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); }
void LED(uchar a) { switch(a) {
case 1: P2=0xfe;delay(N);P2=0xff;break; case 2: P2=0xfd;delay(N);P2=0xff;break; case 3: P2=0xfb;delay(N);P2=0xff;break; case 4: P2=0xf7;delay(N);P2=0xff;break; case 5: P2=0xef;delay(N);P2=0xff;break; case 6: P2=0xdf;delay(N);P2=0xff;break; case 7: P2=0xbf;delay(N);P2=0xff;break; case 8: P2=0x7f;delay(N);P2=0xff;break; case 9: P3=0xfb;delay(N);P3=0xff;break;
case 10:P3=0xf7;delay(N);P3=0xff;break; case 11:P3=0xef;delay(N);P3=0xff;break; case 12:P3=0xdf;delay(N);P3=0xff;break; default: break; } }
/*键盘扫描函数*/ uchar scan()
- 2 -
{ H1=0;
H2=0;
L1=1;L2=1;L3=1;
if(L1==0||L2==0||L3==0) {
delay(10); if(L1==0||L2==0||L3==0) { H1=0;H2=1; if(L1==0) key=1; else if(L2==0) key=2; else if(L3==0) key=3; H1=1;H2=0;
if(L1==0) key=4; else if(L2==0) key=5; else if(L3==0) key=6; H1=0;H2=0;
while(L1==0||L2==0||L3==0);
}
}
return key; } void main() { uchar i,y=0; for(i=0;i<3;i++)/*闪三次*/ {
P2=0x00,P3=0xc3; delay(1000); P2=0xff,P3=0xff; delay(1000); }
while(!key)
{
- 3 -
scan();
} key=0;delay(N); /*顺时针转*/ L1: while(1) { if(y>12) y=0; scan(); if(key==1) {
key=0; break; }
LED(y);/*第y个灯亮*/ y++;/*下一个*/ delay(N); }
/*逆时针转*/ while(1) {
if(y<1) y=12; scan(); if(key==1) {
key=0; goto L1; }
LED(y);
delay(N); y--; } }
五、实验过程中遇到的问题及解决方法
问题1:如何实现顺、逆时针依次点亮流水灯?
解决:通过switch语句,并且改变case值是自加还是自减来实现依次点亮流水灯
- 4 -
问题2:当开通上电时,led只亮而没有闪烁三次? 解决:在熄灭led时没有加延时
问题3:一次点亮流水灯时第一个或最后一个灯总是不亮? 解决:case值的设定
问题4:在main函数中间定义的变量无法识别 解决:在main函数开头定义即可
问题5:用for循环执行顺时针循环按下开关后无法返回原点 解决:在程序开始处为变量赋初值即可
指导老师签字:
日期:2013/11/21
- 5 -