게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
능력자님들 도움좀주세요!!
게시물ID : it_6623짧은주소 복사하기
작성자 : 대마법사전직
추천 : 0
조회수 : 1024회
댓글수 : 3개
등록시간 : 2017/11/14 08:35:36
#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 입니다.
기초가 없는 상태에서 할려니까 힘이 드네요 ㅠㅠ
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호