电子实习是西工大大多数学生绕不开的一门实习课程。单片机是电子实习课程中较为重要的一部分,需要上两次。我们在单片机编程时在西工大电脑机房老系统上往往由于大一学习的C语言忘得一干二净而无从下手。流水灯成了流水账。
废话不多说,仅供参考。7+1是指7个常规设置题和一个你的自编题。自编题想拿高分可以把呼吸灯子程序和循环移位等进行结合。
另外这个答案我在最后实现的触屏控制较为简陋,仅动用了k1,同学们可以尝试综合多个开关。同时while语句的位置也会影响你最终循环效果是否出现。
#include<stc8a.h>
#include<intrins.h>
#define ucharunsigned char
#define uint unsigned int
sbit k1=P3^2;
sbit led=P4^1;
void delay_us(uint us)
{
uint a; uchar b;
for(b= 0;b<2;b++)
for(a= 0;a<us;a++);
}
void start_1()
{uchar a,b;
b=0xfe;
for(a=0;a<7;a++)
{
P0=b;
delay_us(50000);
b=_crol_(b,1);
}
for(a=0;a<7;a++)
{P0=b;
delay_us(50000);
b=_crol_(b,1);
}
}
void start_2()
{uchar a,b;
b=0xfe;
for(a=0;a<7;a++)
{
P0=0xe7&b;
delay_us(50000);
b=_crol_(b,1);
}
for(a=0;a<7;a++)
{P0=0xe7&b;
delay_us(50000);
b=_cror_(b,1);
}
}
void start_3()
{uchar a,b,c;
b=0x7f;
c=0xfe;
for(a=0;a<3;a++)
{P0=c&b;
delay_us(50000);
c=_cror_(c,1);
b=_cror_(b,1);
}
for(a=0;a<3;a++)
{
P0=c&b;
delay_us(50000);
c=_cror_(c,1);
b=_crol_(b,1);
}
}
void start_4()
{
uchar a,b,c;
b=0x7f;
for(a=0;a<7;a++)
{P0=b;
delay_us(50000);
b=b>>1;
}
c=0xff;
b=0x00;
for(a=0;a<7;a++)
{P0=~(b^c);
delay_us(50000);
c=c<<1;
}
}
void start_5()
{
uchar a,b,c,i;
c=0xff;
for(i=0;i<9;i++)
{b=0xfe;
for(a=0;a<8;a++)
{P0=b&c;
delay_us(50000);
b=_crol_(b,1);
}
c=c>>1;
}
}
void start_6()
{
uchar a,b,c,k,j;
b=0xbf;c=0x7f;
P0=c;
delay_us(50000);
k=2;
j=1;
for(a=0;;a++)
{
if(j+1==k)
{k++;b=_cror_(b,1);
c=0x7f;j=1;}
else{c=_cror_(c,1);j++;}
P0=(b&c);
delay_us(50001);
if(k==8&&j==7)
break;
}
}
void start_7()
{
uint a,b=1000;
for(a=1;a<1000;a++)
{
P0=0xff;
delay_us(b--);
P0=0x00;
delay_us(a);
for(a=1;a<1000;a++)
{
P0=0x00;
delay_us(b--);
P0=0xff;
delay_us(a);
}
}
}
void start_8()
{
uchar a,b;
b=0x7f;
for(a=0;a<7;a++)
{P0=0xaa&b;
delay_us(50001);
b=_cror_(b,1);
}
b=0xfe;
for(a=0;a<7;a++)
{P0=0x55&b;
delay_us(50001);
b=_crol_(b,1);
}
}
void main()
{
led=0;
if(k1==0)
{
while(1)
{
start_1();
start_2();
start_3();
start_4();
start_5();
start_6();
start_7();
start_8();
}
}
}