shiow1984 发表于 2014-2-12 15:42:30

[已解决]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;
}
}

Cupid 发表于 2014-2-12 17:03:00

好东西,学习了。

darkorigin 发表于 2014-2-12 19:58:39

MARK~~~~~~~以备后用

wetnt 发表于 2014-2-12 21:31:05

MARK~~~~~~~以备后用

万马奔腾 发表于 2014-2-12 22:19:29

好东西啊,谢谢分享

arduino小菜鸟 发表于 2014-5-24 23:30:03

控制信号的总结: 
CLK时钟信号:提供给移位寄存器的移位脉冲,每一个脉冲将引起数据移入或移出一位。数据口上的
数据必须与时钟信号协调才能正常传送数据,数据信号的频率必须是时钟信号的频率的1/2倍。在任何情况下,当时钟信号有异常时,会使整板显示杂乱无章
查到的,可能有用,刚接触不是很懂

fufu 发表于 2014-7-6 08:24:03

本帖最后由 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

shiow1984 发表于 2014-7-8 14:11:03

fufu 发表于 2014-7-6 08:24 static/image/common/back.gif
/**************************************************************************************
左移显示数据 ...

确实是这么回事,我重新下载程序改了一下,确实好了;一直想不通问题出在哪里,这位兄弟挺厉害!!

shh80s 发表于 2014-7-10 19:23:48

我有一块32X6的08接口屏,不知道如何弄能指点一下吗?

shiow1984 发表于 2014-7-16 10:49:53

shh80s 发表于 2014-7-10 19:23 static/image/common/back.gif
我有一块32X6的08接口屏,不知道如何弄能指点一下吗?

你可以按照我前面的接线方法先接上线,然后改帖子中的相关参数,不过32*6的确实少见,是不是应该是32*8? 我的QQ:276353914

daniu101130 发表于 2014-7-22 21:51:49

http://bbs.kechuang.org/static/image/common/emp.gif
我是按照这个图片接的。用的是64*16的LED显示屏。然后屏幕都不亮。

daniu101130 发表于 2014-7-22 21:52:54

如图接进去可是都没用。

shiow1984 发表于 2014-7-25 10:16:47

daniu101130 发表于 2014-7-22 21:52 static/image/common/back.gif
如图接进去可是都没用。

你的分辨率是多少?不是接上去就能亮的啊还得上面的程序上面的程序为16*64 的LED屏用的,其它分辨率可能显示不正常

shiow1984 发表于 2014-7-25 10:20:20

daniu101130 发表于 2014-7-22 21:52 static/image/common/back.gif
如图接进去可是都没用。

还是先检查连线有没有问题吧,接口有没有接触不良的地方;

daniu101130 发表于 2014-7-25 16:27:44

shiow1984 发表于 2014-7-25 10:20 static/image/common/back.gif
还是先检查连线有没有问题吧,接口有没有接触不良的地方;

接线完全正常。
页: [1] 2 3
查看完整版本: [已解决]Arduino驱动LED显示屏出现问题,大家帮忙研究下文字滚动的代码