51单片机实现8x8LED灯阵动态显示移动文字

话不多说,先上代码。


//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以内就能弄完。


教训:做好事前打算,不要出现问题的时候再去想为什么,明明这个问题就可以在构建解决问题方法的时候解决。思考固然难受,但是只要你入门,多加认真的训练,就会收获许多。



不管怎么样,很开心,可以做下一个程序了。


猜你喜欢

转载自blog.csdn.net/xiaoxiaobail/article/details/80558788