<PIC12F629のCW送信>

8ピンの小さいPIC12F629を使って3パターンCW文字列送信回路を作りましたので紹介します。
このPICは128バイトのEEPROMを内蔵していますので、プログラムを焼く時に3パターンの
CW文字列もEEPROMに保存しますので、電源を切っても内容は消えません。
文字送信中のスピード変更が出来ます。
右端がスタート、真ん中がパターン切替、左端がスピード変更のスイッチ

基板に組立(クリックして見て下さい)                                    


回路図 


プログラムソース
******************************** main **********************************

////////////////////////////////////////////////////////////////////////////////////////////////
// PIC12F629 8ピン IOポートGPIO0-GPIO5の6つ                                                  //
// EEPROMに書き込んでいる3パターンの文字列を読み出して低周波発信器を鳴らす                   //
// パターンの選択が出来る、スピードが変えれる。                                              //
// GPIO1:モールス出力点滅用 GPIO2:スピード変更 GPIO3:文字送信スタート用 GPIO4:パターン切替//
////////////////////////////////////////////////////////////////////////////////////////////////

#include <htc.h>
#define JIKAN 50
//発信周波数は、INTIO設定しているので4MhzとなるのでOSCCONなどの設定はない
__CONFIG(BOREN & UNPROTECT & MCLRDIS & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);
#define _XTAL_FREQ 4000000	/*4000Khz */ 
//WRITE No.1(0-119)
__EEPROM_DATA('C','Q','C','Q',' ','D','E',' ');         /* 0-7    00-07 */
__EEPROM_DATA('J','A','3','R','U','A',' ','P');	        /* 8-15   08-0F */
__EEPROM_DATA('S','E',' ','K','%',0xFF,0xFF,0xFF);	    /* 16-23  10-17 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 24-31  18-1F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 32-39  20-27 */
__EEPROM_DATA('b','K',' ','G','A',' ','T','N');	  	    /* 40-47  28-2F */
__EEPROM_DATA('X',' ','F','B',' ','R','P','T');	        /* 48-55  30-37 */
__EEPROM_DATA(' ','U','R',' ','A','L','S','O');	        /* 56-63  38-3F */
__EEPROM_DATA(' ','5','9','9',' ','b','K','%');	        /* 64-71  40-47 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 72-79  48-4F */
__EEPROM_DATA('T','N','X',' ','F','B',' ','Q');	        /* 80-87  50-57 */
__EEPROM_DATA('S','O',' ','E','S',' ','H','P');	        /* 88-95  58-5F */
__EEPROM_DATA('E',' ','C','U',' ','A','G','N');	        /* 96-103   60-67 */
__EEPROM_DATA(' ','7','3',' ','s','K',' ','E');	        /* 104-111  68-6F */
__EEPROM_DATA(' ','E','%',0xFF,0xFF,0xFF,0xFF,0xFF);    /* 112-119  70-77 */

ioport();
mojisend();
j_flug1();
j_flug2();
j_flug3();
j_flug4();

char rommoji;
int r_add=0;
int flug=1;
int flug1=1;
int cnt_add=0;
int s_add=0;
int cnt_speed=1;

main()
{

		INTF=0;	
		ioport();
		
		while(1){
				
			if(flug==1 && GPIO4==0)j_flug1();	/*GPIO4:パターン切替*/
			if(flug==0 && GPIO4==1)j_flug2();
		
			if(flug1==1 && GPIO3==0)j_flug3();	/*GPIO3:スタート*/
			if(flug1==0 && GPIO3==1)j_flug4();
		}

}


/*   関数群   */
interrupt warikomi()
{

++cnt_speed;
if(cnt_speed>20)cnt_speed=1;

		INTF=0;		/*INTCONレジスタ 入力エッジがあると1になるので0にしておく*/
}

ioport()
{
//	ANSEL=0x00;		/* デジタルI/Oモードにする 12F675はこの設定がある。*/
	CMCON=0x07;	    /* デジタルI/Oモードにする */
	
	GPIO=0;			/* PORTを初期化する */
	TRISIO=0x1c;	/* GPIO2,3,4は入力GPIO0,1,5は出力*/

	INTEDG=1;		/*OPTIONレジスタ  1:立上がり*/
	INTF=0;			/*INTCONレジスタ 入力エッジがあると1になるので0にしておく*/
	INTE=1;			/*INTCONレジスタ 1:入力エッジ使う*/
	GIE=1;      	/*割り込みを使う*/	
}

j_flug1()
{
__delay_ms(JIKAN);
flug=0;
}

j_flug2()
{
__delay_ms(JIKAN);

flug=1;
++cnt_add;

	if(cnt_add>=3) 	cnt_add=0;	/*cnt_add>=3 3回以上押すとS_add=0にcnt_add=0にする*/
	if(cnt_add==0)s_add=0;
	if(cnt_add==1)s_add=40;
	if(cnt_add==2)s_add=80;

}

j_flug3()
{
flug1=0;
}

j_flug4()
{
flug1=1;
//do while の記述方法 whileの所の(rommoji != '%')が成立中(%以外)は繰り返す。'%'なら抜ける
			do{	
				rommoji=eeprom_read(s_add+r_add);
			
					mojisend();
					++r_add;
			}while(rommoji != '%'); 
		r_add=0;
}

******************************** main ここまで**********************************


******************************** mojisend**********************************

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                               //
// 1つのメインプログラムで構成していたが、mojisendを別のmojisend.cとした。                                         //
// 従って、rom_cw3b.cとmijisend.cの2つで構成している、 mojisend.cを別のプログラムから利用させたいため分離した。//
// ポイントは、メインプログラムから文字が入ったrommoji変数をmojisend()に渡せばいい				 //
//														 //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#include <htc.h>
#define _XTAL_FREQ 4000000	/*4000Khz */ 
#define JIKAN 500			/* 500ミリ秒 */
#define tan 5
#define tyo 15
#define port GPIO1			/*ioポートをここで設定する*/

							
//モールスの短点・長点関数
ra2_1tyo();
ra2_0tyo();
ra2_1tan();
ra2_0tan();

char rommoji;					/*メインプログラムからのモールス符号変数をもらう*/
int scnt;						/*短点・長点スピード用変数1*/
int speed=5;					/*短点・長点スピード用変数2*/
int cnt_speed=1;				/*短点・長点スピード用変数3  メインプログラムでスピードを設定、あるポートのoff/on回数*/

mojisend()
{

		switch(rommoji){

				case 'A':
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'a':
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
						break;
				case 'B':
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'b':
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
						break;
				case 'C':
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'D':
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'E': 
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'F': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'G': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'H': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'h': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
						break;
				case 'I': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'J': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'K': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'L': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'M': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'N': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'O': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'P': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'Q': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'R': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 'S': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case 's': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
						break;
				case 'T': 
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'U': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'V': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'W': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'X': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;

				case 'Y': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case 'Z': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '1': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case '2': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case '3': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case '4': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case '5': 
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '6': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '7': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '8': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '9': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;
				case '0': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tyo();
						break;
				case ' ': 
				ra2_0tyo();
				ra2_0tyo();
						break;
				case '/': 
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tan();
				ra2_0tan();
				ra2_1tyo();
				ra2_0tan();
				ra2_1tan();
				ra2_0tyo();
						break;

		}

}

ra2_1tyo()
{
		port=1;
		for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo);
		port=0;
}
ra2_0tyo()
{
		for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo);
}
ra2_1tan()
{
		port=1;
			for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan);
		port=0;
}
ra2_0tan()
{
		    for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan);
}

******************************** mojisendここまで**********************************

PIC12F629のCW送信 HEXファイル