******************************************** main ここから********************************************* #include <pic.h> #include <htc.h> #include <stdio.h> #include <string.h> //__CONFIG(PWRTEN & WDTDIS & MCLREN & INTIO);/*内部発振*/ __CONFIG(PWRTEN & WDTDIS & MCLREN & HS);/*水晶発振*/ #define _XTAL_FREQ 20000000 //#define _XTAL_FREQ 4000000 /* 4MkHz */ //#define _XTAL_FREQ 31000 /* 31kHz */ #define JIKAN 100 /* 500ミリ秒 */ #define PORT PORTC #define ENABLE RA0 #define RS RA1 #define JIKAN1 1000 #define JIKAN2 500 lcd_position(unsigned char); void putch(unsigned char moji); //WRITE No.1(0-143) __EEPROM_DATA('C','Q',' ','C','Q',' ','D','E'); /* 0-7 00-07 CQ CQ*/ __EEPROM_DATA(' ','J','A','3','R','U','A',' '); /* 8-15 08-0F */ __EEPROM_DATA('Q','T','H',' ','M','O','R','I'); /* 16-23 10-17 */ __EEPROM_DATA('G','U','C','H','I',' ','K','.'); /* 24-31 18-1F */ __EEPROM_DATA('W','X','Y','Z','0','1','2','3'); /* 32-39 20-27 */ __EEPROM_DATA('4','5','6','7','8','9','A','/'); /* 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 */ lcd_init(); lcd_cgram(); ioport(); cgdisp(); int pos=0; int cgdata; int rommoji; int romcnt=0; int rom_sadd=0; main() { //OSCCON=0x00;//INTCONにするときに必要で0x00は31Khz ioport(); lcd_init(); /* LCDを初期化する */ while(1){ //// キャラクタパターン表示 // cgdisp(); // ++romcnt; // if(romcnt==27){ // romcnt=0; // __delay_ms(JIKAN2); // lcd_clear(); // __delay_ms(JIKAN2); // } // EEPROM内容の表示 rommoji=eeprom_read(romcnt); lcd_position(pos+rom_sadd); printf("%c",rommoji);//文字列ではないのでprintf(rommoji);では表示しない。左のように、1文字表示の記述をすること ++pos; ++romcnt; __delay_ms(JIKAN); if(romcnt==16){ rom_sadd=64; pos=0; } if(romcnt==32){ pos=0; romcnt=0; rom_sadd=0; __delay_ms(JIKAN1); lcd_clear(); __delay_ms(JIKAN2); } }//while end }//main end ioport() { ANSEL=0; ANSELH=0; TRISA=0x38; /*RA0-2ピンを出力に、RA3,4,5ピンを入力設定*/ TRISB=0; /*PORTB全ピンを出力に設定*/ TRISC=0; /*PORTC全ピンを出力に設定*/ //PORTA=0xFF; /*PORTA全ピンをHに設定 16進*/ //PORTB=0xFF; /*PORTB全ピンをHに設定 16進*/ PORTC=0x00; /*PORTC全ピンをLに設定 16進*/ PORTA=0x00; /*PORTA全ピンをLに設定 16進*/ //PORTA=0b01010101; /*PORTAピンをLHLHLHLHに設定 2進*/ //PORTB=0b10101010; /*PORTBピンをHLHLHLHLに設定 2進*/ //PORTC=0b01010101; /*PORTCピンをLHLHLHLHに設定 2進*/ } //*************************************************************** void putch(unsigned char nandemo) /* PUTCH */ { /* RS=1 data input */ RS=1; __delay_us(500);//80 PORT=nandemo; //0x30でENABLE=1,RS=1になる 書込みはEが1→0 ENABLE=1; ENABLE=0; } //*************************************************************** lcd_cgram() /* lcd_cgram キャラクタ表示*/ { /* cgram/ddram data write */ RS=1; __delay_us(500);//80 PORT=cgdata; ENABLE=1; ENABLE=0; __delay_ms(4); } //*************************************************************** cgdisp() { pos=0x00; lcd_position(pos); cgdata=0xC0; lcd_cgram(); /* cgdata表示 */ cgdata=0xC0; lcd_cgram(); /* cgdata表示 */ cgdata=0xDE; lcd_cgram(); /* cgdata表示 */ cgdata=0xB2; lcd_cgram(); /* cgdata表示 */ cgdata=0xCF; lcd_cgram(); /* cgdata表示 */ cgdata=0x43; lcd_cgram(); /* cgdata表示 */ cgdata=0x47; lcd_cgram(); /* cgdata表示 */ cgdata=0xB0; lcd_cgram(); /* cgdata表示 */ cgdata=0x52; lcd_cgram(); /* cgdata表示 */ cgdata=0x41; lcd_cgram(); /* cgdata表示 */ cgdata=0x4D; lcd_cgram(); /* cgdata表示 */ cgdata=0xC3; lcd_cgram(); /* cgdata表示 */ cgdata=0xDE; lcd_cgram(); /* cgdata表示 */ cgdata=0xB0; lcd_cgram(); /* cgdata表示 */ cgdata=0xC0; lcd_cgram(); /* cgdata表示 */ cgdata=0xA6; lcd_cgram(); /* cgdata表示 */ pos=0x40; lcd_position(pos); cgdata=0xCB; lcd_cgram(); /* cgdata表示 */ cgdata=0xAE; lcd_cgram(); /* cgdata表示 */ cgdata=0xB3; lcd_cgram(); /* cgdata表示 */ cgdata=0xBC; lcd_cgram(); /* cgdata表示 */ cgdata=0xDE; lcd_cgram(); /* cgdata表示 */ cgdata=0xBC; lcd_cgram(); /* cgdata表示 */ cgdata=0xC3; lcd_cgram(); /* cgdata表示 */ cgdata=0xB2; lcd_cgram(); /* cgdata表示 */ cgdata=0xCF; lcd_cgram(); /* cgdata表示 */ cgdata=0xBD; lcd_cgram(); /* cgdata表示 */ cgdata=0xA1; lcd_cgram(); /* cgdata表示 */ } ******************************************** main ここまで********************************************* ******************************************** init ここから********************************************* ///////////////////////////////////////////////////////////////////////////////////////////////////////// // イニシャライズ手順 インターフェースデータ長8bit(データシートから) // // 電源ONして15ms以上待つ // RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 //(1) 0 0 0 0 1 1 0 0 0 0 // 4.1ms以上待つ //(2) 0 0 0 0 1 1 0 0 0 0 // 100μs以上待つ //(3) 0 0 0 0 1 1 0 0 0 0 //(4) 0 0 0 0 1 1 1 0 0 0 function set (DB4)DL=1で8bit (DB3)N=1で2行 (DB2)F=0で5×8dot //(5) 0 0 0 0 0 0 1 1 0 0 disp on/off control (DB2)D=1で表示オン (DB1)C=0でカーソル表示しない (DB0)B=0でブリンクしない //(6) 0 0 0 0 0 0 0 0 0 1 clear disp //(7) 0 0 0 0 0 0 0 1 1 0 entry mode (DB1)I/D=1でアドレスを+1カーソルが右に動く(DB0)S=0表示シフトさせない // // lcd_init()での__delay_msは、色々値を変化させて見た結果現在の値がベストである。 // 初期の値(各値横のコメントの数字)では発振数を上げたりすると電源オン時の表示が不安定なった(オン後は安定) // INTIO、水晶(4MHz,20MHz)でも電源オン後から表示は安定している。 ///////////////////////////////////////////////////////////////////////////////////////////////////////// #include <htc.h> #define _XTAL_FREQ 20000000 //#define _XTAL_FREQ 4000000 //#define _XTAL_FREQ 31000 /* 31kHz */ 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:PIC16F689 確認LCD:SD1602 HUOB-XA */ { /* RA1:RS RA0:ENABLE */ RS=0; /*RS=0 instruction input RS=1 data input */ ENABLE=0; __delay_ms(15);// __delay_ms(30) PORT=0x30; /* 8bitモード */ ENABLE=1; /*(1)*/ ENABLE=0; __delay_ms(5);// __delay_ms(10) ENABLE=1; /*(2)*/ ENABLE=0; __delay_ms(5);// __delay_us(400) ENABLE=1; /*(3)*/ ENABLE=0; /* function set */ __delay_ms(5);// __delay_us(80) PORT=0x38; ENABLE=1; /*(4)*/ ENABLE=0; /* disp on/off control*/ __delay_ms(5);// __delay_us(80) PORT=0x0C; /* 1,D:1,C:0,B:0 D(disp:on) C(cursor:off) B(blink:off)*/ ENABLE=1; /*(5)*/ ENABLE=0; /*clear disp*/ __delay_ms(5);// __delay_us(80) PORT=0x01; ENABLE=1; /*(6)*/ ENABLE=0; /*entry mode*/ __delay_ms(5);// __delay_us(80) PORT=0x06; /* 0,1,I/D:1,S:0 I/D(increment:+1) S(shift:NO increment*/ ENABLE=1; /*(7)*/ ENABLE=0; } //*************************************************************** //*************************************************************** lcd_position(unsigned char pos) /* 文字の位置を指定 */ { /* dd ram address set */ RS=0; // lcd_write_RS0(0x80+pos); __delay_us(500);//80 PORT=(0x80+pos); ENABLE=1; ENABLE=0; } //*************************************************************** //*************************************************************** lcd_clear() /* 画面をクリア */ { /* clear display */ RS=0; __delay_us(500);//80 PORT=0x01; ENABLE=1; ENABLE=0; __delay_ms(4); } //*************************************************************** ******************************************** init ここまで*********************************************