在生活中,点阵屏是一种常用的显示设备,它能够以矩阵形式展示信息,如数字、字母或简单的图形。通过控制点阵屏上的每一个点(LED)的亮灭,我们可以创造出各种视觉效果。今天,我们将通过一个Arduino项目来学习如何控制一个8x8的点阵屏,包括如何初始化硬件、编写代码来点亮所有LED、以及实现扫描显示技术。 
  元件清单 
 
硬件连接图 1 点亮点阵连线图   示例代码
			
			
			- //项目 - 点亮点阵
 - 
 - const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2}; // 点阵屏行引脚(负极)
 - 
 - const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13}; // 点阵屏列引脚(正极)
 - 
 -  
 - 
 - void setup() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     pinMode(colPins[i], OUTPUT);
 - 
 -     pinMode(rowPins[i], OUTPUT);
 - 
 -     digitalWrite(rowPins[i], HIGH); // 初始化行引脚为高电平(关闭)
 - 
 -   }
 - 
 - }
 - 
 -  
 - 
 - void turnOnAllLeds() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     digitalWrite(colPins[i], HIGH);
 - 
 -     digitalWrite(rowPins[i], LOW);
 - 
 -   }
 - 
 - }
 - 
 -  
 - 
 - void turnOffAllLeds() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     digitalWrite(colPins[i], LOW);
 - 
 -     digitalWrite(rowPins[i], HIGH);
 - 
 -   }
 - 
 - }
 - 
 -  
 - 
 - void scanRows() {
 - 
 -   digitalWrite(colPins[0], HIGH);
 - 
 -   for (int col = 0; col < 8; col++) {
 - 
 -     digitalWrite(rowPins[col], LOW);
 - 
 -     delay(500);
 - 
 -   }
 - 
 -   turnOffAllLeds();
 - 
 - }
 - 
 -  
 - 
 - void scanColumns() {
 - 
 -  
 - 
 -   for(int col = 0; col < 8; col++){
 - 
 -     digitalWrite(colPins[col], HIGH);
 - 
 -     for(int row = 0; row < 8; row++){
 - 
 -       digitalWrite(rowPins[row], LOW);
 - 
 -     }
 - 
 -     delay(500);
 - 
 -     digitalWrite(colPins[col], LOW);
 - 
 -   }
 - 
 -  
 - 
 - }
 - 
 -  
 - 
 - void loop() {
 - 
 -   turnOnAllLeds();
 - 
 -   delay(1500);
 - 
 -   turnOffAllLeds();
 - 
 -   delay(1500);
 - 
 -   scanRows();
 - 
 -   scanColumns();
 - 
 - }
 
  复制代码
  
将程序上传成功后,可以看到点阵屏闪烁一次,接着第一列的LED从上到下依次亮起,之后点阵屏按照列为单位从左至右依次亮起,并不断重复所有上述效果。  
   代码回顾 
在开始学习如何使用代码来控制8*8 LED点阵屏之前,建议您看一下硬件回顾部分,了解8*8 LED点阵屏的基本原理。这样,您就能更容易地理解和上手本项目中代码所演示的点阵屏点亮效果。  
   - const int rowPins[8] = {6, 11, 5, 9, A0, 4, A1, 2}; 
 - 
 - const int colPins[8] = {10, A2, A3, 7, 3, 8, 12, 13}; 
 
  复制代码
  
开头这部分代码定义了两组引脚数组,rowPins 和 colPins,分别用于连接点阵屏的行和列。   - 
 - void setup() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     pinMode(colPins[i], OUTPUT);
 - 
 -     pinMode(rowPins[i], OUTPUT);
 - 
 -     digitalWrite(rowPins[i], HIGH); 
 - 
 -   }
 - 
 - }
 
  复制代码
  
setup() 函数在Arduino板上电后只运行一次。 使用for循环将colPins和rowPins数组中的引脚设置为输出模式。 将所有行引脚设置为高电平(HIGH)确保点阵屏在初始化时处于关闭状态。   - void turnOnAllLeds() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     digitalWrite(colPins[i], HIGH);
 - 
 -     digitalWrite(rowPins[i], LOW);
 - 
 -   }
 - 
 - }
 
  复制代码
  
turnOnAllLeds() 函数用for循环将所有列引脚设置为高电平(HIGH),并将所有行引脚设置为低电平(LOW),所有的LED灯将被点亮。   - void turnOffAllLeds() {
 - 
 -   for (int i = 0; i < 8; i++) {
 - 
 -     digitalWrite(colPins[i], LOW);
 - 
 -     digitalWrite(rowPins[i], HIGH);
 - 
 -   }
 - 
 - }
 
  复制代码
  
turnOffAllLeds() 函数通过将所有列引脚设置为低电平(LOW)并将所有行引脚设置为高电平(HIGH),关闭点阵屏上的所有LED。   - void scanRows() {
 - 
 -   digitalWrite(colPins[0], HIGH);
 - 
 -   for (int row = 0; row < 8; row++) {
 - 
 -     digitalWrite(rowPins[row], LOW);
 - 
 -     delay(500);
 - 
 -   }
 - 
 -   turnOffAllLeds();
 - 
 - }
 
  复制代码
  
scanRows() 函数是扫描行,将第一列的LED灯从第一行到第八行依次亮起。   - void scanColumns() {
 - 
 -   for(int col = 0; col < 8; col++){
 - 
 -     digitalWrite(colPins[col], HIGH);
 - 
 -     for(int row = 0; row < 8; row++){
 - 
 -       digitalWrite(rowPins[row], LOW);
 - 
 -     }
 - 
 -     delay(500);
 - 
 -     digitalWrite(colPins[col], LOW);
 - 
 -   }
 - 
 - }
 
  复制代码
  
scanColumns() 函数是扫描列,使用两个for循环,外层for循环用于遍历所有的列,内层嵌套for循环用于点亮该列所有LED。   - void loop() {
 - 
 -   turnOnAllLeds();
 - 
 -   delay(1500);
 - 
 -   turnOffAllLeds();
 - 
 -   delay(1500);
 - 
 - scanRows();
 - 
 -   scanColumns();
 - 
 - }
 
  复制代码
  
loop() 函数是Arduino程序的主体循环部分。 尝试打开所有LED,等待1.5秒,然后关闭所有LED,再等待1.5秒。 接着调用scanRows()和scanColumns()函数,实现依次扫描行和扫描列的效果。  
   硬件回顾8*8 LED点阵屏本项目中使用的点阵屏规格型号为788AS,内部电路图如图2所示。从图2可以看出LED显示屏为8*8的点阵屏,由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置高电平,某一行置低电平,则相应的二极管就亮。  
 图 2 内部电路图  
 课后练习本项目中是先扫描行再扫描列,请尝试对程序进行更改,实现先扫描列再扫描行。  
 
 附件下载: 
 示例代码.rar 
 
 |