BASIC4MCU | 질문게시판 | atmega128 전화 멜로디
페이지 정보
작성자 weekizn 작성일2022-12-01 11:48 조회374회 댓글0건본문
1번, 2번 코드를 연결시켜서 전화번호가 뜰 때 전화벨소리 대신 멜로디가 나오게 하고 싶은데 어떻게 해야하나요 ..
도와주세요ㅠㅜㅠㅜㅠ
1.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
unsigned char fnd[]={0x00,0x00,0x00,0x3F,0x06,0x3F,0x40,0x5B,0x5B,0x66,0x6F,0x40,0x7D,0x7D,0x66,0x7F,0x00,0x00,0x00,0x00,0x00};
//010-2249-6648 << 제 번호 입니다.
unsigned char fnd_sel[4]={0x08,0x04,0x02,0x01}; //좌->우로 하고자 한다면 반대로 설정(08,04...)
//
int main(){
int sel,digit,del,j;
char togle,c;
DDRB=0x10; DDRG=0x0F; DDRC=0xFF;
while(1){
togle=c=0;
for(digit=0;digit<18;digit++){ // 499.2ms*18=8985.6ms
for(del=0;del<20;del++){ // 24.96ms*20=499.2ms
togle^=1;
if(togle){
for(j=0;j<6;j++){ // 4.16ms*6=24.96ms
for(sel=0;sel<4;sel++){ PORTC=fnd[digit+sel]; PORTG=fnd_sel[sel]; if(c<2)PORTB^=0x10; _delay_ms(1.04); } // 1.04ms*4=4.16ms
}
}
else{
for(j=0;j<4;j++){ // 6.24ms*4=24.96ms
for(sel=0;sel<4;sel++){ PORTC=fnd[digit+sel]; PORTG=fnd_sel[sel]; if(c<2)PORTB^=0x10; _delay_ms(1.56); } // 1.56ms*4=6.24ms
}
}
}
if(++c>5)c=0; // 0~1 = 벨소리 // 2~5 = 무음
}
}
return 0;
}
2. #include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define OFF 0 //isr state compare value
#define ON 1 //isr state compare value
#define DO 0
#define RE 1
#define MI 2
#define FA 3
#define SO 4
#define RA 5
#define SI 6
#define DO_H 7
#define RE_H 8
#define EOS 255 //(End of song)
// C(도) 523
// D(레) 587
// E(미) 659
// F(파) 699
// G(솔) 784
// A(라) 880
// B(시) 988
// C_H(도) 1047
// R_H(레) 1245
char cb[]={238,212,189,178,158,141,126,118}; //8bit compare_interrupt:(compare TCNT0 and OCR0(use value)).
unsigned char mz[]={SO, RA, SO, MI, DO_H, RA, SO, SO, RA, SO, RA, SO, DO_H, SI, FA, SO, FA, RE, SI, RA, SO, SO, RA, SO, RA, SO, RA, MI, SO, RA, SO, MI, DO_H, RA, SO, SO, RA, SO, RA, SO, DO_H, SI, EOS};
volatile unsigned char init_state = OFF, tone;
// e.g: duty cycle : 50% half: 0 or 1.(T/2) atmel128 16MHZ T: 0.0625us prescale: 64 T: 4us. 8bit timer&counter : 256ea
void init_buzzer();
void comparei_CTC_bit_set();
int main(void)
{
int i=0;
init_buzzer();
comparei_CTC_bit_set();
do{
cli();
tone= mz[i++]; //critical section. // for문으로 변경하여 변수인자형을 unsigned char (256)값으로 한정.
sei();
PORTA = tone; //mz 값 확인용.
_delay_ms(300);
}while(tone!=EOS);
}
ISR(TIMER0_COMP_vect)
{
OCR0 = cb[tone];
if(init_state==OFF)
{
PORTB |= (1<<PB4);
init_state = ON;
}
else
{
PORTB &= ~(1<<PB4);
init_state = OFF;
}
}
void init_buzzer()
{
DDRA = 0xff;
DDRB = (1<<PB4);
}
void comparei_CTC_bit_set()
{
TCCR0 = 0;
TCCR0 |= (1<<WGM01)|(0<<WGM00); //waveforme generate : CTC ,TOP: OCR0, update: immeiate, Max. 00, 01, (10) 11.
TCCR0 |= (0<<COM01)|(1<<COM00); // Toggle OC0 on compare match. (non-PWM mode) 00, 01, 10, 11 don't care in //this code.
TCCR0 |= (1<<CS2)|(0<<CS1)|(0<<CS0); // prescale:64, 000:source clock 011:32, 100:64, 101:128, 110:256, 111:1024
TIMSK = 0;
TIMSK |= (1<<OCIE0); // interrupt by Compare tcnt0 (0~0xff) and OC0 (user value)valuse.
TCNT0 = 0;
sei(); // enable global interrupt.
}
댓글 0
조회수 374등록된 댓글이 없습니다.