******************************************** 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 ここまで*********************************************