#include <htc.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);

#define _XTAL_FREQ 4000000 
#define tan 5
#define tyo 15


//WRITE No.1(0-63)
__EEPROM_DATA(0x43,0x51,0x20,0x43,0x51,0x25,0xFF,0xFF); /* 0-7    00-07 CQ CQ*/
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 8-15   08-0F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,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(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 40-47  28-2F */

__EEPROM_DATA(0x55,0x52,0x20,0x35,0x39,0x39,0x25,0xFF);	/* 48-55  30-37 UR 599*/
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 56-63  38-3F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 64-71  40-47 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 72-79  48-4F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 80-87  50-57 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 88-95  58-5F */

__EEPROM_DATA(0x54,0x4E,0x58,0x20,0x51,0x53,0x4F,0x25);	/* 96-103   60-67 TNX QSO*/
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 104-111  68-6F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 112-119  70-77 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 120-127  78-7F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 128-135  80-8F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);	/* 136-143  90-97 */



ioport();
char getch();
void putch(char);

mojisend();
ra2_1tyo();
ra2_0tyo();
ra2_1tan();
ra2_0tan();
romread();
jmprm1();
jmprm2();
jmprm3();
rs232();
_romcnt();

char rommoji;
char rxdata;
int cntmoji;
int flug1;
int flug2;
int cnt;
int sadd;
int romcnt;
int scnt;
int speed;


main()
{	

//	OSCCON=0x00;	/*  31kHz */	
//	OSCCON=0x30;	/* 500kHz */
	OSCCON=0x60;	/* 4000kHz */
//	OSCCON=0x70;	/* 8000kHz */

/*RCSTA,TXSTAの設定位置は	BRGH,SPBRGの前に書く、後に書いてもビルドもプログラムもエラーは出ないが、実動作しない*/
	RCSTA=0x90;		/* USART非同期モード */
	TXSTA=0x20;

//	BRGH=1;			/* 31khz 300bps */
//	SPBRG=5;				
//	BRGH=1;			/* 500khz 1200bps */
//	SPBRG=25;				
//	BRGH=1;			/* 500khz 2400bps */
//	SPBRG=12;
	BRGH=1;			/* 4000khz 1200bps */
	SPBRG=207;
//	BRGH=0;			/* 8000khz 2400bps */
//	SPBRG=51;
//	BRGH=0;			/* 8000khz 9600bps */
//	SPBRG=12;


	ioport();

	romcnt=0;
	cntmoji=0;
	cnt=0;
	sadd=0;
	flug1=0;
	flug2=0;
	speed=5;
	
	while(1){

//読み出しの時のspeed
			if(RA4==1 && RA5==0 && flug2==0) jmprm2();
			if(RA4==1 && RA5==1 && flug2==1) jmprm3();
			
//読み出しアドレスのカウント
			if(RA4==1 && RA1==0 && flug1==0) jmprm1();
			if(RA4==1 && RA1==1 && flug1==1) _romcnt();

//読み出しスタート
			if(RA4==1 && RA0==0 && flug1==0)romread();
	
			
//rs232通信での書き込み、読み出し
			if(RA4==0) rs232();
		

	}
}

/*  関数  */
ioport()
{
	ANSEL=0x00;		/* RA0,1,2,4,RC0,1,2,3をデジタル */
	CMCON0=0x07;	/*  RA0,1,2RC0,1,2をデジタル */
	
	TRISA=0xFB;		/* RA0,1,3,4,5は入力ピンRA2は出力ピン */
	TRISC=0x00;		/* RC0-5は出力ピン */
	PORTA=0xF8;		/* RA3,4,5はH RA0,1,2はL */
	PORTC=0;		/* RC0-5はL */

}

char getch()
{
	while(!RCIF);		/* 受信したら */
	return(RCREG);		/* データを読む */
}

void putch(char txdata)
{
	while(!TXIF);		/* 送信バッファが空いたら */
	TXREG=txdata;		/* 1バイトだけ書く */
}

jmprm1()
{
	__delay_ms(100);
	flug1=1;
}
jmprm2()
{
	flug2=1;
}
jmprm3()
{
	flug2=0;
	++speed;
	if(speed>=30) speed=15;
}
_romcnt()
{
	__delay_ms(100);
flug1=0;
++romcnt;
	if(romcnt>=3) romcnt=0;
	if(romcnt==0) sadd=0;
	if(romcnt==1) sadd=48;
	if(romcnt==2) sadd=96;
}

rs232()
{
//PCからの文字をゲットする
	rxdata=getch();

		switch(rxdata){

				case 'x':
							cnt=0;
							sadd=0;
							break;
				case 'y':
							cnt=0;
							sadd=48;
							break;
				case 'z':
							cnt=0;
							sadd=96;
							break;
				case 0x21:
							speed=18;
							break;
				case 0x22:
							speed=13;
							break;
				case 0x23:
							speed=10;
							break;
				case 0x24:
							speed=7;
							break;

		}




//ゲット文字が'~'ならPIC EEPROM内容を、'%'が書き込まれている所まで読み出す。
		if(rxdata == 0x7E){
			romread();
		}

		//ゲット文字が >= 0x20 && <= 0x5Aなら、'%'が送られるまでEEPROMに書き込む
		//if(rxdata >= 0x20 && rxdata <= 0x5A || rxdata == 'a' || rxdata == 'b' || rxdata == 'h' || rxdata == 's' ){
	
//space,/,%,A-Z,0-9,a,b,h,s は書込み可
if(rxdata >= 0x2F && rxdata <= 0x39 || rxdata >= 0x41 && rxdata <= 0x5A || rxdata==0x25 || rxdata== ' ' || rxdata == 'a' || rxdata == 'b' || rxdata == 'h' || rxdata == 's' ){
			  eeprom_write(cnt+sadd,rxdata);
				++cnt;

		//cntが>=49もしくは、ゲット文字が'%'なら、cntを0にして書き込みから抜ける。
					if (cnt>=48 || rxdata == 0x25){
						cnt=0;
					}
					
		}
}

romread()
{
//do while の記述方法 whileの所の(rommoji != '%')が成立中(%以外)は繰り返す。'%'なら抜ける
			
			do{	
				rommoji=eeprom_read(cntmoji+sadd);
			
				printf("%c\n",rommoji);
				mojisend();

				++cntmoji;
			}while(rommoji != '%'); 

				cntmoji=0; /* 抜けたらcntmoji=0にする*/
				flug1=0;
}


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()
{
		RA2=1;
		for(scnt=0;scnt<speed;scnt++) __delay_ms(tyo);
		RA2=0;
}
ra2_0tyo()
{
		for(scnt=0;scnt<speed;scnt++) __delay_ms(tyo);
}
ra2_1tan()
{
		RA2=1;
			for(scnt=0;scnt<speed;scnt++) __delay_ms(tan);
		RA2=0;
}
ra2_0tan()
{
		    for(scnt=0;scnt<speed;scnt++) __delay_ms(tan);
}