极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 76659|回复: 31

[已解决]Arduino驱动LED显示屏出现问题,大家帮忙研究下文字滚动的代码

[复制链接]
发表于 2014-2-12 15:42:30 | 显示全部楼层 |阅读模式
本帖最后由 shiow1984 于 2014-7-8 14:15 编辑

帮忙看看出现的问题,检查修改代码,谢谢!

感谢ZZZ大侠的文章,让我将08接口的16*64 LED显示屏点亮了。原帖【Z】Arduino也能驱动LED显示屏,LED业界标准Arduino驱动方案解析  

ZZZ大侠的帖子里只有现实静态文字的代码,通过网上搜索,我只找到了51版滚动文字显示代码,通过这些资料和自己的研究,已修改为arduino版的,但是显示还是出现问题,多行文字前莫名出现一些小横线,如图所示:


最近查看帖子,在ZZZ大侠的帖子最后发现 iceicon网友发的arduino 滚动屏程序,下载后显示正常,如下图:




我将我改的程序发在下面,请大侠帮我看看:


  1. #define RowA 2   
  2. #define RowB 3
  3. #define RowC 4
  4. #define RowD 5
  5. //业界所采用的ABCD 08驱动模式
  6. /*  2 ABCD G1 G2 STB CLK 16 1 N N N EN R1 R2 N N 15*/
  7. int hc138en=6; //EN口

  8. //使用了硬件SPI,以下脚不能更改
  9. #define R1 11          //数据出    MOSI
  10. #define CLK 13         //时钟    SCK
  11. #define STB 10         //595 刷新显示  SS  锁存         STB(LT)为锁存信号,CLK(CK)为时钟信号
  12. #define DATAIN  12     //数据入,读FLASH时有用  MISO

  13. char yid,h;                     //YID为移动计数器,H为行段计数器
  14. int zimuo;                   //字模计数器

  15. byte Zdate[10];  //缓存
  16. byte zzz[] =
  17. {/*------------------------------------------------------------------------------
  18. ;  源文件 / 文字 : 吉祥如意
  19. ;  宽×高(像素): 64×16
  20. ------------------------------------------------------------------------------*/
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  29. 0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,
  30. 0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x00,0x00,/*"吉",0*/
  31. 0x21,0x04,0x10,0x88,0x10,0x50,0xFD,0xFE,0x04,0x20,0x08,0x20,0x11,0xFC,0x38,0x20,
  32. 0x54,0x20,0x94,0x20,0x13,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,/*"祥",1*/
  33. 0x10,0x00,0x10,0x00,0x18,0x00,0x10,0x7E,0xFE,0x42,0x22,0x42,0x22,0x42,0x22,0x42,
  34. 0x22,0x42,0x24,0x42,0x14,0x42,0x08,0x42,0x14,0x7E,0x23,0x42,0x42,0x42,0x80,0x00,/*"如",2*/
  35. 0x01,0x00,0x3F,0xFC,0x08,0x20,0x04,0x40,0xFF,0xFE,0x00,0x00,0x1F,0xF0,0x12,0x10,
  36. 0x11,0x10,0x1F,0xF0,0x00,0x00,0x29,0x08,0x28,0x84,0x68,0x14,0x07,0xF0,0x00,0x00,/*"意",3*/

  37. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  43. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45. };

  46. void spi_transfer(volatile char data)
  47. {
  48.   SPDR = data;                    // Start the transmission
  49.   while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  50.   {
  51.   };
  52.   //return SPDR;                    // return the received byte
  53. }


  54. void hc138sacn(byte r){  //输出行线状态ABCD (A低,D高)
  55.     digitalWrite(RowA,(r & 0x01));
  56.     digitalWrite(RowB,(r & 0x02));
  57.     digitalWrite(RowC,(r & 0x04));
  58.     digitalWrite(RowD,(r & 0x08));
  59. }
  60. /**************************************************************************************
  61. 左移显示数据生成模块:(功能相当于有返回值的函数 )
  62. ***************************************************************************************/
  63. char two_onebyteL(char h1,char h2)
  64. {
  65. char temp,tempcol;          //输出变量;列移动位数变量。
  66. if(yid<8)
  67. tempcol=yid;
  68. else
  69. tempcol=yid-8;
  70. temp=(h1<<tempcol)|(byte(h2)>>(8-tempcol));    //左移显示      // 7楼仁兄的解决方案是将h2强制转换成无符号的byte类型
  71. temp=255-temp;           
  72. return temp;            //将显示数据返回显示输出函数。
  73. }
  74. /*************************************************************************************
  75. 左移待显示数据调取函数
  76. *************************************************************************************/
  77. void loadoneline_L(void)
  78. {
  79. char s;               //此处不要用uchar定义s
  80. for(s=4;s>=0;s--)           //s值为屏数加1(16*16为一屏)
  81. {
  82. Zdate[2*s]=zzz[zimuo+32*s+2*h];
  83. Zdate[2*s+1]=zzz[zimuo+1+32*s+2*h];   //左移显示
  84. }
  85. }

  86. /**********************************************************************************
  87. 左移显示数据输出函数 : 为显示数据生成模块的h1、h2赋值并且输出合成后的新的h1、h2数据
  88. ***********************************************************************************/
  89. void sendoneline_L(void)
  90. {
  91. char s;char inc;
  92. if(yid<8)inc=0;else inc=1;
  93. for(s=0+inc;s<8+inc;s++)
  94. {   //左移显示:单屏s=1+,4屏s=7+,8屏s=15+;
  95. spi_transfer(two_onebyteL(Zdate[s],Zdate[s+1]));
  96. }
  97. }
  98. int uiAllData = sizeof(zzz)-128;  //定义显示字幕数据的长度 2048/32=64
  99. void setup ()
  100. {
  101.     pinMode(RowA, OUTPUT);
  102.     pinMode(RowB, OUTPUT);
  103.     pinMode(RowC, OUTPUT);
  104.     pinMode(RowD, OUTPUT); //138片选
  105.     pinMode(hc138en, OUTPUT); //138 使能
  106.     pinMode(R1, OUTPUT);//595 数据
  107.     pinMode(CLK, OUTPUT); //595 时钟
  108.     pinMode(STB, OUTPUT); //595 使能
  109.     pinMode(DATAIN, INPUT); //595 使能
  110.       //digitalWrite(hc138d, HIGH);
  111.   Serial.begin(19200);
  112. SPCR = (1<<SPE)|(1<<MSTR);
  113. delay(10);
  114. }
  115.   
  116. void loop ()
  117. {
  118. char i,d=10;
  119. yid=0;
  120. h=0;
  121. zimuo=0;                                                   
  122. while(1)
  123.   {
  124.        while(yid<16)                             //数据移位。
  125.        {
  126.             for(i=0;i<d;i++)                      //移动速度
  127.               {
  128.                for(h=0;h<16;h++)
  129.                 {   
  130.                 loadoneline_L();
  131.                 sendoneline_L();
  132.                
  133.                 digitalWrite(hc138en, 1);  //关闭显示
  134.                 digitalWrite(STB, 0);      //595刷新      
  135.                 digitalWrite(STB, 1);
  136.                 hc138sacn(h);            //换行   
  137.                 delayMicroseconds(50) ;   //节电用,
  138.                 digitalWrite(hc138en, 0);  //开启显示
  139.                 delayMicroseconds(500) ;  //刷新频率调,差不多60HZ,1/16间隔                        
  140.                 }                           
  141.                }
  142.              yid++;                        //移动一步  
  143.           }
  144.       yid=0;
  145.       zimuo=zimuo+32;                    //后移一个字,  
  146.       if(zimuo>= uiAllData )         //定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后 重新循环
  147.    zimuo=0;
  148.   }
  149. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-12 17:03:00 | 显示全部楼层
好东西,学习了。
回复 支持 反对

使用道具 举报

发表于 2014-2-12 19:58:39 | 显示全部楼层
MARK~~~~~~~以备后用
回复 支持 反对

使用道具 举报

发表于 2014-2-12 21:31:05 | 显示全部楼层
MARK~~~~~~~以备后用
回复 支持 反对

使用道具 举报

发表于 2014-2-12 22:19:29 | 显示全部楼层
好东西啊,谢谢分享
回复 支持 反对

使用道具 举报

发表于 2014-5-24 23:30:03 | 显示全部楼层
控制信号的总结:&#160;
CLK时钟信号:提供给移位寄存器的移位脉冲,每一个脉冲将引起数据移入或移出一位。数据口上的
数据必须与时钟信号协调才能正常传送数据,数据信号的频率必须是时钟信号的频率的1/2倍。在任何情况下,当时钟信号有异常时,会使整板显示杂乱无章
查到的,可能有用,刚接触不是很懂
回复 支持 反对

使用道具 举报

发表于 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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-8 14:11:03 | 显示全部楼层
fufu 发表于 2014-7-6 08:24
/**************************************************************************************
左移显示数据 ...

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

使用道具 举报

发表于 2014-7-10 19:23:48 | 显示全部楼层
我有一块32X6的08接口屏,不知道如何弄能指点一下吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-16 10:49:53 | 显示全部楼层
shh80s 发表于 2014-7-10 19:23
我有一块32X6的08接口屏,不知道如何弄能指点一下吗?

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

使用道具 举报

发表于 2014-7-22 21:51:49 | 显示全部楼层

我是按照这个图片接的。用的是64*16的LED显示屏。然后屏幕都不亮。
回复 支持 反对

使用道具 举报

发表于 2014-7-22 21:52:54 | 显示全部楼层
如图接进去可是都没用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-25 10:16:47 | 显示全部楼层
daniu101130 发表于 2014-7-22 21:52
如图接进去可是都没用。

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

使用道具 举报

 楼主| 发表于 2014-7-25 10:20:20 | 显示全部楼层
daniu101130 发表于 2014-7-22 21:52
如图接进去可是都没用。

还是先检查连线有没有问题吧,接口有没有接触不良的地方;
回复 支持 反对

使用道具 举报

发表于 2014-7-25 16:27:44 | 显示全部楼层
shiow1984 发表于 2014-7-25 10:20
还是先检查连线有没有问题吧,接口有没有接触不良的地方;

接线完全正常。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 17:09 , Processed in 0.074667 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表