******************************************** 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 500 /* 500ミリ秒 */ #define PORT PORTC #define ENABLE RA0 #define RS RA1 #define JIKAN1 1100 #define JIKAN2 500 lcd_position(unsigned char); void putch(unsigned char moji); lcd_init(); ioport(); int pos=0; main() { //OSCCON=0x00;//INTCONにするときに必要で0は31Khz ioport(); lcd_init(); /* LCDを初期化する */ while(1){ //表示位置 pos=0; lcd_position(pos); //通常表示 printf("CQ CQ DE JA3RUA "); //表示位置 pos=40; lcd_position(pos); printf("PSE K "); __delay_ms(JIKAN1); lcd_clear(); __delay_ms(JIKAN1); } } 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(80); PORT=nandemo; //0x30でENABLE=1,RS=1になる 書込みはEが1→0 ENABLE=1; ENABLE=0; } //*************************************************************** ******************************************** 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(30);// __delay_ms(30) PORT=0x30; /* 8bitモード */ ENABLE=1; /*(1)*/ ENABLE=0; __delay_ms(10);// __delay_ms(10) ENABLE=1; /*(2)*/ ENABLE=0; __delay_us(400);// __delay_us(400) ENABLE=1; /*(3)*/ ENABLE=0; /* function set */ __delay_us(400);// __delay_us(80) PORT=0x38; ENABLE=1; /*(4)*/ ENABLE=0; /* disp on/off control*/ __delay_us(80);// __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_us(80);// __delay_us(80) PORT=0x01; ENABLE=1; /*(6)*/ ENABLE=0; /*entry mode*/ __delay_us(80);// __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(80); PORT=(0x80+pos); ENABLE=1; ENABLE=0; } //*************************************************************** //*************************************************************** lcd_clear() /* 画面をクリア */ { /* clear display */ RS=0; __delay_us(80); PORT=0x01; ENABLE=1; ENABLE=0; __delay_ms(4); } //*************************************************************** ******************************************** init ここまで*********************************************