#include<avr/io.h>
#include<util/delay.h>
#define FREQ(x) (unsigned int)(7372800/(2*(x)))
void Change_FREQ(unsigned int freq);
void STOP_FREQ();
void Pop_Button();
unsigned char Push_Button();
unsigned int key2DoReMi(unsigned char key);
int main(){
unsigned char piano=0;
DDRE = 0x08;
DDRD = 0x00;
TCCR3A |= 0x40;
TCCR3B |= 0x19;
TCCR3C = 0x00;
TCNT3 = 0x0000;
STOP_FREQ();
while(1){
piano = Push_Button();
Change_FREQ(key2DoReMi(piano));
Pop_Button();
STOP_FREQ();
}
return 0;
}
void Change_FREQ(unsigned int freq){
unsigned int x;
TCCR3A |= 0x40;
TCCR3B |= 0x19;
do{
x=TCNT3;
}while(x>=FREQ(freq));
ICR3 = FREQ(freq);
}
void STOP_FREQ(){
TCCR3A = 0x00;
TCCR3B = 0x00;
TCNT3 = 0;
ICR3 = FREQ(0);
PORTE = 0xFF;
}
void Pop_Button(){
while((PIND & 0xFF)!=0x00);
}
unsigned char Push_Button(){
while((PIND & 0xFF)==0x00);
return PIND;
}
unsigned int key2DoReMi(unsigned char key){
unsigned int _ret = 0;
switch(key){
case 0x01:
_ret = 523;
break;
case 0x02:
_ret = 587;
break;
case 0x04:
_ret = 659;
break;
case 0x08:
_ret = 698;
break;
case 0x10:
_ret = 783;
break;
case 0x20:
_ret = 880;
break;
case 0x40:
_ret = 987;
break;
case 0x80:
_ret = 1046;
break;
}
return _ret;
}
이게 각각 8개 버튼 누르면 피에조부저? 에서 도레미파솔라시 음계나오는 코드인데요
이거를 버튼하나만 누르면 자동으로 솔솔라라솔솔미 나오게 할 수 있나요?
저녁에 하다가 안되서 화가나서 능력자님들께 여쭤 봅니다.
Atmeg128 입니다.
기초가 없는 상태에서 할려니까 힘이 드네요 ㅠㅠ