#include <LiquidCrystal.h>
// Khai báo các chân kết nối
#define BTN_B1 10
#define BTN_B2 11
#define BTN_B3 12
#define LED_7SEG_1 A0
#define LED_7SEG_2 A1
#define LCD_RS 22
#define LCD_EN 23
#define LCD_D4 24
#define LCD_D5 25
#define LCD_D6 26
#define LCD_D7 27
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // LED D1 đến D8
int mode = 0;
volatile int timerCounter = 0;
volatile bool displayOn7Seg = false;
bool lcdActive = false;
char studentName[] = "Nguyen Van A"; // Thay bằng tên sinh viên
const byte digitCodes[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
const int segmentPins[8] = {A2, A3, A4, A5, A6, A7, A8, A9}; // Chân a-g của LED 7 đoạn
void setup() {
// Thiết lập các chân LED
for (int i = 0; i < 8; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
// Thiết lập các chân nút nhấn
pinMode(BTN_B1, INPUT_PULLUP);
pinMode(BTN_B2, INPUT_PULLUP);
pinMode(BTN_B3, INPUT_PULLUP);
// Thiết lập LED 7 đoạn
pinMode(LED_7SEG_1, OUTPUT);
pinMode(LED_7SEG_2, OUTPUT);
digitalWrite(LED_7SEG_1, LOW);
digitalWrite(LED_7SEG_2, LOW);
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW);
}
// Khởi tạo LCD
lcd.begin(16, 2);
// Thiết lập ngắt TIMER1
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // Chế độ CTC, Prescaler 1024
OCR1A = 15624; // Chu kỳ 1 giây (16 MHz / 1024 / 1 Hz - 1)
TIMSK1 = (1 << OCIE1A); // Cho phép ngắt TIMER1
// Bật ngắt toàn cục
sei();
}
ISR(TIMER1_COMPA_vect) {
if (displayOn7Seg) {
timerCounter++;
if (timerCounter > 99) {
timerCounter = 0;
}
}
}
void displayDigit(int digit, int led) {
byte code = digitCodes[digit];
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], (code >> i) & 0x01);
}
digitalWrite(led, HIGH); // Kích hoạt LED tương ứng
delay(5); // Giữ hiển thị trong thời gian ngắn
digitalWrite(led, LOW); // Tắt LED
}
void display7Segment(int value) {
int tens = value / 10; // Chữ số hàng chục
int units = value % 10; // Chữ số hàng đơn vị
// Hiển thị chữ số hàng chục trên LED 7 đoạn 1
displayDigit(tens, LED_7SEG_1);
// Hiển thị chữ số hàng đơn vị trên LED 7 đoạn 2
displayDigit(units, LED_7SEG_2);
}
void loop() {
// Xử lý nút B1
if (digitalRead(BTN_B1) == LOW) {
delay(50); // Debounce
if (digitalRead(BTN_B1) == LOW) {
mode = (mode + 1) % 4;
while (digitalRead(BTN_B1) == LOW);
}
}
switch (mode) {
case 0:
// 8 LED tắt
for (int i = 0; i < 8; i++) {
digitalWrite(ledPins[i], LOW);
}
break;
case 1:
// 8 LED sáng
for (int i = 0; i < 8; i++) {
digitalWrite(ledPins[i], HIGH);
}
break;
case 2:
// Sáng lần lượt từ D8 đến D1
for (int i = 7; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(500);
digitalWrite(ledPins[i], LOW);
}
break;
case 3:
// Sáng lần lượt từ D1 đến D8
for (int i = 0; i < 8; i++) {
digitalWrite(ledPins[i], HIGH);
delay(500);
digitalWrite(ledPins[i], LOW);
}
break;
}
// Xử lý nút B2
if (digitalRead(BTN_B2) == LOW) {
delay(50); // Debounce
if (digitalRead(BTN_B2) == LOW) {
displayOn7Seg = !displayOn7Seg;
while (digitalRead(BTN_B2) == LOW);
}
}
// Hiển thị LED 7 đoạn
if (displayOn7Seg) {
display7Segment(timerCounter);
}
// Xử lý nút B3
if (digitalRead(BTN_B3) == LOW) {
delay(50); // Debounce
if (digitalRead(BTN_B3) == LOW) {
lcdActive = !lcdActive;
while (digitalRead(BTN_B3) == LOW);
}
}
if (lcdActive) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(studentName);
lcd.setCursor(0, 1);
if (mode == 0) {
lcd.print("Hay nhan B1");
} else {
lcd.print("B1 da nhan");
}
if (displayOn7Seg) {
lcd.setCursor(8, 1);
lcd.print("B2: ON");
} else {
lcd.setCursor(8, 1);
lcd.print("B2: OFF");
}
}
}