******************************************** main ここから*********************************************
////////////////////////////////////////////////////////////////////
//PCからモールス符号をPIC16F689に書き込む40文字/1パターンで6パターンまで可能
//書き込んだ文字はPIC単体で読み出せる、モールス符号送出スピードが可変可能
//PICからPCに送出符号を送出できるのでPCで確認できる
//赤SW:モールス符号読出し
//緑SW:読出しアドレス設定、10回押すと6パターンの内容を表示する
//白SW:モールス符号送出スピードの可変
//黒SW:リセット
//トグルSW:左側でPIC単体操作、右側でPCからの操作
//LCD:SC1602 20文字/1行の2行表示
///////////////////////////////////////////////////////////////////
//#include<pic.h>
#include<htc.h>
#include<stdio.h>
//#include<string.h>
//発振をINTIOからHSに変更するにはこの689l4er_a.cソースの(1)__CONFIG、(2)#define _XTAL_FREQ
//(3)OSCCON=0x60;をコメント、(4)のBRGH、SPBRGを変更
//(5)mojisend_a.cと(6)689int_a.cの#define _XTAL_FREQも変更
//(1)
__CONFIG(PWRTEN & WDTDIS & MCLREN & INTIO);/*内部発振*/
//__CONFIG(PWRTEN & WDTDIS & MCLREN & HS);/*水晶発振*/
//WRITE No.1(0-39)
__EEPROM_DATA('C','Q',' ','C','Q',' ','D','E'); /* 0-7 00-07 */
__EEPROM_DATA(' ','J','A','3','R','U','A',' '); /* 8-15 08-0F */
__EEPROM_DATA('P','S','E',' ','K','%',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 */
//WRITE No.2(40-79)
__EEPROM_DATA('b','K',' ','G','M',' ','U','R'); /* 40-47 28-2F */
__EEPROM_DATA(' ','5','9','9',' ','b','K','%'); /* 48-55 30-37 */
__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 */
//WRITE No.3(80-119)
__EEPROM_DATA('b','K',' ','T','N','X',' ','F'); /* 80-87 50-57 */
__EEPROM_DATA('B',' ','R','P','T',' ','F','M'); /* 88-95 58-5F */
__EEPROM_DATA(' ','O','S','A','K','A',' ','b'); /* 96-103 60-67*/
__EEPROM_DATA('K','%',0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 104-111 68-6F */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 112-119 70-77 */
//WRITE No.4(120-159)
__EEPROM_DATA('b','K',' ','H','R',' ','Q','T'); /* 120-127 78-7F */
__EEPROM_DATA('H',' ','I','S',' ','M','O','R'); /* 128-135 80-87 */
__EEPROM_DATA('I','G','U','C','H','I',' ','C'); /* 136-143 88-8F */
__EEPROM_DATA('I','T','Y',' ','b','K','%',0xFF); /* 144-151 90-97 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 152-159 98-9F */
//WRITE No.5(160-199)
__EEPROM_DATA('b','K',' ','H','R',' ','W','X'); /* 160-167 A0-A7 */
__EEPROM_DATA(' ','I','S',' ','V','Y',' ','F'); /* 168-175 A8-AF */
__EEPROM_DATA('I','N','E',' ','E','S',' ','T'); /* 176-183 B0-B7 */
__EEPROM_DATA('E','P',' ','I','S',' ','2','5'); /* 184-191 B8-BF */
__EEPROM_DATA('C',' ','b','K','%',0xFF,0xFF,0xFF); /* 192-199 C0-C7 */
//WRITE No.6(200-239)
__EEPROM_DATA('b','K',' ','T','N','X',' ','F'); /* 200-207 C8-CF */
__EEPROM_DATA('B',' ','Q','S','O',' ','E','S'); /* 208-119 D0-D7 */
__EEPROM_DATA(' ','H','P','E',' ','C','U',' '); /* 216-223 D8-DF */
__EEPROM_DATA('A','G','N',' ','7','3',' ','s'); /* 224-231 E0-E7 */
__EEPROM_DATA('K',' ','E',' ','E','#',0xFF,0xFF); /* 232-239 E8-EF */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 240-247 F0-F7 */
__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,'#'); /* 248-255 F8-FF */
//(2)
//#define _XTAL_FREQ 4000000 /* 4MHz */
#define _XTAL_FREQ 8000000 /* 8MHz */
//#define _XTAL_FREQ 10000000 /* 10MHz */
//#define _XTAL_FREQ 20000000 /* 20MHz */
#define JIKAN 500 /* 500ミリ秒 */
#define PORT PORTC
#define ENABLE RA0
#define RS RA1
#define JIKAN1 1100
#define JIKAN2 500
char getch();
lcd_position(unsigned char);
void putch(unsigned char rxdata);
lcd_init();
ioport();
romread();
romread2();
flug1();
flug2();
flug3();
flug4();
rs232();
char rxdata;
char txdata;
int pos=0;
int sadd=0;
int cntmoji=0;
int flug_1=0;
int flug_2=0;
char rommoji;
int cnt=0;
int romcnt=0;
int cnt_speed;
int speed=5;
int dcnt=0; ///////////////////////////////
main()
{
//(3)
//OSCCON=0x60; /* 4000kHz */
OSCCON=0x70; /* 8000kHz */
/*RCSTA,TXSTAの設定位置は BRGH,SPBRGの前に書く、後に書いてもビルドもプログラムもエラーは出ないが、実動作しない*/
RCSTA=0x90; /* USART非同期モード */
TXSTA=0x20;
//(4)
BRG16=0;
//4Mhz:1 8Mhz,10Mhz,20Mhz:0
BRGH=0;
//BRGH=1;
//SPBRG=103; /* 4Mhz 2400bps */
SPBRG=51; /* 8Mhz 2400bps */
//SPBRG=64; /* 10Mhz 2400bps */
//SPBRG=129; /* 20Mhz 2400bps */
ioport();
lcd_init(); /* LCDを初期化する */
lcd_position(0x00);
printf("YYCW モールス ソウシュツ");
lcd_position(0x40);
printf("PIC16F689 Ver1.4");
while(1){
//RC4→RB5 RA5→RC5
//読み出しスタート
if(RB6==1 && RC4==0 && flug_1==0)flug1();
if(RB6==1 && RC4==1 && flug_1==1)flug2();
//読み出しアドレス
if(RB6==1 && RC5==0 && flug_2==0)flug3();
if(RB6==1 && RC5==1 && flug_2==1)flug4();
//rs232通信での書き込み、読み出し
if(RB6==0) rs232();
}
}
flug1()
{
flug_1=1;
}
flug2()
{
flug_1=0;
romread();
}
flug3()
{
flug_2=1;
}
flug4()
{
flug_2=0;
++romcnt;
if(romcnt>=10){
romcnt=0;
romread2();
}
if(romcnt==0)sadd=0;
if(romcnt==1)sadd=40;
if(romcnt==2)sadd=80;
if(romcnt==3)sadd=120;
if(romcnt==4)sadd=160;
if(romcnt==5)sadd=200;
}
rs232()
{
//YYRS232V2e(VB6で作成RS232C通信アプリ)から送られたrxdataの文字を調べる
//下の?からCに対応する処理がrxdata=getch();の下にある記述
//@6つのアドレスボタンにu,v,w,x,y,zが夫々設定してあり、押すと送出する
//A4つのモールススピードボタンに0x21,0x22,0x23,0x24が夫々設定してあり、押すと送出する
//Bメモリ読出しボタンを押すと ~(0x7E) が送出する
//C書込みボタンを押すと入力文字の末尾に%が追加されて送出する
//PCからの文字をゲットする
rxdata=getch();
//PCからの読出し開始メモリアドレスとモールススピードの設定
switch(rxdata){
//@
case 'u':
cnt=0;
sadd=0; /*読出し開始メモリアドレス*/
break;
case 'v':
cnt=0;
sadd=40; /*読出し開始メモリアドレス*/
break;
case 'w':
cnt=0;
sadd=80; /*読出し開始メモリアドレス*/
break;
case 'x':
cnt=0;
sadd=120; /*読出し開始メモリアドレス*/
break;
case 'y':
cnt=0;
sadd=160; /*読出し開始メモリアドレス*/
break;
case 'z':
cnt=0;
sadd=200; /*読出し開始メモリアドレス*/
break;
//A
case 0x21:
cnt_speed=5;/*モールススピード*/
break;
case 0x22:
cnt_speed=7;/*モールススピード*/
break;
case 0x23:
cnt_speed=10;/*モールススピード*/
break;
case 0x24:
cnt_speed=15;/*モールススピード*/
break;
}
//ゲット文字が'~'ならromread()関数で、PIC EEPROM内容を、'%'が書き込まれている所まで読み出す。
//B
if(rxdata == 0x7E){
romread();
}
//ゲット文字が >= 0x30 && <= 0x5Aなら、'%'が送られるまでEEPROMに書き込む
//C
if(rxdata >= 0x30 && rxdata <= 0x5A || rxdata == '%' || rxdata == '/' || rxdata == ' ' || rxdata == 'a' || rxdata == 'b' || rxdata == 'h' || rxdata == 's' ){
eeprom_write(cnt+sadd,rxdata);
++cnt;
//cntが>=40もしくは、ゲット文字が'%'なら、cntを0にして書き込みから抜ける。
if (cnt>=40 || rxdata == 0x25){
cnt=0;
}
}
}
romread()
{
//do while の記述方法 whileの所の(rommoji != '%')が成立中(%以外)は繰り返す。'%'なら抜ける
//処理1は、EEPROMに書かれている%文字が見つかるまで表示、16文字表示毎にLCD表示位置アドレスを変えて1行目から2行目に
//表示するようにしている。
//1行目lcd_position(0x00)2行目lcd_position(0x40)
//処理1
lcd_clear(); /* 画面をクリア */
do{
if(cntmoji==16)lcd_position(0x40);
if(cntmoji==32){
lcd_position(0x00);
lcd_clear();
}
rommoji=eeprom_read(cntmoji+sadd);
if(rommoji=='%')break;
if(RB6==1)printf("%c",rommoji);
if(RB6==0)printf("%c\n",rommoji);
mojisend();
++cntmoji;
}while(rommoji != '%');
cntmoji=0; /* 抜けたらcntmoji=0にする*/
}
romread2()
{
//6パターン全ての表示を行う、パターン毎の先頭に1.文字、2.文字のようにパターン番号を
//表示してから文字を表示
lcd_clear();
sadd=0;
if(sadd==0) printf("1.");
do{
if(dcnt==14){lcd_position(0x40); //dcnt 16→14
}//if(dcnt==14)
if(dcnt==30){ //dcnt 32→30
__delay_ms(2000);
dcnt=0;
lcd_position(0x02);
lcd_clear();
}
if(rommoji=='%'){
__delay_ms(2000);
lcd_clear();
cntmoji=0;
dcnt=0;
sadd=sadd+40;
if(sadd==40) printf("2.");
if(sadd==80) printf("3.");
if(sadd==120) printf("4.");
if(sadd==160) printf("5.");
if(sadd==200) printf("6.");
}
rommoji=eeprom_read(cntmoji+sadd);
__delay_ms(10);
if(RB6==1)printf("%c",rommoji);
if(RB6==0)printf("%c\n",rommoji);
++dcnt;
++cntmoji;
//eepromの最大記憶255文字になったら抜ける
if(cntmoji>=255) break;
//eepromの中で%文字を見つけたら抜ける
}while(rommoji != '#');
cntmoji=0; /* 抜けたらcntmoji=0にする*/
}//romread2()
ioport()
{
ANSEL=0;
ANSELH=0;
TRISA=0xFC; /*RA0,1ピンを出力に、RA2,3,4,5ピンを入力設定*/
TRISB=0xE0; /*PB4ピンを出力にRB5,6,7を入力に設定*/
TRISC=0xF0; /*PORTCのRC0-3ピンを出力に、RC4-7を入力ピンに設定*/
PORTA=0x00; /*PORTA全ピンをLに設定 16進*/
PORTB=0x00; /*PORTB全ピンをLに設定 16進*/
PORTC=0x00; /*PORTC全ピンをLに設定 16進*/
//PORTA=0b01010101; /*PORTAピンをLHLHLHLHに設定 2進*/
//PORTB=0b10101010; /*PORTBピンをHLHLHLHLに設定 2進*/
//PORTC=0b01010101; /*PORTCピンをLHLHLHLHに設定 2進*/
//RA2の割込み設定
INTEDG=0; /*立上りの設定(0で立下り)*/
INTE=1; /*INTエッジ割り込みを使う */
GIE=1; /*割り込みを使う */
INTF=0; /*INTEDG発生の前に0にする */
}
//RA2が割込み端子でRA2SWを押すことによりモールススピードを可変する
interrupt warikomi()
{
INTF=0;
++speed;
if(speed>=20)speed=5;
}
/*************************************************/
//rs232処理のなかのrxdata=getch();で文字受信
char getch() /*rxdata PCからの文字受信*/
{
while(!RCIF); /* 受信したら */
return(RCREG); /* データを読む */
}
/*************************************************/
//printf()で文字をLCD表示とPCに送信する
//pcに送信の場合は、下のwhile(!TXIF);TXREG=txdata;の記述がいる
void putch(unsigned char txdata) /* PUTCH */
{
if(RB6==1){
RS=1;
ENABLE=0;
__delay_us(80);
PORT=(txdata>>4)&0x0F;
// 書込みはEが1→0
ENABLE=1;
ENABLE=0;
PORT=txdata&0x0F;
// 書込みはEが1→0
ENABLE=1;
ENABLE=0;
}
if(RB6==0){
while(!TXIF); /* 送信バッファが空いたら */
TXREG=txdata; /* 1バイトだけ書く */
}
}
******************************************** main ここまで******************************************
*********************** mojisend.c ここから***********************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// 1つのメインプログラムで構成していたが、mojisendを別のmijisend.cとした。から文字が入ったrommoji変数をmojisend()で渡せばいい //
// 従って、rom_cw3a.cとmijisend.cの2つで構成している、 mojisend.cを別のプログラムから利用させたいため分離した。 //
// ポイントは、メインプログラムから文字が入ったrommoji変数をmojisend()に渡せばいい //
// JA3RUA //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//発振周波数変更の場合は#define _XTAL_FREQも変更
#include <htc.h>
//(5)
//#define _XTAL_FREQ 4000000 /*4Mhz */
#define _XTAL_FREQ 8000000 /*8Mhz */
//#define _XTAL_FREQ 10000000 /*10Mhz */
//#define _XTAL_FREQ 20000000 /*20Mhz */
#define JIKAN 500 /* 500ミリ秒 */
#define tan 5
#define tyo 15
#define cwport RB4 /*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()
{
cwport=1;
for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo);
cwport=0;
}
ra2_0tyo()
{
for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo);
}
ra2_1tan()
{
cwport=1;
for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan);
cwport=0;
}
ra2_0tan()
{
for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan);
}
*********************** mojisend.c ここまで ***********************
*********************** 689init_a.c ここから ***********************
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// イニシャライズ手順 インターフェースデータ長4bit(データシートから)
//
// 電源ONして15ms以上待つ
// RS R/W DB7 DB6 DB5 DB4
//(1) 0 0 0 0 1 1
// 4.1ms以上待つ
//(2) 0 0 0 0 1 1
// 100μs以上待つ
//(3) 0 0 0 0 1 1
//(4) 0 0 0 0 1 0
//(5) 0 0 0 0 1 0 ファンクションセット 0 0 1 DL DL=0で4bit
//(6) 0 0 1 0 0 0 N F * * N=1で2行 F=0で5×8dot
//(7) 0 0 0 0 0 0 表示オン/オフ
//(8) 0 0 1 1 0 0 1 D C B D=1で表示オン C=0でカーソル表示しない B=0でブリンクしない
//(9) 0 0 0 0 0 0 表示クリア
//(10) 0 0 0 0 0 1
//(11) 0 0 0 0 0 0 エントリーモード
//(12) 0 0 0 1 1 0 0 1 I/D S I/D=1でアドレスを+1カーソルが右に動く
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<htc.h>
//(6)
//#define _XTAL_FREQ 4000000 /*4Mhz */
#define _XTAL_FREQ 8000000 /*8Mhz */
//#define _XTAL_FREQ 10000000 /*10Mhz */
//#define _XTAL_FREQ 20000000 /*20Mhz */
lcd_init();
lcd_position(unsigned char);
lcd_clear();
void putch(unsigned char);
//lcd_cgram();
//他のI/Oピン使用する時に変更
#define PORT PORTC
#define ENABLE RA0
#define RS RA1
//int cgdata=0x04;
lcd_init() /* LCDモジュール初期化 PIC:PIC16F688 確認LCD:SD1602 HUOB-XA */
{ /* RC5:RS RC4:ENABLE*/
RS=0; /*RS=0 instruction input RS=1 data input*/
ENABLE=0;
__delay_ms(15);
PORT=0x03; /* 4bitモード */
ENABLE=1; /*(1)__delay_ms(30)*/
ENABLE=0;
__delay_ms(5);
ENABLE=1; /*(2)__delay_ms(10)*/
ENABLE=0;
__delay_ms(5);
ENABLE=1; /*(3)__delay_us(400)*/
ENABLE=0;
__delay_ms(5);
PORT=0x02;
ENABLE=1; /*(4)__delay_us(400)*/
ENABLE=0;
/* function set */
__delay_ms(5);
PORT=0x02;
ENABLE=1; /*(5)__delay_us(80);*/
ENABLE=0;
PORT=0x08; /* 0x08:2行 0x00:1行 */
ENABLE=1; /*(6)*/
ENABLE=0;
/* disp control*/
__delay_ms(5);
PORT=0x00;
ENABLE=1; /*(7)__delay_us(80);*/
ENABLE=0;
PORT=0x0C; /* 1,D:1,C:0,B:0 D(disp:on) C(cursor:off) B(blink:off)*/
ENABLE=1; /*(8)*/
ENABLE=0;
/*clear disp*/
__delay_ms(5);
PORT=0x00;
ENABLE=1; /*(9)__delay_us(80);*/
ENABLE=0;
PORT=0x01;
ENABLE=1; /*(10)*/
ENABLE=0;
/*entry mode*/
__delay_ms(5);
PORT=0x00;
ENABLE=1; /*(11)__delay_us(80);*/
ENABLE=0;
PORT=0x06; /* 0,1,I/D:1,S:0 I/D(increment:+1) S(shift:NO increment*/
ENABLE=1; /*(12)*/
ENABLE=0;
}
//***************************************************************
//***************************************************************
lcd_position(unsigned char pos) /* 文字の位置を指定 */
{ /* dd ram address set */
RS=0;
// lcd_write_RS0(0x80+pos);
__delay_us(80);
PORT=(((0x80+pos)>>4)&0x0F);
ENABLE=1;
ENABLE=0;
PORT=((0x80+pos)&0x0F);
ENABLE=1;
ENABLE=0;
}
//***************************************************************
//***************************************************************
lcd_clear() /* 画面をクリア */
{ /* clear display */
RS=0;
__delay_us(500);
PORT=0x00;
ENABLE=1;
ENABLE=0;
PORT=0x01;
ENABLE=1;
ENABLE=0;
__delay_ms(5);
}
//***************************************************************
******************************************** init ここまで*********************************************