Advertisement
pigg

Arduino 16x16LED矩陣多字跑馬燈

Mar 13th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.05 KB | None | 0 0
  1. #include <Arduino.h>
  2.  
  3. //IO設定
  4. #define LEDARRAY_D 2
  5. #define LEDARRAY_C 3
  6. #define LEDARRAY_B 4
  7. #define LEDARRAY_A 5
  8. #define LEDARRAY_G 6
  9. #define LEDARRAY_DI 7
  10. #define LEDARRAY_CLK 8
  11. #define LEDARRAY_LAT 9
  12.  
  13. #define led 13
  14.  
  15.  
  16. #define Num_Word 1              //顯示字數
  17.  
  18. unsigned char Display_Buffer[2];
  19. unsigned char Display_Swap_Buffer[Num_Word][32]={0};                   
  20. bool Shift_Bit = 0;
  21. bool Flag_Shift = 0;
  22. unsigned char Timer0_Count = 0;
  23. unsigned char temp = 0x80;
  24. unsigned char Shift_Count = 0;
  25. unsigned char Display_Word_Count = 0;
  26.  
  27. //**************************************************************************************
  28. #define Num_Of_Word 8         //顯示字數
  29.  
  30. //**************************************************************************************
  31. //字的HEX
  32. const unsigned char Word[Num_Of_Word][32] =
  33. {
  34.  
  35.  
  36. 0xFF,0xFF,0x11,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xD7,0xD7,0xD7,0xD7,0xFF,0xFF,/*"W",0*/
  37.  
  38. 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0x83,0xBB,0xBB,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"H",1*/
  39.  
  40. 0xFF,0xFF,0xEF,0xEF,0xEF,0xD7,0xD7,0xD7,0xD7,0xC7,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"A",2*/
  41.  
  42. 0xFF,0xFF,0x01,0x6D,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,0xFF,/*"T",3*/
  43.  
  44. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",4*/
  45.  
  46. 0xFF,0xFF,0x01,0x6D,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,0xFF,/*"T",5*/
  47.  
  48. 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0x83,0xBB,0xBB,0xBB,0xBB,0xBB,0x11,0xFF,0xFF,/*"H",6*/
  49.  
  50. 0xFF,0xFF,0x01,0xBD,0xBD,0xBF,0xBB,0x83,0xBB,0xBF,0xBF,0xBD,0xBD,0x01,0xFF,0xFF,/*"E",7*/
  51.  
  52. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",8*/
  53.  
  54. 0xFF,0xFF,0x01,0xBD,0xBD,0xBF,0xBB,0x83,0xBB,0xBF,0xBF,0xBF,0xBF,0x1F,0xFF,0xFF,/*"F",9*/
  55.  
  56. 0xFF,0xFF,0x11,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xC7,0xFF,0xFF,/*"U",10*/
  57.  
  58. 0xFF,0xFF,0xC5,0xB9,0x7D,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xBD,0xC3,0xFF,0xFF,/*"C",11*/
  59.  
  60. 0xFF,0xFF,0x11,0xBB,0xB7,0xAF,0x9F,0x9F,0xAF,0xAF,0xB7,0xB7,0xBB,0x11,0xFF,0xFF,/*"K",12*/
  61.  
  62. 0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,/*"!",13*/
  63.  
  64. 0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,/*"!",14*/
  65.  
  66.  
  67.  
  68. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  69. };
  70.  
  71. //**************************************************************************************
  72.  
  73. //設定輸出
  74. void setup()
  75. {
  76.     pinMode(LEDARRAY_D, OUTPUT);
  77.     pinMode(LEDARRAY_C, OUTPUT);
  78.     pinMode(LEDARRAY_B, OUTPUT);
  79.     pinMode(LEDARRAY_A, OUTPUT);
  80.     pinMode(LEDARRAY_G, OUTPUT);
  81.     pinMode(LEDARRAY_DI, OUTPUT);
  82.     pinMode(LEDARRAY_CLK, OUTPUT);
  83.     pinMode(LEDARRAY_LAT, OUTPUT);
  84.  
  85.     Clear_Display();
  86. }
  87.  
  88. void loop()
  89. {
  90.     unsigned int i;
  91. //**************************************************************************************
  92.     for(i = 0 ; i < 5; i ++)            //設定速度
  93. //**************************************************************************************
  94.     {
  95.         Display(Display_Swap_Buffer);
  96.     }
  97.     Display_Word_Count = Shift_Count/16;                //目前顯示第幾個字
  98.     Calc_Shift();
  99.     Shift_Count++;
  100.     if(Shift_Count == (Num_Of_Word+1)*16 )              //移動次數
  101.     {
  102.         Shift_Count = 0;               
  103.     }  
  104.  
  105. }
  106.  
  107. //清除緩衝區
  108. void Clear_Display()
  109. {
  110.     unsigned char i,j;
  111.     for(j = 0 ; j < Num_Word; j++)
  112.     {
  113.         for(i = 0 ; i < 32 ;i++)
  114.         {
  115.             Display_Swap_Buffer[j][i] = 0xff;               //0=顯示 1=不顯示  
  116.         }
  117.     }
  118. }
  119.  
  120.  
  121. void Calc_Shift()
  122. {
  123.     unsigned char i;
  124.  
  125.     for(i = 0;i < 16;i++)
  126.     {
  127.         if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                                    //前8位   移位
  128.         {
  129.             Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;         
  130.             //最低歸0
  131.            
  132.         }
  133.         else
  134.         {
  135.             Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01;          //最低位置1    
  136.         }
  137.  
  138.         if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
  139.         {
  140.             Shift_Bit = Word[Display_Word_Count][i]&temp;
  141.         }
  142.         else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
  143.         {
  144.             Shift_Bit = Word[Display_Word_Count][16+i]&temp;
  145.         }
  146.         else
  147.         {
  148.             Shift_Bit = 1;                      //移出緩衝區
  149.         }
  150.  
  151.         if( Shift_Bit == 0)                                                     //後8位移位
  152.         {
  153.             Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;        //最低位清零
  154.         }
  155.         else
  156.         {
  157.             Shift_Bit = 1;
  158.             Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;        //最低位置一          
  159.         }
  160.        
  161.     }
  162.     temp = (temp>>1)&0x7f;
  163.     if(temp == 0x00)
  164.     {
  165.         temp = 0x80;
  166.     }
  167. }
  168.  
  169. //num是字數  dat[][32]是字模的名稱
  170. void Display(unsigned char dat[][32])                  
  171. {
  172.     unsigned char i;
  173.  
  174.     for( i = 0 ; i < 16 ; i++ )
  175.     {
  176.         digitalWrite(LEDARRAY_G, HIGH);
  177.        
  178.         Display_Buffer[0] = dat[0][i];     
  179.         Display_Buffer[1] = dat[0][i+16];
  180.  
  181.         Send(Display_Buffer[1]);
  182.         Send(Display_Buffer[0]);
  183.  
  184.         digitalWrite(LEDARRAY_LAT, HIGH);                   //佔存數據
  185.         delayMicroseconds(1);
  186.    
  187.         digitalWrite(LEDARRAY_LAT, LOW);
  188.         delayMicroseconds(1);
  189.  
  190.         Scan_Line(i);                       //选择第i行
  191.  
  192.         digitalWrite(LEDARRAY_G, LOW);
  193.        
  194.         delayMicroseconds(300);;        //延遲一段時間。            
  195.     }  
  196. }
  197.  
  198.  
  199. //掃描某行
  200.  
  201. void Scan_Line( unsigned char m)
  202. {  
  203.     switch(m)
  204.     {
  205.         case 0:        
  206.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);                   
  207.             break;
  208.         case 1:                
  209.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);      
  210.             break;
  211.         case 2:                
  212.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);      
  213.             break;
  214.         case 3:                
  215.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);     
  216.             break;
  217.         case 4:
  218.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);      
  219.             break;
  220.         case 5:
  221.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);     
  222.             break;
  223.         case 6:
  224.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);     
  225.             break;
  226.         case 7:
  227.             digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);        
  228.             break;
  229.         case 8:
  230.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);      
  231.             break;
  232.         case 9:
  233.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);     
  234.             break; 
  235.         case 10:
  236.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);     
  237.             break;
  238.         case 11:
  239.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);        
  240.             break;
  241.         case 12:
  242.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);     
  243.             break;
  244.         case 13:
  245.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);        
  246.             break;
  247.         case 14:
  248.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);        
  249.             break;
  250.         case 15:
  251.             digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);       
  252.             break;
  253.         default : break;   
  254.     }
  255. }
  256.  
  257. //發送數據
  258. void Send( unsigned char dat)
  259. {
  260.     unsigned char i;
  261.     digitalWrite(LEDARRAY_CLK, LOW);
  262.     delayMicroseconds(1);; 
  263.     digitalWrite(LEDARRAY_LAT, LOW);
  264.     delayMicroseconds(1);;
  265.  
  266.     for( i = 0 ; i < 8 ; i++ )
  267.     {
  268.         if( dat&0x01 )
  269.         {
  270.             digitalWrite(LEDARRAY_DI, HIGH);   
  271.         }
  272.         else
  273.         {
  274.             digitalWrite(LEDARRAY_DI, LOW);
  275.         }
  276.  
  277.  
  278.         digitalWrite(LEDARRAY_CLK, HIGH);               //上升數據
  279.             delayMicroseconds(1);;
  280.         digitalWrite(LEDARRAY_CLK, LOW);
  281.             delayMicroseconds(1);;     
  282.         dat >>= 1;                                      //移位
  283.            
  284.     }          
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement