BASIC4MCU | 질문게시판 | 답변 : ATMEGA128A 질문있습니다 수정자료
페이지 정보
작성자 master 작성일2018-12-16 08:04 조회11,564회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=6933
작성일
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-16 오전 8:07:00// by Ok-Hyun Park//#include <io.h>//typedef enum{ra_1,si_1,do_2,re_2,mi_2,fa_2,sol_2,ra_2,high} melody_code; //high: 불가청 음역대 쉼표 표시typedef enum{tf,f,sf,o,t} speed_code; // 1/4,1/2,3/4,1,2//const char clock_set[]={0x6F,0x6E,0x6E,0x6E,0x6E,0x6E,0x6E,0x6E,0x6A};const char ocr0_set[] ={142,253,238,212,189,179,159,142,1};const int timer[] ={188,375,563,750,1500}; // 단위: msconst char led[] ={0x01,0x03,0x07,0x0f,0xff};const char oct[] ={0x06,0x06,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x00};const char scale[] ={0x77,0x39,0x06,0x4f,0x6d,0x7d,0x7f,0x77,0x00};//typedef struct{ melody_code melody; speed_code speed;} MUSIC_CODE;//#define LENGTH 99//const MUSIC_CODE musicCode1[LENGTH]={{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가{do_2,o},{do_2,f},{do_2,f},{mi_2,o},{mi_2,o},{sol_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가{ra_1,o},{ra_1,f},{ra_1,f},{si_1,o},{si_1,o},{do_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라{ra_2,o},{ra_2,o},{ra_2,f},{ra_2,f},{ra_2,f},{ra_2,f}, // 눈도 감지말고{sol_2,o},{sol_2,f},{sol_2,f},{sol_2,o},{sol_2,o}, // 웃지도 말고{fa_2,o},{fa_2,f},{fa_2,f},{fa_2,o},{fa_2,o}, // 울지도 말고{mi_2,f},{mi_2,f},{fa_2,f},{fa_2,f},{sol_2,f},{high,f},{high,o}, // 움직이지마{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,tf},{si_1,o},{high,o},// 즐겁게 춤을추다가{do_2,o},{do_2,tf},{do_2,f},{mi_2,o},{mi_2,o},{sol_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가{ra_1,o},{ra_1,f},{ra_1,f},{si_1,o},{si_1,o},{do_2,f},{high,f},{high,o},{high,t} // 그대로 멈춰라};//int ms=0;//interrupt[TIM2_COMP]void isr_timer2_comp(){ms++;}//void main(){int k;DDRB=0x10; DDRA=0XFF; DDRC=0xFF; DDRG=0x0F;TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1msSREG=0x80;while(1){for(k=0;k<=98;k++){ms=0;while(timer[musicCode1[k].speed]>ms){ // 박자 조절OCR0=ocr0_set[musicCode1[k].melody];TCCR0=clock_set[musicCode1[k].melody];PORTA=led[musicCode1[k].speed]; // led 박자 길이 표시if(ms&1){ PORTC=oct[musicCode1[k].melody]; PORTG=8; } // 옥타브 표시else { PORTC=scale[musicCode1[k].melody]; PORTG=1; } // 음계 표시}}}}
몇가지 오류를 체크 했지만 정상동작할런지는 모르겠습니다.
원본 소스 출처에서 정상동작하는 소스인지 확인 해보세요
16비트 타이머로 만든 멜로디 예제를 공부해서 만드는 것이 빠를 수도 있겠습니다.
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo9&wr_id=138
게시판에 몇개의 글이 더 있습니다.
댓글 2
조회수 11,564헤헿헿님의 댓글
헤헿헿 작성일
감사합니다 드디어 해결됬네요 ㅠ
if(ms & 1) 에서 &가 어떻게 동작하는지만 마지막으로 설명해주실 수 있나요
master님의 댓글
master
ms&1
ms가 1이면 결과는 1
ms가 0이면 결과는 0
if(ms&1){ PORTC=oct[musicCode1[k].melody]; PORTG=8; } // 옥타브 표시
else { PORTC=scale[musicCode1[k].melody]; PORTG=1; } // 음계 표시
ms가 홀수면 옥타브표시
짝수면 음계표시