1.布尔运算与双按键控制LED灯闪烁
布尔运算符:
&& (逻辑与) 只有在两个操作数都为真时才返回真。
|| (逻辑或)任意一个为真时返回真
! (逻辑非)当操作数为假时返回真
双按键控制LED灯闪烁;
代码:
1
2.控制四位数码管显示数字:
四位数码管引脚图:
代码:
void setup() {
// put your setup code here, to run once:
int pinNumber =2;
while (pinNumber<=13)//设置引脚为输出模式,2~9为a~g,10~13为公共端
{
pinMode(pinNumber,OUTPUT);
pinNumber += 1;
}
}
void loop() {
// put your main code here, to run repeatedly:
int pinNumber = 2;//点亮第一位数字
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
delay(1);
while(pinNumber<=9)//数据清洗,不然会导致显示错乱
{
digitalWrite(pinNumber,LOW);
pinNumber +=1;
}
delay(1);
pinNumber =2;//点亮第二位数字
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
digitalWrite(2,HIGH);
digitalWrite(6,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
delay(1);
while(pinNumber<=9){
digitalWrite(pinNumber,LOW);
pinNumber +=1;
}
delay(1);
pinNumber =2;//第三位
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(2,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
delay(1);
while(pinNumber<=9){
digitalWrite(pinNumber,LOW);
pinNumber +=1;
}
delay(1);
pinNumber =2;//第四位
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
delay(1);
while(pinNumber<=9){
digitalWrite(pinNumber,LOW);
pinNumber +=1;
}
delay(1);
}
实物图:
收获:用while循环减少了代码量,同时加深了让引脚接入电路的接法。
不足:每次要输出数字时都要重新输入,不方便。
改进后:
代码:
int ccm1, ccm2,ccm3,ccm4;//公共端
int LEDnum = 520;//输入想要的数
void setup() {
// put your setup code here, to run once:
int pinNumber =2;
while (pinNumber<=13)//设置引脚为输出模式,2~9为a~g,10~13为公共端
{
pinMode(pinNumber,OUTPUT);
pinNumber += 1;
}
}
void pinsclear()//清理函数
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void lighten(int num){//显示数字函数
switch(num){
case 1:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
break;
case 2:
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(2,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
break;
case 3:
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(8,HIGH);
break;
case 4:
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
break;
case 5:
digitalWrite(2,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
case 6:
digitalWrite(2,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
break;
case 7:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
break;
case 8:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
break;
case 9:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
break;
case 0:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(2,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
break;
}
}
void selectcom (int ccm){
switch(ccm){
case 1:
ccm1 = LEDnum/1000 % 10;
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
lighten(ccm1);
break;
case 2:
ccm2 = LEDnum/100 % 10;
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
lighten(ccm2);
break;
case 3:
ccm3 = LEDnum/10 % 10;
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
lighten(ccm3);
break;
case 4:
ccm4 = LEDnum % 10;
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
lighten(ccm4);
break;
}
}
void loop() {
//点亮第一位数字
selectcom(1);
delay(1);
pinsclear();
delay(1);
//点亮第二位数字
selectcom(2);
delay(1);
pinsclear();
delay(1);
//第三位
selectcom(3);
delay(1);
pinsclear();
delay(1);
//第四位
selectcom(4);
delay(1);
pinsclear();
delay(1);
}
现在输出数字只需要改变LEDnum的值就可以显示数字
3.模拟输出控制LED灯亮度
新函数:analogWrite()
作用:将一个模拟数值写进Arduino引脚,这个操作可以用来控制LED的亮度,Arduino每一次对引脚执行analogWrite()指令,都会给该引脚一个固定频率的PWM信号。
参数:
pin
:被读取的模拟引脚号码value
:0到255之间的PWM频率值, 0对应off, 255对应on
代码:
boolean pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态
boolean pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态
boolean pushButton3; // 创建布尔型变量用来存储按键开关3的电平状态
int ledPin = 9; //LED引脚号
int brightness = 128; //LED亮度参数
void setup() {
// put your setup code here, to run once:
pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
pinMode(10, INPUT_PULLUP);//将引脚10设置为输入上拉模式
pinMode(ledPin, OUTPUT); //将LED引脚设置为输出模式
Serial.begin(9600); //启动串口通讯
}
void loop() {
// put your main code here, to run repeatedly:
pushButton1 = digitalRead(10); //读取引脚10电平状态并将其赋值给布尔变量
pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量
pushButton3 = digitalRead(2);//读取引脚2电平状态并将其赋值给布尔变量
if (!pushButton1 ){ // 当按下按键开关1
brightness=255;
} if (!pushButton2 ) { //当按下按键开关2
brightness=0;
} if (!pushButton3){ //当按下按键开关3
brightness=60;
}
analogWrite(ledPin, brightness); //模拟输出控制LED亮度
Serial.println(brightness); //将LED亮度参数显示在串口监视器上
delay(20);
}
3