本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
森哥的流水灯程序(C51单片机),看的明白你就超神了.
#include<AT89X51.h>
#define uint unsigned int
#define uchar unsigned char
uchar zhongduan=0,m=0,mn=0,ll=0,shezhi=0,tiaosu=0,moshi=1;
uint sudu=20,zuixiao=20,biansu=0;
uchar jian(void)
{
static uchar jianzhi=0,jiancha=0;
uchar i,k;
P3=0xFF;
k=(~P3)&0x3C;
switch (jiancha)
{
case 0:
if(k)
{
jiancha=1;
}
return(0);
case 1:
if(k)
{
for(i=0;i<=4;i++)
{
if(k<(1<<(i+2))) //不用==用<起到多按键仍成立
{
jianzhi=i; //因判断用小于号故当前按键为i-1
break;
}
}
jiancha=2;
}
else
jiancha=0;
return(0);
case 2:
if(!k)
{
jiancha=0;
return(jianzhi);
}
return(0);
default:
break;
}
}
void liushui1(void) //流水灯
{
P1=~(1<<m);
if(++ll>=(zuixiao+(7-m)*biansu))
{
ll=0;
if(m==7)
m=0;
else
m++;
}
}
void liushui2(void)
{
P1=~(1<<m);
if(++ll>=(zuixiao+(7-m)*biansu))
{
ll=0;
if(mn==0)
{
if(m==7)
{
mn=1;
}
else
m++;
}
if(mn==1)
{
if(m==0)
{
mn=0;
}
else
m--;
}
}
}
void liushui3(void)
{
P1=0xFF<<m;
if(++ll>=(zuixiao+(8-m)*biansu))
{
ll=0;
if(mn==0)
{
if(m==8)
{
mn=1;
}
else
m++;
}
if(mn==1)
{
if(m==0)
{
mn=0;
}
else
m--;
}
}
}
void liushui4(void)
{
if(mn==0)
{
P1=0xFF<<m;
}
else
{
P1=~(0xFF<<m);
}
if(++ll>=(zuixiao+(8-m)*biansu))
{
ll=0;
if(m==8)
{
m=0;
mn=!mn;
}
else
m++;
}
}
void liushui5(void)
{
P1=~((1<<m)|(1<<(7-m)));
if(++ll>=sudu)
{
ll=0;
if(m==7)
m=0;
else
m++;
}
}
void liushui6(void)
{
P1=(0xFF<<m)&(0xFF>>m);
if(++ll>=sudu)
{
ll=0;
if(mn==0)
{
if(m==4)
{
mn=1;
}
else
m++;
}
else
{
if(m==0)
{
mn=0;
}
else
m--;
}
}
}
void liushui7(void)
{
if(mn==0)
{
P1=(0xFF<<m)&(0xFF>>m);
}
else
{
P1=~((0xFF<<m)&(0xFF>>m));
}
if(++ll>=sudu)
{
ll=0;
if(m==4)
{
m=0;
mn=!mn;
}
else
m++;
}
}
void zui(void)
{
P1=~(1<<m);
if(++ll>=zuixiao)
{
ll=0;
if(m==7)
m=0;
else
m++;
}
}
void bian(void)
{
P1=0xFF>>(biansu/5);
}
void main(void)
{
uchar p;
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-5000)/256;
TL0=(65565-5000)%256;
TR0=1;
while(1)
{
if(zhongduan)
{
zhongduan=0;
p=jian();
if(p!=0)
{
ll=0;
mn=0;
m=0;
switch(p)
{
case 1:
if(shezhi)
shezhi=0;
else
{
shezhi=1;
tiaosu=0;
}
break;
case 2:
if(shezhi)
{
tiaosu=!tiaosu;
}
else
{
if(moshi>=7)
moshi=1;
else
moshi++;
}
case 3:
{
if(shezhi)
{
if(tiaosu)
{
if(biansu==40)
{
biansu=0;
}
else
biansu+=5;
}
else
{
if (320<=zuixiao+8*biansu)
{
zuixiao=10;
}
else
{
zuixiao+=10;
}
}
}
else
{
if(sudu>=320)
{
sudu=10;
}
else
{
sudu+=10;
}
}
break;
}
case 4:
{
if(shezhi)
{
if(tiaosu)
{
if(biansu==0)
{
biansu=35;
}
else
biansu-=5;
}
else
{
if (zuixiao<=5)
{
zuixiao=320-8*biansu;
}
else
{
zuixiao-=5;
}
}
}
else
{
if(sudu==5)
{
sudu=315;
}
else
{
sudu-=5;
}
}
break;
}
default:
break;
}
}
if(shezhi)
{
if(tiaosu)
{
bian();
}
else
{
zui();
}
}
else
{
switch(moshi)
{
case 1:
liushui1();
break;
case 2:
liushui2();
break;
case 3:
liushui3();
break;
case 4:
liushui4();
break;
case 5:
liushui5();
break;
case 6:
liushui6();
break;
case 7:
liushui7();
break;
}
}
}
}
}
void zhong(void) interrupt 1
{
zhongduan=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
}
灯光脚是 p1 x8个 按键是 p32 p33 p34 p35
|