arduino操控4位阴极数码管和mega2560板。abcdefg引脚连接在22,23,24,25,26,27,28,29。数码管的位选1,2,3,4连接在30,31,32,33.有两个按钮连接在20,21.初始时数码管显示0000,点击第一个按钮后,可以对第一个数码管进行调节,第一个数码管数字加一,加到9循环。第二个按钮点击后,按第一个按钮可以调节下一位数码管,上一位仍然会显示,但是不能再调节,到第4位数码管时循环。通过控制每个LED灯的方式控制数码管,给出完整示例代码。
时间: 2023-06-08 12:07:03 浏览: 117
以下是示例代码:
```
#include <Arduino.h>
// 数码管引脚连接定义
const int ledPinA = 22;
const int ledPinB = 23;
const int ledPinC = 24;
const int ledPinD = 25;
const int ledPinE = 26;
const int ledPinF = 27;
const int ledPinG = 28;
const int ledPinDP = 29;
// 数码管位选引脚连接定义
const int ledPinSelect1 = 30;
const int ledPinSelect2 = 31;
const int ledPinSelect3 = 32;
const int ledPinSelect4 = 33;
// 按钮引脚连接定义
const int buttonPin1 = 20;
const int buttonPin2 = 21;
// 数码管初始值
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
// 当前位选引脚对应数字变量
int digitSelect = ledPinSelect1;
// 定义数字对应的 LED 灯模式
byte digitPatterns[] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110 // 9
};
void setup() {
// 初始化数码管引脚为输出
pinMode(ledPinA, OUTPUT);
pinMode(ledPinB, OUTPUT);
pinMode(ledPinC, OUTPUT);
pinMode(ledPinD, OUTPUT);
pinMode(ledPinE, OUTPUT);
pinMode(ledPinF, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinDP, OUTPUT);
// 初始化位选引脚为输出
pinMode(ledPinSelect1, OUTPUT);
pinMode(ledPinSelect2, OUTPUT);
pinMode(ledPinSelect3, OUTPUT);
pinMode(ledPinSelect4, OUTPUT);
// 初始化按钮引脚为输入
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
// 数码管初始显示
displayDigits();
}
void loop() {
// 检测第一个按钮是否按下
if (digitalRead(buttonPin1) == LOW) {
// 调节数码管当前选中位
adjustDigit();
// 等待按钮松开
while (digitalRead(buttonPin1) == LOW) {
delay(10);
}
}
// 检测第二个按钮是否按下
if (digitalRead(buttonPin2) == LOW) {
// 按钮按下后不允许再调节当前数字
digitalWrite(digitSelect, LOW);
// 切换到下一位数字
switchDigit();
// 等待按钮松开
while (digitalRead(buttonPin2) == LOW) {
delay(10);
}
}
}
// 调节当前选中数字
void adjustDigit() {
// 根据当前位选引脚更新变量
switch (digitSelect) {
case ledPinSelect1:
digit1++;
if (digit1 == 10) {
digit1 = 0;
}
break;
case ledPinSelect2:
digit2++;
if (digit2 == 10) {
digit2 = 0;
}
break;
case ledPinSelect3:
digit3++;
if (digit3 == 10) {
digit3 = 0;
}
break;
case ledPinSelect4:
digit4++;
if (digit4 == 10) {
digit4 = 0;
}
break;
}
// 更新数码管显示
displayDigits();
}
// 切换到下一位数字
void switchDigit() {
// 先关闭当前位选引脚对应的数码管
digitalWrite(digitSelect, LOW);
// 根据当前位选引脚更新变量并设置下一位选中
switch (digitSelect) {
case ledPinSelect1:
digitSelect = ledPinSelect2;
break;
case ledPinSelect2:
digitSelect = ledPinSelect3;
break;
case ledPinSelect3:
digitSelect = ledPinSelect4;
break;
case ledPinSelect4:
digitSelect = ledPinSelect1;
break;
}
// 更新数码管显示
displayDigits();
}
// 更新数码管显示
void displayDigits() {
// 根据当前数字变量设置 LED 灯模式
byte pattern1 = digitPatterns[digit1];
byte pattern2 = digitPatterns[digit2];
byte pattern3 = digitPatterns[digit3];
byte pattern4 = digitPatterns[digit4];
// 根据当前位选引脚显示对应数字
digitalWrite(digitSelect, HIGH);
switch (digitSelect) {
case ledPinSelect1:
displayPattern(pattern1);
break;
case ledPinSelect2:
displayPattern(pattern2);
break;
case ledPinSelect3:
displayPattern(pattern3);
break;
case ledPinSelect4:
displayPattern(pattern4);
break;
}
}
// 显示数码管 LED 灯模式
void displayPattern(byte pattern) {
digitalWrite(ledPinA, pattern & B10000000);
digitalWrite(ledPinB, pattern & B01000000);
digitalWrite(ledPinC, pattern & B00100000);
digitalWrite(ledPinD, pattern & B00010000);
digitalWrite(ledPinE, pattern & B00001000);
digitalWrite(ledPinF, pattern & B00000100);
digitalWrite(ledPinG, pattern & B00000010);
digitalWrite(ledPinDP, pattern & B00000001);
}
```
阅读全文