话不多说,先上代码。
//test1.h
#include"reg51.h"
#include"intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit RCLK =P3^5;
sbit SER =P3^4;
void delay(u16 i);
void DisPlay();
void Hc595SendByte(u8 dat);
void moveP();
//hanshu.c
#include"test1.h"
u8 LedDuan[8]={0x55,0x7f,0x00,0x00,0x7f,0x55,0xd5,0x55};
u8 LedWei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe} ;
void Hc595SendByte(u8 dat)
{
u16 a;
RCLK=0;
SRCLK=0;
for(a=0;a<8;a++)
{
SER=dat>> 7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
void delay(u16 i){ while(i--);}
void DisPlay()
{
u16 b,a;
P0=0x81;
for(a=0;a<70;a++){ //这里的a是因为视觉暂留效应,循环时间长一些,可以使得亮度更亮。
for(b=0;b<8;b++)
{
P0=LedWei[b]; //注意先把P0口赋值,在送段选,不然的话会出现“鬼影”
_nop_();
_nop_(); //这个数目没有要求
_nop_();
Hc595SendByte(LedDuan[b]);
_nop_();
_nop_();
_nop_();
_nop_();
Hc595SendByte(0x00);
} }
}
void moveP()
{
u8 temp=0;
temp=LedDuan[0];
LedDuan[0]=LedDuan[1];
LedDuan[1]=LedDuan[2];
LedDuan[2]=LedDuan[3];
LedDuan[3]=LedDuan[4]; //移位,不知道为什么我用函数,也就是把第一个移到最后一位,实现不了,程序只移动一位。
LedDuan[4]=LedDuan[5];
LedDuan[5]=LedDuan[6];
LedDuan[6]=LedDuan[7];
LedDuan[7]=temp;
}
test1.c
#include"test1.h"
void main()
{
while(1)
{ DisPlay();
moveP(); }
}
原谅我个学生目前还没有形成好的写代码习惯,以后注意。
一开始没有过多思考,使得浪费了大概半小时时间做无用的东西————我一开始是把P0和LedDuan同时移动的,但之后发现没有必要,只需要LedDuan移动即可,并且由于一开始P0的赋值有错误,使得浪费了不小时间。
总共用时4h;
如果事先做好规划的话,
大概1h以内就能弄完。
教训:做好事前打算,不要出现问题的时候再去想为什么,明明这个问题就可以在构建解决问题方法的时候解决。思考固然难受,但是只要你入门,多加认真的训练,就会收获许多。
不管怎么样,很开心,可以做下一个程序了。