LED滚动显示算法及实现

前阵子做了LED控制板,LED控制显示的程序仍需编写。之前将汉字显示程序实现,最近需要实现滚动显示,于是考虑滚动显示算法。

程序编写之前需要将LED显示原理搞清楚,即控制板通过控制DM137来实现对LED灯的控制。对于LED显示屏,由于每个DM137有16个引脚,因此可用来控制16列或16行(如果灯颜色只有一种),具体需要查看硬件原理图,首先应该将显示方式弄清楚,然后确认实现算法。在本地端通过CPU控制板的16个引脚来直接控制扫描16列,对于每个DM137则通过一个循环将相应的控制信息通过SPI引脚输出至DM137。

For(i=0;i<16;i++)

         {

                   For(j=0;j<3;j++)

{

         AT91F_SPI_PUTCHAR(AT91C_BASE_SPI1,TESTDATA[I][J],0);

         While(!(AT91C_BASE_SPI1->SPI_SR& AT91C_SPI_TDRE);

         Wait();

}

//控制输出设置。

}

 

对于要显示的数据,均通过数组TESTDATA来实现,其中i是控制列,一共16列,j为DM137个数。CPU控制板需要将数据信息赋值给每个DM137(通过PUTCHAR函数实现)。这样每次扫描一列(每次扫描DM137的同一列),一共扫描十六列即可完成所有显示。这样实现较为容易,避免行扫描的繁琐。

 

对于滚动显示,每个DM137内部的滚动可由数组移位赋值得到。但若是想实现连贯性,即一个数据滚动显示完不同的DM137,则需要将不同DM137临界点的数据保存然后赋值给另一DM137临界列来实现。若是想实现由右向左的滚动效果,则需将要显示的数据赋值给最左侧的一列,然后依次滚动实现显示效果。当然,对于硬件内部实现结构的不同,需进行相应的变更,具体应查看硬件电路的实现原理。

For(j=0;j<3;j++)

{

         DataTemp[i]= TestData[0][j];                                       //保存临界值

         I++;

}

 

For(i=1;i<16;i++)

         For(j=0;j<3;j++)

{

         TestData[i-1][j]= TestData[i][j];             //实现15列的移动

}

 

For(j=0;j<2;j++)

{

TestData[15][j] = DataTemp[j+1];

}

 

TestData[15][2]=(hao1[shiftindex]<<8);

TestData[15][2]+=hao1[shiftindex+1];

Shiftindex +=2;

 

在滚动显示中,最重要的是需要搞明白LED屏的显示方式,然后根据显示方式编写具体函数来实现滚动显示。对于显示方式的查看,可编写相应的测试程序实现:控制单个点、单个列扫描、单个行扫描。

 

 

(文章原创,转载请声明)

你可能感兴趣的:(算法,实现,滚动,led,led)