Arduino 入门教程GO 第九章8*8LED点阵的显示-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 905|回复: 0

Arduino 入门教程GO 第九章8*8LED点阵的显示

[复制链接]
发表于 2022-1-17 16:12 | 显示全部楼层 |阅读模式
本帖最后由 OpenJumper 于 2022-1-17 15:17 编辑

[md]## 一、8 * 8LED点阵显示实验

在之前的课程中我们已经学习了一位数码管、四位数码管以及1602液晶显示器等三种显示工具的应用,接下来,我们要学习的就是另一种显示工具——8 * 8LED点阵的实验与应用。

## 二、实验器材

+ UNO控制板:1块

+ 220Ω电阻:8个

+ 8*8LED点阵:1块

+ 面包板:1块

+ 面包板跳线:若干

## 三、连线示意图

01.jpg
图9-1



## 四、硬件连接图

02.jpg
图9-2



## 五、硬件知识要点

点阵显示器原理图如下:

03.jpg
图9-3


从正面看,16个引脚的编号如下图,与原理图中的PIN是相互对应的。

04.jpg
图9-4


我们需要在输入电流的引脚上串联220Ω的电阻起到限流的作用。

## 六、程序编写

代码部分:[/md]
  1. //the pin to control ROW
  2. const int row1 = 2; // the number of the row pin 9
  3. const int row2 = 3; // the number of the row pin 14
  4. const int row3 = 4; // the number of the row pin 8
  5. const int row4 = 5; // the number of the row pin 12
  6. const int row5 = 6; // the number of the row pin 1
  7. const int row6 = 7; // the number of the row pin 7
  8. const int row7 = 8; // the number of the row pin 2
  9. const int row8 = 9; // the number of the row pin 5
  10. //the pin to control COl
  11. const int col1 = 10; // the number of the col pin 13
  12. const int col2 = 11; // the number of the col pin 3
  13. const int col3 = 12; // the number of the col pin 4
  14. const int col4 = 13; // the number of the col pin 10
  15. const int col5 = 14; // the number of the col pin 6
  16. const int col6 = 15; // the number of the col pin 11
  17. const int col7 = 16; // the number of the col pin 15
  18. const int col8 = 17; // the number of the col pin 16
  19. unsigned char Text[]={0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c};
  20. void Draw_point(unsigned char x,unsigned char y)
  21. {
  22. clear_();
  23. digitalWrite(x+2, HIGH);
  24. digitalWrite(y+10, LOW);
  25. delay(1);
  26. }
  27. void show_num(void)
  28. {
  29. unsigned char i,j,data;
  30. for(i=0;i<8;i++)
  31. {
  32. data=Text[i];
  33. for(j=0;j<8;j++)
  34. {
  35. if(data & 0x01)Draw_point(j,i);
  36. data>>=1;
  37. }
  38. }
  39. }
  40. void setup(){
  41. int i = 0 ;
  42. for(i=2;i<18;i++)
  43. {
  44. pinMode(i, OUTPUT);
  45. }
  46. clear_();
  47. }
  48. void loop()
  49. {
  50. show_num();
  51. }
  52. void clear_(void)
  53. {
  54. for(int i=2;i<10;i++)
  55. digitalWrite(i, LOW);
  56. for(int i=0;i<8;i++)
  57. digitalWrite(i+10, HIGH);
  58. }
复制代码
[md]
## 七、程序知识要点

const关键字代表常量。它是一个变量限定符,用于修改变量的性质,使其变为只读状态。这意味着该变量,就像任何相同类型的其他变量一样使用,但不能改变其值。如果尝试为一个const变量赋值,编译时将会报错。

const关键字定义的常量,遵守 variable scoping 管辖的其他变量的规则。这一点加上使用 #define的缺陷 ,使 const 关键字成为定义常量的一个的首选方法。

例子[/md]

  1. const float pi = 3.14;
  2. float x;

  3. // ....

  4. x = pi * 2;    // 在数学表达式中使用常量不会报错

  5. pi = 7;        // 错误的用法 - 你不能修改常量值,或给常量赋值。
复制代码

[md]
## 八、拓展阅读

