缘由单片机595扩展通过按键控制8*8流水灯速度跟方向-后端-CSDN问答
#include "REG52.h"
sbit fx=P1^7;
sbit sd=P1^6;
sbit zx=P1^5;
sbit ds=P1^0;//数据线 595的14脚
sbit sh=P1^1;//数据输入时钟线 595的11脚
sbit st=P1^2;//输出存储器锁存时钟线 595的12脚
unsigned char code dzshuju[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00};
unsigned char code dzwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void QuDong595(unsigned char sj)
{
unsigned char aa=8;
while(aa--)
{
ds=sj>>7;
sj<<=1;//十六进制数据发送
sh=1;//上升沿发生移位 上升沿时数据寄存器的数据锁存。有些板子可能需要更长的延时时序可重复写sh=1;多次语句作为延时用不调用函数头文件#include <intrins.h>中的_nop_();
sh=0;
}
st=0;
st=1;//上升沿将数据送到输出锁存器
st=0;
}
void main()
{
unsigned char h=0,l=0,xd=0,ys=0,q=0,x=0,dy=0,s=0,d=0,z=0;
while(1)
{
if(z==0){QuDong595(~dzshuju[h+q]);P2=~dzwei[(x>0?7-l:l)];}
else{QuDong595(dzwei[(x>0?7-l:l)]);P2=dzshuju[h+q];}
while(++dy);QuDong595(0xff);
if(++l>7)h=l=0;else h=l;
//之上实现点阵显示一个字符
if(++ys==0)if(++d>s)if(++q>8*2)q=0;else;else d=0;else;
//之上实现点阵移动和速度
if(fx==0&&++xd==0){if(x==0)x=1;else x=0;while(fx==0);}
//之上按键处理调节方向
if(sd==0&&++xd==0){if(++s>7)s=0;P3=s;while(sd==0);}
//之上按键处理调节速度
if(zx==0&&++xd==0){if(z==0)z=1;else z=0;while(zx==0);}
//之上按键处理调节转向
}
}