#include <pic.h>
#include "delay.h"
#define brisi_flag timer_flag=0
unsigned char timer;
unsigned char impuls;
unsigned char ton_koji_ne_svira;
static bit disable @ (unsigned)&PORTA*8+4;
static bit izlaz @ (unsigned)&PORTA*8+1;
static bit izlaz_inv @ (unsigned)&PORTA*8+0;
static unsigned char stanja @ 0x2e;
static bit stanje_izlaza @ (unsigned)&stanja*8+1;
static bit timer_flag @ (unsigned)&INTCON*8+2;
void
DelayMs_2(unsigned char cnt)
{
unsigned char i;
do { asm("CLRWDT");
if(ton_1)
return;
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
}
void
DelayMs(unsigned char cnt)
{
unsigned char i;
do { asm("CLRWDT");
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
}
void ton_1_2(unsigned char onaj_drugi_ton)
{
izlaz=0;
izlaz_inv=1;
stanje_izlaza=0;
TMR0=timer;
ton_1_2_start:
brisi_flag;
disable=0;
ton_1_2_sviranje:
while(timer_flag==0)
{
if((TMR0-timer)>=impuls)
{izlaz=0;
izlaz_inv=0;
}
}
brisi_flag;
TMR0=timer;
if(stanje_izlaza==0)
izlaz_inv=1;
else
izlaz=1;
stanje_izlaza=stanje_izlaza+1;
if((PORTA&0x0c)==onaj_drugi_ton)
return;
asm("CLRWDT");
goto ton_1_2_sviranje;
}
void main()
{
CMCON=0x07;//portA su normalni ulazi (za 16F628A)
TRISA=0x0c;
TRISB=0xff;
disable=1;
OPTION=0x81; //WDT na 18 msec, preset TMR0 sa 4
izlaz=0;
izlaz_inv=0;
timer=107;
impuls=0x1d;
ton_1_2(ton_koji_ne_svira);
}
이 프로그램은 스피커에 800 Hz에서 사운드를 생성합니다. 주파수를 계산하는 방법을 모르겠다. (변수가 impuls
이고 timer
이어야한다). 이 코드는 PIC16F628A
이고 외부 발진기는 4Mhz으로 설정되어 있습니다.
글쎄, 대부분의 경우, 특히 변수 이름이 폴란드어 또는 유사한 언어로 보이기 때문에이 중 하나를 이해하지 못합니다. –
@JoachimPileborg 변수의 이름을 변환했지만이 코드의 작동 방식을 여전히 이해할 수 없습니다 ... [http://enveloper.mozilla.org/ko/default.aspx] –