[已解决]Arduino驱动LED显示屏出现问题,大家帮忙研究下文字滚动的代码
本帖最后由 shiow1984 于 2014-7-8 14:15 编辑帮忙看看出现的问题,检查修改代码,谢谢!
感谢ZZZ大侠的文章,让我将08接口的16*64 LED显示屏点亮了。原帖【Z】Arduino也能驱动LED显示屏,LED业界标准Arduino驱动方案解析
ZZZ大侠的帖子里只有现实静态文字的代码,通过网上搜索,我只找到了51版滚动文字显示代码,通过这些资料和自己的研究,已修改为arduino版的,但是显示还是出现问题,多行文字前莫名出现一些小横线,如图所示:
最近查看帖子,在ZZZ大侠的帖子最后发现 iceicon网友发的arduino 滚动屏程序,下载后显示正常,如下图:
我将我改的程序发在下面,请大侠帮我看看:
#define RowA 2
#define RowB 3
#define RowC 4
#define RowD 5
//业界所采用的ABCD 08驱动模式
/*2 ABCD G1 G2 STB CLK 16 1 N N N EN R1 R2 N N 15*/
int hc138en=6; //EN口
//使用了硬件SPI,以下脚不能更改
#define R1 11 //数据出 MOSI
#define CLK 13 //时钟 SCK
#define STB 10 //595 刷新显示SS锁存 STB(LT)为锁存信号,CLK(CK)为时钟信号
#define DATAIN12 //数据入,读FLASH时有用MISO
char yid,h; //YID为移动计数器,H为行段计数器
int zimuo; //字模计数器
byte Zdate;//缓存
byte zzz[] =
{/*------------------------------------------------------------------------------
;源文件 / 文字 : 吉祥如意
;宽×高(像素): 64×16
------------------------------------------------------------------------------*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,
0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x00,0x00,/*"吉",0*/
0x21,0x04,0x10,0x88,0x10,0x50,0xFD,0xFE,0x04,0x20,0x08,0x20,0x11,0xFC,0x38,0x20,
0x54,0x20,0x94,0x20,0x13,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,/*"祥",1*/
0x10,0x00,0x10,0x00,0x18,0x00,0x10,0x7E,0xFE,0x42,0x22,0x42,0x22,0x42,0x22,0x42,
0x22,0x42,0x24,0x42,0x14,0x42,0x08,0x42,0x14,0x7E,0x23,0x42,0x42,0x42,0x80,0x00,/*"如",2*/
0x01,0x00,0x3F,0xFC,0x08,0x20,0x04,0x40,0xFF,0xFE,0x00,0x00,0x1F,0xF0,0x12,0x10,
0x11,0x10,0x1F,0xF0,0x00,0x00,0x29,0x08,0x28,0x84,0x68,0x14,0x07,0xF0,0x00,0x00,/*"意",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void spi_transfer(volatile char data)
{
SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
{
};
//return SPDR; // return the received byte
}
void hc138sacn(byte r){//输出行线状态ABCD (A低,D高)
digitalWrite(RowA,(r & 0x01));
digitalWrite(RowB,(r & 0x02));
digitalWrite(RowC,(r & 0x04));
digitalWrite(RowD,(r & 0x08));
}
/**************************************************************************************
左移显示数据生成模块:(功能相当于有返回值的函数 )
***************************************************************************************/
char two_onebyteL(char h1,char h2)
{
char temp,tempcol; //输出变量;列移动位数变量。
if(yid<8)
tempcol=yid;
else
tempcol=yid-8;
temp=(h1<<tempcol)|(byte(h2)>>(8-tempcol)); //左移显示 // 7楼仁兄的解决方案是将h2强制转换成无符号的byte类型
temp=255-temp;
return temp; //将显示数据返回显示输出函数。
}
/*************************************************************************************
左移待显示数据调取函数
*************************************************************************************/
void loadoneline_L(void)
{
char s; //此处不要用uchar定义s
for(s=4;s>=0;s--) //s值为屏数加1(16*16为一屏)
{
Zdate=zzz;
Zdate=zzz; //左移显示
}
}
/**********************************************************************************
左移显示数据输出函数 : 为显示数据生成模块的h1、h2赋值并且输出合成后的新的h1、h2数据
***********************************************************************************/
void sendoneline_L(void)
{
char s;char inc;
if(yid<8)inc=0;else inc=1;
for(s=0+inc;s<8+inc;s++)
{ //左移显示:单屏s=1+,4屏s=7+,8屏s=15+;
spi_transfer(two_onebyteL(Zdate,Zdate));
}
}
int uiAllData = sizeof(zzz)-128;//定义显示字幕数据的长度 2048/32=64
void setup ()
{
pinMode(RowA, OUTPUT);
pinMode(RowB, OUTPUT);
pinMode(RowC, OUTPUT);
pinMode(RowD, OUTPUT); //138片选
pinMode(hc138en, OUTPUT); //138 使能
pinMode(R1, OUTPUT);//595 数据
pinMode(CLK, OUTPUT); //595 时钟
pinMode(STB, OUTPUT); //595 使能
pinMode(DATAIN, INPUT); //595 使能
//digitalWrite(hc138d, HIGH);
Serial.begin(19200);
SPCR = (1<<SPE)|(1<<MSTR);
delay(10);
}
void loop ()
{
char i,d=10;
yid=0;
h=0;
zimuo=0;
while(1)
{
while(yid<16) //数据移位。
{
for(i=0;i<d;i++) //移动速度
{
for(h=0;h<16;h++)
{
loadoneline_L();
sendoneline_L();
digitalWrite(hc138en, 1);//关闭显示
digitalWrite(STB, 0); //595刷新
digitalWrite(STB, 1);
hc138sacn(h); //换行
delayMicroseconds(50) ; //节电用,
digitalWrite(hc138en, 0);//开启显示
delayMicroseconds(500) ;//刷新频率调,差不多60HZ,1/16间隔
}
}
yid++; //移动一步
}
yid=0;
zimuo=zimuo+32; //后移一个字,
if(zimuo>= uiAllData ) //定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后 重新循环
zimuo=0;
}
} 好东西,学习了。 MARK~~~~~~~以备后用 MARK~~~~~~~以备后用 好东西啊,谢谢分享 控制信号的总结:
CLK时钟信号:提供给移位寄存器的移位脉冲,每一个脉冲将引起数据移入或移出一位。数据口上的
数据必须与时钟信号协调才能正常传送数据,数据信号的频率必须是时钟信号的频率的1/2倍。在任何情况下,当时钟信号有异常时,会使整板显示杂乱无章
查到的,可能有用,刚接触不是很懂 本帖最后由 fufu 于 2014-7-6 08:49 编辑
/**************************************************************************************
左移显示数据生成模块:(功能相当于有返回值的函数 )
***************************************************************************************/
char two_onebyteL(char h1,char h2)
{
char temp,tempcol; //输出变量;列移动位数变量。
if(yid<8)
tempcol=yid;
else
tempcol=yid-8;
temp=(h1<<tempcol)|(byte(h2)>>(8-tempcol)); //左移显示
temp=255-temp;
return temp; //将显示数据返回显示输出函数。
}
红色的是更改过的,实现成功。
因为char是有符号的(有正有负),
如:
char i=-2; //i==B10000010
i=i>>1; //i==B11000001
所以要转成无符号型,在这里我用的是byte
http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference:bitshift fufu 发表于 2014-7-6 08:24 static/image/common/back.gif
/**************************************************************************************
左移显示数据 ...
确实是这么回事,我重新下载程序改了一下,确实好了;一直想不通问题出在哪里,这位兄弟挺厉害!! 我有一块32X6的08接口屏,不知道如何弄能指点一下吗? shh80s 发表于 2014-7-10 19:23 static/image/common/back.gif
我有一块32X6的08接口屏,不知道如何弄能指点一下吗?
你可以按照我前面的接线方法先接上线,然后改帖子中的相关参数,不过32*6的确实少见,是不是应该是32*8? 我的QQ:276353914 http://bbs.kechuang.org/static/image/common/emp.gif
我是按照这个图片接的。用的是64*16的LED显示屏。然后屏幕都不亮。 如图接进去可是都没用。 daniu101130 发表于 2014-7-22 21:52 static/image/common/back.gif
如图接进去可是都没用。
你的分辨率是多少?不是接上去就能亮的啊还得上面的程序上面的程序为16*64 的LED屏用的,其它分辨率可能显示不正常 daniu101130 发表于 2014-7-22 21:52 static/image/common/back.gif
如图接进去可是都没用。
还是先检查连线有没有问题吧,接口有没有接触不良的地方; shiow1984 发表于 2014-7-25 10:20 static/image/common/back.gif
还是先检查连线有没有问题吧,接口有没有接触不良的地方;
接线完全正常。