BASIC4MCU | 질문게시판 | LCD 부저연결질문입니다.
페이지 정보
작성자 Tell 작성일2023-05-19 19:59 조회52회 댓글1건본문
노래는 초기상태에서 켜져서 반복해서 재생되고 lcd는 아래 코드에 조건에 따라 출력할려고합니다. playMelody();를 void setup쪽에 두면 lcd패널 출력이 되지가 않고 while(1)에 넣으면 노래는 재생이 되나 버튼을 누를떄의 동작상태에 영향을 줍니다. 이 문제점을 해결하려면 어떻게 수정해야 하나요?
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <time.h>
#include <LiquidCrystal.h>
#include "pitches.h"
// LCD 핀 설정
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int num[10] = {0x3f, 0x06, 0x5B, 0x4f, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
int piezo = A3;
int melody[] = {
NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0,
NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7
};
int tempo[] = {
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12
};
int melodyLength = sizeof(melody) / sizeof(melody[0]);
void playMelody() {
for (int l = 0; l < melodyLength; l++) {
int notetempo = 1000 / tempo[l];
tone(piezo, melody[l], notetempo);
delay(notetempo);
noTone(piezo);
delay(50);
}
}
void setup()
{
pinMode(piezo, OUTPUT);
}
void loop() {
unsigned char flag = 0, mode = 0;
int i, random_num;
int a = 0; // a 변수 초기값 0으로 설정
int b = 0; // b 변수 초기값 0으로 설정
int buttonCount = 0; // 버튼 A 클릭 횟수 저장 변수
DDRA = 0xFF;
DDRC = 0x0F; // LED 출력 설정
PORTC = 0xF0;
srand(time(NULL));
PORTA = num[0];
_delay_ms(100);
// LCD 초기화
lcd.begin(16, 2);
// 초기 상태 출력
lcd.setCursor(2, 0);
lcd.print("Statera Game");
lcd.setCursor(0, 1);
lcd.print("A=");
lcd.setCursor(9, 1);
lcd.print("B=");
while (1) {
if (PINC & 0x10) {
if (flag == 0) {
flag = 1;
mode ^= 1;
_delay_ms(50);
buttonCount++; // 버튼 A 클릭 횟수 증가
// 버튼 A를 두 번 눌렀을 때, a에 저장된 값을 누적하여 출력
if (buttonCount % 4 == 2) {
lcd.setCursor(2, 1); // "A=" 다음 위치로 이동
lcd.print(" "); // 이전에 출력된 값 지우기
lcd.setCursor(2, 1);
a += random_num;
lcd.print(a); // a 값 출력
}
// 버튼 B를 네 번 눌렀을 때, b에 저장된 값을 누적하여 출력
if (buttonCount % 4 == 0) {
lcd.setCursor(11, 1); // "B=" 다음 위치로 이동
lcd.print(" "); // 이전에 출력된 값 지우기
lcd.setCursor(11, 1);
b += random_num;
lcd.print(b); // b 값 출력
}
}
} else {
if (flag) {
flag = 0;
_delay_ms(50);
}
}
if (mode == 1) {
random_num = rand() % 10;
PORTA = num[random_num];
PORTC = 0xF0 | random_num;
}
// a 값이 50을 초과하면 LED 4개 모두 켜기
if (a > 50) {
PORTC = 0xFF;
lcd.setCursor(4, 1);
lcd.print("!!");
_delay_ms(500);
lcd.setCursor(4, 1);
lcd.print(" "); // "!!" 출력 지우기
_delay_ms(500);
}
// b 값이 50을 초과하면 LED 4개 모두 켜기
if (b > 50) {
PORTC = 0xFF;
lcd.setCursor(13, 1);
lcd.print("!!");
_delay_ms(500);
lcd.setCursor(13, 1);
lcd.print(" "); // "!!" 출력 지우기
_delay_ms(500);
}
_delay_ms(50);
}
}
댓글 1
조회수 52master님의 댓글
master 작성일
unsigned char flag = 0, mode = 0;
int i, random_num;
int a = 0; // a 변수 초기값 0으로 설정
int b = 0; // b 변수 초기값 0으로 설정
int buttonCount = 0; // 버튼 A 클릭 횟수 저장 변수
변수는 전역변수로 선언하고
//
DDRA = 0xFF;
DDRC = 0x0F; // LED 출력 설정
PORTC = 0xF0;
srand(time(NULL));
PORTA = num[0];
_delay_ms(100);
// LCD 초기화
lcd.begin(16, 2);
// 초기 상태 출력
lcd.setCursor(2, 0); lcd.print("Statera Game");
lcd.setCursor(0, 1); lcd.print("A="); lcd.setCursor(9, 1); lcd.print("B=");
초기화 설정이나 초기 실행문들은 셋업함수에서 합니다.
loop() 함수와 while(1)무한루프는 동일한 기능이므로 while(1)은 필요없습니다.
아두이노 메인함수를 보면
int main(){
setup();
while(1){
loop();
}
}
이런식의 구조입니다.