归65 2021-06-10 08:52 采纳率: 66.7%
浏览 49
已结题

代码翻译,尽可能注明代码含义

#include <LedControl.h>
#include <MsTimer2.h>

#define u8 unsigned char
#define u16 unsigned int

u8 led_pin=4;

int pinInterrupt = 2;

u16 count = 0,t=100,jud;

int DIN = 0;
int CS =  1;
int CLK = 3;

LedControl lc=LedControl(DIN,CLK,CS,1);

byte  num_0[8]={B00000000,B00000000,B01111100,B01000100,B01111100,B00000000,B00000000,B00000000},
      num_1[8]={B00000000,B00000000,B00000000,B01111110,B01111110,B00000000,B00000000,B00000000},
      num_2[8]={B00000000,B00000000,B01110100,B01010100,B01010100,B01011100,B00000000,B00000000},
      num_3[8]={B00000000,B00000000,B01010100,B01010100,B01010100,B01111100,B00000000,B00000000},
      num_4[8]={B00000000,B00000000,B00011100,B00010000,B00010000,B01111100,B00000000,B00000000},
      num_5[8]={B00000000,B00000000,B01011100,B01010100,B01010100,B00100100,B00000000,B00000000};

u8 k,flag_1=0;

 void onChange()
 {
      delay(50);
    flag_1 = ~flag_1;
 }

 void wait()
 {
  while(flag_1);
  
 }
void setup() 
{
    lc.shutdown(0,false);
  lc.clearDisplay(0);
  for(led_pin=4;led_pin<14;led_pin++)
  {
      pinMode(led_pin,OUTPUT);  
  }

  // put your setup code here, to run once:

 pinMode(pinInterrupt,INPUT);
 attachInterrupt(digitalPinToInterrupt(pinInterrupt),onChange,CHANGE);
 MsTimer2::set(100,onTimer);
  MsTimer2::start();
  lc.shutdown(0,false);                  
  lc.setIntensity(0,3);                      
  lc.clearDisplay(0);                       
  
}
u8 a;

void loop() 
{
  for(led_pin=4;led_pin<14;led_pin++)
  {
    wait();
    digitalWrite(led_pin,LOW);    
    delay(analogRead(A0));
  }

    if(led_pin==14)
  led_pin=4;

  for(led_pin=4;led_pin<14;led_pin++)
  {
    wait();
    digitalWrite(led_pin,HIGH);    
    delay(analogRead(A0));
  }
  
  
}

void onTimer()
{
  count=analogRead(A0);
  count=count/200;

  switch(count)
  {
    case 5:
          lc.clearDisplay(0);  
         for (k=0;k<8;k++)         
        lc.setRow(0,k,num_5[k]); break;

    case 4:
          lc.clearDisplay(0);  
         for (k=0;k<8;k++)         
        lc.setRow(0,k,num_4[k]); break;

    case 3:
          lc.clearDisplay(0);  
         for (k=0;k<8;k++)         
        lc.setRow(0,k,num_3[k]); break;

    case 2:
          lc.clearDisplay(0);  
         for (k=0;k<8;k++)         
        lc.setRow(0,k,num_2[k]); break;

    case 1:
          lc.clearDisplay(0);  
          for (k=0;k<8;k++)         
        lc.setRow(0,k,num_1[k]); break;
    case 0:
          lc.clearDisplay(0);  
          for (k=0;k<8;k++)         
        lc.setRow(0,k,num_0[k]); break;

          }}

  • 写回答

