Ir ao conteúdo

Piano eletrônico


lucaskaique

Posts recomendados

Postado

Preciso fazer um programa que simule um piano eletrônico com sete botões e uma buzina com um pic16F877A. A ideia é alterar a frequência da buzina usando um timer0, e eu não tenho ideia de como fazer isso no código. Tudo o que fiz até agora foi fazer os botões ativarem a buzina, e travei aqui. O que posso fazer?

void main() {

TRISD = 0b01111111;
PORTD = 0b00000000;
OPTION_REG = 0b11000111;
TMR0 = 0;

while (1) {
while(PORTD.F0 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F1 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F2 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F3 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F4 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F5 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
while(PORTD.F6 == 0) {

PORTD.F7 = 1;
delay_ms (500);
PORTD.F7 = 0;
}
}
}

Postado
while(PORTD.F0 == 0) {

PORTD.F7 = 1;

delay_ms (500);

PORTD.F7 = 0;

}

Precisas de frequências altas, o que significa período baixo. troca o delay_ms por delay_us. E deves dar também um delay depois de por o pino a zero. Esse tempo não precisa necessariamente ser igual ao outro.


while(PORTD.F0 == 0)
{
PORTD.F7 = 1;
[COLOR="SeaGreen"][B]delay_us[/B][/COLOR] (500);
PORTD.F7 = 0;
[COLOR="SeaGreen"][B]delay_us[/B][/COLOR] (500);
}

E não faz sentido usares o mesmo tempo para todos os botões. usa tempo diferente pra cada um, é daí que sairá os vários tons do piano.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...