******************************************** 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);
lcd_init();
ioport();
int pos=0;
main()
{
//OSCCON=0x00;//INTCONにするときに必要で0x00は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);
}//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;
}
//***************************************************************
******************************************** 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)15
PORT=0x30; /* 8bitモード */
ENABLE=1; /*(1)*/
ENABLE=0;
__delay_ms(5);// __delay_ms(10)5
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 ここまで*********************************************