搜索
热搜: ROHM 模拟 车载
查看: 2690|回复: 2

[活动] 16x16点阵LED屏

  [复制链接]

该用户从未签到

6

主题

1963

帖子

0

精华

论坛元老

最后登录
2024-4-18
发表于 2019-3-22 09:51:14 | 显示全部楼层 |阅读模式
本帖最后由 Angel_YY 于 2019-4-3 20:09 编辑

由于最近正在准备为自家孩子教授编程课程,所以准备为孩子做一个可以编程控制的led阵列显示屏,可以用来显示字母、汉字和简单的图形,甚至可以编程实现贪吃蛇这类简单的游戏,阵列显示定义为16*16的方阵。

主控:Arduino UNO。
驱动:74HC138*2、74HC595*2
LED:SML-S13UT
数量:256颗
0001.png
在LED驱动部分,使用两片74HC138作为点阵的行控制驱动芯片。
0002.png
使用两片74HC595作为LED阵列的列控制。
0003.png
电源采用外接5V,通讯接口通过杜邦线连接到Arduino UNO的数字2~9接口。
Arduino代码如下:
  1. #include <Arduino.h>

  2. //IO配置
  3. #define LEDARRAY_D 2
  4. #define LEDARRAY_C 3
  5. #define LEDARRAY_B 4
  6. #define LEDARRAY_A 5
  7. #define LEDARRAY_G 6
  8. #define LEDARRAY_DI 7
  9. #define LEDARRAY_CLK 8
  10. #define LEDARRAY_LAT 9

  11. #define led 13

  12. #define Num_Word 1        //液晶能显示的汉字个数

  13. unsigned char Display_Buffer[2];
  14. unsigned char Display_Swap_Buffer[Num_Word][32]={0};          //显示缓冲区
  15. bool Shift_Bit = 0;
  16. bool Flag_Shift = 0;
  17. unsigned char Timer0_Count = 0;
  18. unsigned char temp = 0x80;
  19. unsigned char Shift_Count = 0;
  20. unsigned char Display_Word_Count = 0;

  21. #define Num_Of_Word 6
  22. const unsigned char Word[Num_Of_Word][32] =
  23. {
  24.    
  25. 0xFF,0xC0,0xDB,0xDB,0xDB,0xC0,0xFD,0xFB,0xF0,0xEF,0x97,0xFB,0xFD,0xFC,0xE3,0x1F,
  26. 0xFF,0x07,0xB7,0xB7,0xB7,0x07,0xFF,0xFF,0x0F,0xEF,0xDF,0xBF,0x7F,0xFF,0xFF,0xFF,/*"罗",0*/

  27. 0xEF,0xEF,0xEF,0xEF,0x03,0xDB,0xDB,0xD8,0xDA,0xB6,0xD6,0xEE,0xD6,0xBB,0x7B,0xFF,
  28. 0xFF,0x03,0x7B,0x5B,0x6B,0x7B,0x7B,0x01,0xFB,0xBB,0xDB,0xFB,0x01,0xFB,0xD7,0xEF,/*"姆",1*/

  29. 0xEF,0xEF,0xEF,0xEC,0x03,0xEF,0xEF,0xEA,0xE7,0xCF,0x2F,0xEF,0xEF,0xEF,0xAE,0xD9,
  30. 0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0x03,0x7B,0x77,0xB7,0xAF,0xDF,0xAF,0x77,0xF9,/*"技",2*/

  31. 0xFE,0xFE,0xFE,0xFE,0x80,0xFC,0xFA,0xFA,0xF6,0xEE,0xDE,0xBE,0x7E,0xFE,0xFE,0xFE,
  32. 0xFF,0xDF,0xEF,0xEF,0x03,0x7F,0xBF,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFF,0xFF,0xFF,/*"术",3*/

  33. 0xDF,0xEF,0xEF,0x07,0xF7,0xEF,0xEC,0xC7,0xAB,0x6B,0xEF,0xEF,0xEF,0xEF,0xE8,0xEF,
  34. 0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xFF,/*"社",4*/

  35. 0xFF,0x80,0xBF,0xBF,0xBB,0xBD,0xBE,0xBF,0xBE,0xBD,0xBB,0xB7,0xBF,0xBF,0x80,0xFF,
  36. 0xFF,0x03,0xFF,0xEF,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xEF,0xFF,0xFF,0x01,0xFF,/*"区",5*/



  37. };

  38. void setup()
  39. {
  40.   pinMode(LEDARRAY_D, OUTPUT);
  41.   pinMode(LEDARRAY_C, OUTPUT);
  42.   pinMode(LEDARRAY_B, OUTPUT);
  43.   pinMode(LEDARRAY_A, OUTPUT);
  44.   pinMode(LEDARRAY_G, OUTPUT);
  45.   pinMode(LEDARRAY_DI, OUTPUT);
  46.   pinMode(LEDARRAY_CLK, OUTPUT);
  47.   pinMode(LEDARRAY_LAT, OUTPUT);

  48.   Clear_Display();
  49. }

  50. void loop()
  51. {
  52.   unsigned int i;
  53.   for(i = 0 ; i < 10; i ++)     //移动速度设定
  54.   {
  55.     Display(Display_Swap_Buffer);
  56.   }
  57.   Display_Word_Count = Shift_Count/16;        //计算当前显示第几个字
  58.   Calc_Shift();
  59.   Shift_Count++;
  60.   if(Shift_Count == (Num_Of_Word+1)*16 )        //移动次数
  61.   {
  62.     Shift_Count = 0;        
  63.   }

  64. }

  65. //************************************************************
  66. //清空缓冲区
  67. //************************************************************
  68. void Clear_Display()
  69. {
  70.   unsigned char i,j;
  71.   for(j = 0 ; j < Num_Word; j++)
  72.   {
  73.     for(i = 0 ; i < 32 ;i++)
  74.     {
  75.       Display_Swap_Buffer[j][i] = 0xff;       //0=显示  1=不显示   
  76.     }
  77.   }
  78. }

  79. //************************************************************
  80. //计算移动数据,存在在缓冲器
  81. //************************************************************
  82. void Calc_Shift()
  83. {
  84.   unsigned char i;

  85.   for(i = 0;i < 16;i++)
  86.   {
  87.     if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                  //前8位 移位
  88.     {
  89.       Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;      //最低位清零
  90.     }
  91.     else
  92.     {
  93.       Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01;      //最低位置一   
  94.     }

  95.     if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
  96.     {
  97.       Shift_Bit = Word[Display_Word_Count][i]&temp;
  98.     }
  99.     else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
  100.     {
  101.       Shift_Bit = Word[Display_Word_Count][16+i]&temp;
  102.     }
  103.     else
  104.     {
  105.       Shift_Bit = 1;            //把字移出缓冲区
  106.     }

  107.     if( Shift_Bit == 0)                           //后8位移位
  108.     {
  109.       Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;    //最低位清零
  110.     }
  111.     else
  112.     {
  113.       Shift_Bit = 1;
  114.       Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;    //最低位置一      
  115.     }
  116.    
  117.   }
  118.   temp = (temp>>1)&0x7f;
  119.   if(temp == 0x00)
  120.   {
  121.     temp = 0x80;
  122.   }
  123. }
  124. //************************************************************
  125. //num为字数  dat[][32]为字模的名称
  126. //*************************************************************
  127. void Display(unsigned char dat[][32])         
  128. {
  129.   unsigned char i;

  130.   for( i = 0 ; i < 16 ; i++ )
  131.   {
  132.     digitalWrite(LEDARRAY_G, HIGH);   //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。
  133.    
  134.     Display_Buffer[0] = dat[0][i];   
  135.     Display_Buffer[1] = dat[0][i+16];

  136.     Send(Display_Buffer[1]);
  137.     Send(Display_Buffer[0]);

  138.     digitalWrite(LEDARRAY_LAT, HIGH);         //锁存数据
  139.     delayMicroseconds(1);
  140.   
  141.     digitalWrite(LEDARRAY_LAT, LOW);
  142.     delayMicroseconds(1);

  143.     Scan_Line(i);           //选择第i行

  144.     digitalWrite(LEDARRAY_G, LOW);
  145.    
  146.     delayMicroseconds(300);;    //延时一段时间,让LED亮起来。      
  147.   }
  148. }

  149. //****************************************************
  150. //扫描某一行
  151. //****************************************************
  152. void Scan_Line( unsigned char m)
  153. {
  154.   switch(m)
  155.   {
  156.     case 0:     
  157.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);         
  158.       break;
  159.     case 1:         
  160.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);     
  161.       break;
  162.     case 2:         
  163.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);     
  164.       break;
  165.     case 3:         
  166.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);   
  167.       break;
  168.     case 4:
  169.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);     
  170.       break;
  171.     case 5:
  172.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);   
  173.       break;
  174.     case 6:
  175.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);   
  176.       break;
  177.     case 7:
  178.       digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);     
  179.       break;
  180.     case 8:
  181.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);     
  182.       break;
  183.     case 9:
  184.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);   
  185.       break;  
  186.     case 10:
  187.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);   
  188.       break;
  189.     case 11:
  190.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);     
  191.       break;
  192.     case 12:
  193.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);   
  194.       break;
  195.     case 13:
  196.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);     
  197.       break;
  198.     case 14:
  199.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);     
  200.       break;
  201.     case 15:
  202.       digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);   
  203.       break;
  204.     default : break;  
  205.   }
  206. }

  207. //****************************************************
  208. //发送数据
  209. //****************************************************
  210. void Send( unsigned char dat)
  211. {
  212.   unsigned char i;
  213.   digitalWrite(LEDARRAY_CLK, LOW);
  214.   delayMicroseconds(1);;  
  215.   digitalWrite(LEDARRAY_LAT, LOW);
  216.   delayMicroseconds(1);;

  217.   for( i = 0 ; i < 8 ; i++ )
  218.   {
  219.     if( dat&0x01 )
  220.     {
  221.       digitalWrite(LEDARRAY_DI, HIGH);  
  222.     }
  223.     else
  224.     {
  225.       digitalWrite(LEDARRAY_DI, LOW);
  226.     }


  227.     digitalWrite(LEDARRAY_CLK, HIGH);       //上升沿发送数据
  228.       delayMicroseconds(1);;
  229.     digitalWrite(LEDARRAY_CLK, LOW);
  230.       delayMicroseconds(1);;   
  231.     dat >>= 1;
  232.       
  233.   }     
  234. }
复制代码
显示效果如下:
0004.gif




回复

使用道具 举报

该用户从未签到

12

主题

849

帖子

0

精华

金牌会员

最后登录
2023-1-19
发表于 2019-3-22 12:39:37 | 显示全部楼层
很棒啊,很不错的创意
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

304

帖子

0

精华

高级会员

最后登录
2020-6-24
发表于 2019-3-27 09:13:52 | 显示全部楼层
挺好哒,学习了
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-4-20 01:00 , Processed in 0.102379 second(s), 15 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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