在本章节的拓展阅读中,我们给大家带来一个用8*8LED点阵来显示汉字的例程,具体程序代码如下:
[/md]
  1. int R[] = {2,7,A5,5,13,A4,12,A2}; //行  
  2. int C[] = {6,11,10,4,A3,3,8,9};   //列  
  3. unsigned char zhu[8][8] =      //祝  
  4. {  
  5.   1,0,0,1,1,1,1,1,  
  6.   0,1,0,1,0,0,0,1,  
  7.   1,1,1,1,1,1,1,1,  
  8.   0,1,1,0,1,0,1,0,  
  9.   1,1,0,0,1,0,1,0,  
  10.   0,1,0,0,1,0,1,0,  
  11.   0,1,0,0,1,0,1,0,  
  12.   0,1,0,1,0,0,1,1,  
  13. };
  14. unsigned char da[8][8] =      //大  
  15. {  
  16.   0,0,0,1,0,0,0,0,  
  17.   0,0,0,1,0,0,0,0,  
  18.   1,1,1,1,1,1,1,1,  
  19.   0,0,0,1,0,0,0,0,  
  20.   0,0,0,1,0,0,0,0,  
  21.   0,0,1,0,1,0,0,0,  
  22.   0,1,0,0,0,1,0,0,  
  23.   1,0,0,0,0,0,1,1,  
  24. };
  25. unsigned char jia[8][8] =      //家
  26. {  
  27.   0,0,0,1,0,0,0,0,  
  28.   1,1,1,1,1,1,1,1,  
  29.   1,0,1,1,1,1,0,1,  
  30.   0,0,1,1,0,0,1,0,  
  31.   1,1,1,1,1,1,0,0,  
  32.   0,1,1,1,1,0,0,0,  
  33.   1,1,0,1,0,1,0,0,  
  34.   0,0,1,1,0,0,1,1,  
  35. };
  36. unsigned char jie[8][8] =      //节
  37. {  
  38.   0,0,1,0,0,1,0,0,  
  39.   0,1,1,1,1,1,1,0,  
  40.   0,0,1,0,0,1,0,0,  
  41.   0,0,0,0,0,0,0,0,  
  42.   0,1,1,1,1,1,1,0,  
  43.   0,0,0,1,0,0,1,0,  
  44.   0,0,0,1,0,1,1,0,  
  45.   0,0,0,1,0,0,0,0,  
  46. };
  47. unsigned char ri[8][8] =      //日
  48. {  
  49.   0,0,0,0,0,0,0,0,  
  50.   0,1,1,1,1,1,1,0,  
  51.   0,1,0,0,0,0,1,0,  
  52.   0,1,1,1,1,1,1,0,  
  53.   0,1,0,0,0,0,1,0,  
  54.   0,1,0,0,0,0,1,0,  
  55.   0,1,1,1,1,1,1,0,  
  56.   0,0,0,0,0,0,0,0,  
  57. };
  58. unsigned char kuai[8][8] =      //快  
  59. {  
  60.   0,1,0,0,1,0,0,0,  
  61.   0,1,0,0,1,0,0,0,  
  62.   1,1,0,1,1,1,1,0,  
  63.   0,1,1,0,1,0,1,0,  
  64.   0,1,1,1,1,1,1,1,  
  65.   0,1,0,0,1,0,0,0,  
  66.   0,1,0,1,0,1,0,0,  
  67.   0,1,1,0,0,0,1,1,   
  68. };
  69. unsigned char le[8][8] =      //乐  
  70. {  
  71.   0,0,0,0,0,0,0,1,  
  72.   0,1,1,1,1,1,1,0,  
  73.   0,1,0,0,1,0,0,0,  
  74.   0,1,1,1,1,1,1,1,  
  75.   0,0,0,0,1,0,0,0,  
  76.   0,0,1,0,1,0,1,0,  
  77.   0,1,0,0,1,0,0,1,  
  78.   0,0,0,1,1,0,0,0,  
  79. };
  80. unsigned char ximie[8][8] =      //全部熄灭
  81. {  
  82.   0,0,0,0,0,0,0,0,  
  83.   0,0,0,0,0,0,0,0,  
  84.   0,0,0,0,0,0,0,0,  
  85.   0,0,0,0,0,0,0,0,  
  86.   0,0,0,0,0,0,0,0,  
  87.   0,0,0,0,0,0,0,0,  
  88.   0,0,0,0,0,0,0,0,  
  89.   0,0,0,0,0,0,0,0,  
  90. };

  91. unsigned char biglove[8][8] =       //大“心型”的数据  
  92. {  
  93.   0,0,0,0,0,0,0,0,  
  94.   0,1,1,0,0,1,1,0,  
  95.   1,1,1,1,1,1,1,1,  
  96.   1,1,1,1,1,1,1,1,  
  97.   1,1,1,1,1,1,1,1,  
  98.   0,1,1,1,1,1,1,0,  
  99.   0,0,1,1,1,1,0,0,  
  100.   0,0,0,1,1,0,0,0,  
  101. };  
  102.   
  103. unsigned char smalllove[8][8] =      //小“心型”的数据  
  104. {  
  105.   0,0,0,0,0,0,0,0,  
  106.   0,0,0,0,0,0,0,0,  
  107.   0,0,1,0,0,1,0,0,  
  108.   0,1,1,1,1,1,1,0,  
  109.   0,1,1,1,1,1,1,0,  
  110.   0,0,1,1,1,1,0,0,  
  111.   0,0,0,1,1,0,0,0,  
  112.   0,0,0,0,0,0,0,0,  
  113. };  
  114.   
  115. void setup()  
  116. {  
  117.    //循环定义行列PIN 为输出模式  
  118.   for(int i = 0;i<8;i++)  
  119.   {  
  120.     pinMode(R,OUTPUT);  
  121.     pinMode(C,OUTPUT);  
  122.   }  
  123. }  
  124.   
  125. void loop()  
  126. {  
  127. BlessYou();
  128. }  
  129.   
  130. void Display(unsigned char dat[8][8])   //显示函数  
  131. {  
  132.   for(int c = 0; c<8;c++)  
  133.   {  
  134.     digitalWrite(C[c],LOW);//选通第c列  
  135.   
  136.     //循环  
  137.     for(int r = 0;r<8;r++)  
  138.     {  
  139.       digitalWrite(R[r],dat[r][c]);  
  140.     }  
  141.     delay(1);  
  142.     Clear();  //清空显示去除余晖  
  143.   }  
  144. }  
  145.   
  146. void Clear()                          //清空显示  
  147. {  
  148.   for(int i = 0;i<8;i++)  
  149.   {  
  150.     digitalWrite(R,LOW);  
  151.     digitalWrite(C,HIGH);  
  152.   }  
  153. }
  154. void BlessYou()
  155. {
  156.   for(int i = 0 ; i < 50 ; i++)         //循环显示50次  
  157.   {     
  158.     Display(zhu);                 //显示 祝  
  159.   }  
  160.   for(int i = 0 ; i < 50 ; i++)         //循环显示50次  
  161.   {     
  162.     Display(da);                 //显示 大  
  163.   }  
  164.   for(int i = 0 ; i < 50 ; i++)         //循环显示50次  
  165.   {     
  166.     Display(jia);                 //显示 家  
  167.   }  
  168.   for(int i = 0 ; i< 50 ; i++)         //循环显示50次  
  169.   {     
  170.     Display(jie);                 //显示 节  
  171.   }  
  172.   for(int i = 0 ; i<50 ; i++)         //循环显示50次  
  173.   {     
  174.     Display(ri);                 //显示 日  
  175.   }  
  176.   for(int i = 0 ; i<50 ; i++)         //循环显示50次  
  177.   {     
  178.     Display(kuai);                 //显示 快  
  179.   }  
  180.   for(int i = 0 ; i<50 ; i++)         //循环显示50次  
  181.   {     
  182.     Display(le);                 //显示 乐  
  183.   }
  184.   for(int i = 0 ; i<30 ; i++)         //循环显示30次  
  185.   {     
  186.     Display(biglove);                 //显示 大心
  187.   }
  188.   for(int i = 0 ; i<30 ; i++)         //循环显示30次  
  189.   {     
  190.     Display(smalllove);                 //显示 小心  
  191.   }
  192.   for(int i = 0 ; i<30 ; i++)         //循环显示30次  
  193.   {     
  194.     Display(biglove);                 //显示 大心   
  195.   }
  196.   for(int i = 0 ; i<30 ; i++)         //循环显示30次  
  197.   {     
  198.     Display(smalllove);                 //显示 小心  
  199.   }  
  200.   for(int i = 0 ; i<200 ; i++)         //循环显示200次  
  201.   {     
  202.     Display(ximie);                 //显示 熄灭200次  
  203.   }
  204. }
复制代码

[md]
接线图如下:

05.jpg


以上程序在写入UNO控制板以后,大家可以看到点阵循环显示[/md]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 08:17 , Processed in 0.077587 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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