#include <avr/io.h>
#include <util/delay.h>
const uint8_t SEGMENT_MAP[16] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
0b01110111, // A
0b01111100, // b
0b00111001, // C
0b01011110, // d
0b01111001, // E
0b01110001 // F
};
void shiftOutByte(uint8_t data) {
for (int i = 7; i >= 0; i--) {
if (data & (1 << i))
PORTB |= (1 << PB0); // PB0 = DS 高
else
PORTB &= ~(1 << PB0); // PB0 = DS 低
PORTB |= (1 << PB1); // PB1 = SHCP 高
PORTB &= ~(1 << PB1); // PB1 = SHCP 低
}
PORTB |= (1 << PB2); // PB2 = STCP 高
PORTB &= ~(1 << PB2); // PB2 = STCP 低
}
void displayNumber(uint8_t num) {
if (num < 16) {
shiftOutByte(SEGMENT_MAP[num]);
}
}
void clearDisplay() {
shiftOutByte(0b00000000);
}
void setup() {
Serial.begin(9600);
DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2);//PB0~PB2(DS, SHCP, STCP)
DDRD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5));//DIP Switch
PORTD |= (1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5);
}
void loop() {
int a,b;// 讀取 DIP Switch 狀態 (PD2~PD5)
uint8_t switchState = ((PIND & 0b00111100) >> 2);
a=switchState/10;
b=switchState%10;
Serial.print("Tens:");
Serial.print(a);
Serial.print(" |ones:");
Serial.println(b);
// 顯示數字
displayNumber(a);
_delay_ms(500);
displayNumber(b);
_delay_ms(500);
clearDisplay();
_delay_ms(1000);
}