#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;
}}
#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” 然后跳出选择
}
}