数码之家

 找回密码
 立即注册
搜索
查看: 856|回复: 0

[Arduino] Arduino 点亮16*64屏幕的代码

[复制链接]
发表于 2022-2-11 13:56:26 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
  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. }
复制代码


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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-26 11:16 , Processed in 0.171601 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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