This commit is contained in:
wancat
2022-03-23 12:05:25 +08:00
parent d56ea0dab0
commit 6b661f1d48
5 changed files with 268 additions and 53 deletions

90
week5-5/week5-5.ino Normal file
View File

@@ -0,0 +1,90 @@
const unsigned int scan[] = {5, 6, 7, 8};
const unsigned int LED[] = {9, 13, 2, 3};
const unsigned int BUTTON[] = {A0, A1};
#define DATA 10
#define LATCH 11
#define CLK 12
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(scan[i], OUTPUT);
digitalWrite(scan[i], HIGH);
}
for (int i = 0; i < 4; i++) {
pinMode(LED[i], OUTPUT);
digitalWrite(LED[i], HIGH);
}
for (int i = 0; i < 2; i++) {
pinMode(BUTTON[i], INPUT);
}
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
int get_mode() {
static int last = 0;
for (int i = 0; i < 2; i++) {
if (!digitalRead(BUTTON[i])) {
last = i+1;
return last;
}
}
return last;
}
void show(byte digits[4]) {
for (int i = 0; i < 4; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, ~digits[i]);
digitalWrite(LATCH, HIGH);
digitalWrite(scan[3 - i], LOW);
delay(1);
digitalWrite(scan[3 - i], HIGH);
}
}
void mode_display() {
static byte digits[4];
static byte p = 0;
static unsigned long checkpoint = 0;
show(digits);
if (millis() - checkpoint > 200) {
if (p == 4) {
// all the numbers are turned on, reset
p = 0;
for (int i = 0; i < 4; i++) digits[i] = 0;
}
digits[p] <<= 1;
digits[p] += 1;
if (digits[p] == 0xFF) {
// if current digit is full, change to the next one
p++;
}
checkpoint = millis();
}
}
void mode_led() {
static unsigned long checkpoint;
static int c = 0;
if (millis() - checkpoint > 200) {
for (int i = 0; i < 4; i++) {
digitalWrite(LED[i], i != c%4);
}
c++;
checkpoint = millis();
}
}
void loop() {
switch (get_mode()) {
case 1:
mode_display();
break;
case 2:
mode_led();
break;
}
}