1条回答 默认 最新

  • soar3033 2021-06-10 09:22
    关注
    #include <LedControl.h>   //导入LED库
    #include <MsTimer2.h>       //导入库
    
    #define u8 unsigned char    //定义u8代替 unsigned char
    #define u16 unsigned int    //定义u16代替 unsigned int
    
    u8 led_pin = 4; //定义led针脚为4号脚
    
    int pinInterrupt = 2;   //定义中断针脚为2号脚
    
    u16 count = 0, t = 100, jud;    //定义三个unsigned int类型变量 并为前两个赋值
    
    int DIN = 0;    //定义整形变量并赋值(这三个实际上时控制74HC595的三个引脚号)
    int CS = 1;     //定义整形变量并赋值(这三个实际上时控制74HC595的三个引脚号)
    int CLK = 3;    //定义整形变量并赋值(这三个实际上时控制74HC595的三个引脚号)
    
    LedControl lc = LedControl(DIN, CLK, CS, 1);   //实例化led控制对象
    
    byte  num_0[8] = { B00000000,B00000000,B01111100,B01000100,B01111100,B00000000,B00000000,B00000000 }, //定义数组 用于让led显示0
    num_1[8] = { B00000000,B00000000,B00000000,B01111110,B01111110,B00000000,B00000000,B00000000 },     //定义数组 用于让led显示1
    num_2[8] = { B00000000,B00000000,B01110100,B01010100,B01010100,B01011100,B00000000,B00000000 }, //定义数组 用于让led显示2
    num_3[8] = { B00000000,B00000000,B01010100,B01010100,B01010100,B01111100,B00000000,B00000000 }, //定义数组 用于让led显示3
    num_4[8] = { B00000000,B00000000,B00011100,B00010000,B00010000,B01111100,B00000000,B00000000 }, //定义数组 用于让led显示4
    num_5[8] = { B00000000,B00000000,B01011100,B01010100,B01010100,B00100100,B00000000,B00000000 }; //定义数组 用于让led显示5
    
    u8 k, flag_1 = 0;   //定义状态变量
    
    void onChange() //定义函数
    {
        delay(50);  //延时50ms
        flag_1 = ~flag_1;   //更改flag1状态取反
    }
    
    void wait() //定义函数
    {
        while (flag_1); //只要flag1为0就一直循环
    
    }
    void setup()    //arduino主函数 用于初始化
    {
        lc.shutdown(0, false);  //led点阵初始化
        lc.clearDisplay(0); //led点阵清空
        for (led_pin = 4; led_pin < 14; led_pin++)  //循环便利led引脚
        {
            pinMode(led_pin, OUTPUT);   //设置引脚模式为输出(推挽模式)
        }
    
        // put your setup code here, to run once:
    
        pinMode(pinInterrupt, INPUT);   //设置输入中断引脚
        attachInterrupt(digitalPinToInterrupt(pinInterrupt), onChange, CHANGE); //定义中断引脚发生改变时调用onChang函数
        MsTimer2::set(100, onTimer);    //设置定时器中断
        MsTimer2::start();  //开启定时器
        lc.shutdown(0, false);  //关闭点阵
        lc.setIntensity(0, 3);  //设置点阵亮度
        lc.clearDisplay(0); //清空显示
    
    }
    u8 a;
    
    void loop()//arduino主循环
    {
        for (led_pin = 4; led_pin < 14; led_pin++)  //跑马灯循环
        {
            wait();//等待函数 等待flag1变1
            digitalWrite(led_pin, LOW); //将对应的led熄灭 (如果是开漏输出则点亮)
            delay(analogRead(A0));  //按照读取的模拟量延时 模拟量越大 延时越长
        }
    
        if (led_pin == 14)  //跑马灯的溢出处理将最后一位赋值给起始位置
            led_pin = 4;    //跑马灯的溢出处理将最后一位赋值给起始位置
    
        for (led_pin = 4; led_pin < 14; led_pin++)  //跑马灯循环
        {
            wait();//等待函数 等待flag1变1
            digitalWrite(led_pin, HIGH);//将对应的led点亮  (如果是开漏输出则熄灭)  与之前的相反
            delay(analogRead(A0));//按照读取的模拟量延时 模拟量越大 延时越长
        }
    
    
    }
    
    void onTimer() //时间中断触发时执行
    {
        count = analogRead(A0); //读取模拟量
        count = count / 200;    //模拟量转换 转换后量程0-5 代表0-5V电压
    
        switch (count) //根据模拟量转换值跳转
        {
        case 5: //电压为5V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++) //8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_5[k]); break;  //写单行的点阵值 最终实现显示数字“5” 然后跳出选择
    
        case 4://电压为4V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++)//8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_4[k]); break;//写单行的点阵值 最终实现显示数字“4”  然后跳出选择
    
        case 3://电压为3V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++)//8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_3[k]); break;//写单行的点阵值 最终实现显示数字“3”  然后跳出选择
    
        case 2://电压为2V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++)//8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_2[k]); break;//写单行的点阵值 最终实现显示数字“2”  然后跳出选择
    
        case 1://电压为1V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++)//8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_1[k]); break;//写单行的点阵值 最终实现显示数字“1”  然后跳出选择
        case 0://电压为0V时
            lc.clearDisplay(0);//清空原有显示
            for (k = 0; k < 8; k++)//8次循环 用于操作8行的点阵
                lc.setRow(0, k, num_0[k]); break;//写单行的点阵值 最终实现显示数字“0”  然后跳出选择
    
        }
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题