前阵子做了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屏的显示方式,然后根据显示方式编写具体函数来实现滚动显示。对于显示方式的查看,可编写相应的测试程序实现:控制单个点、单个列扫描、单个行扫描。
(文章原创,转载请声明)