/*-----------------------------------------------------------*/
/* LCD初期化  RS=0 --> data --> RS=1 */
/*--------------------------------------------------------- */
void lcd_init(void)
{
LCD_E =0;
LCD_RS =0;

__delay_ms(100); //100ms

// 1---0011 0000
lcd_write4(0x03);
__delay_ms(10); //10ms
lcd_write4(0x03);
__delay_ms(10);
// 3---0011 0000
lcd_write4(0x03);
__delay_ms(5); //1ms
/// 4---0010 0000
lcd_write4(0x02);
// 5---0010 1000
lcd_write8(0x28); // Mode=4bit / Line=2 / Font=5x7dot
// 6---0000 1000
lcd_write8(0x08); //* 表示OFF
// 7---0000 0001
lcd_write8(0x01); //* Display Clear
// 8---0000 0110
lcd_write8(0x06); //* entry mode set
// 9---0000 1100
lcd_write8(0x0C); //* disply on

LCD_RS=1;
} で完了

3)PORTAbits.RA0 =1と RA0=1の違い 
   同じなので 全部 RA0=1 表記にした

LCDの文字列の表記は下記のようになる
/*-----------------------------------------------------------*/
/* LCD 文字列表示 */
/* 引数: char *str : 文字列の先頭ポインタ */
/*-----------------------------------------------------------*/
void lcd_put_str(char *str)
{
while(*str != 0) {
lcd_write8( *str );
str++;
}

ーーーーーーーーーーーーーーーーーーーーーーーーー
LCDのカーソルを直接指示する方法は下記である
/*-----------------------------------------------------------*/
/* LCD表示位置の設定 */
/* 引数:char tx :x座標 */
/* 引数:char ty :y座標 */
/* 戻り値:なし */
/* tx */
/* ty 0################ */
/* 1################ */
/* 2################ */
/* 3################ */
/*-----------------------------------------------------------*/
void lcd_position(char tx ,char ty)
{
switch(ty){
case 0: ty = 0x00; break;
case 1: ty = 0x40; break;
case 2: ty = 0x14; break;
case 3: ty = 0x54; break;
}
LCD_RS=0; // RS=0 set
lcd_write8(0x80 | (tx + ty)); /* Address = 0 */
LCD_RS=1; /* RS = H */
}

必要に応じて ASCU表示と数字 0〜255までの表示プログラムを使う
void LCD_dataout( unsigned short data ) // 数値データをLCDに表示する関数)

{ // 表示出来る数値は 受け取る引数unsigned short dataのデータ型範囲
unsigned char temp;
  // unsigned char :( 0-255), unsigned short:(0-65535), unsigned long :(0-4294967295)
char strtemp[ 5 ];
   // 文字コードの格納変数を定義
int i, k;
   // 受け取る引数 " unsigned char "data のデータ型を変更すると strtemp[ 配列数 ] 配列数 を変えましょう
i=0;
  // unsigned charのとき:strtemp[ 3 ] (3桁), unsigned short:strtemp[ 5 ](5桁)
    , unsigned long:strtemp[ 10 ](10桁)
do {
   temp = data % 10; // 下位の桁から数字を抽出
   strtemp[i++] = temp + '0'; // 数字を文字コードに変換
  } while (( data /= 10 ) != 0); // 数値の桁数までループ
   i--; //
for( k=i; k>=0; k-- ) { // 上位の桁から順次
             lcd_write8( strtemp[k]); // 数値文字を表示
            } //
  }

/* --------- ASC 表示-------------------------------*/
void LCD_ASC(unsigned short data ) // ASC 表示
{
unsigned char temp;
unsigned char temp1;
temp1 = data & 0x0F;
temp = data >> 4;
if(temp > 9){temp=temp-9,(temp |= 0x40);
}else{(temp |= 0x30);}

if(temp1 > 9){temp1=temp1-9,(temp1 |= 0x40);
}else{(temp1 |= 0x30);}

lcd_write8(temp);
lcd_write8(temp1);
}

LCDを動かそう

メインプログラム
int main(void)

{
TRISA = 0b11111100 ; // 1で入力 0で出力 RA2-RA3入力(RA5は入力専用)
TRISB = 0b00000000 ; // RB3のみ入力、残り全て出力

//------------ LCD INIT -----------------
lcd_init();
//---------------------------------------

lcd_position(0,0);
lcd_put_str(" PIC TEST 2019-9-10 ");
lcd_position(5,2);
LCD_ASC(0xEE);LCD_ASC(0x0A);
lcd_position(10,3);
lcd_put_str("by majima");

while(1) {
LED_G =1;
__delay_ms(500);
LED_G =0;
__delay_ms(500);
if (KEY_1 == 0 ) { LED_R = 0 ;} // 1番ピンにHIGHを出力する(LED 点灯)

if(KEY_2 == 0){LED_R = 1 ;}

}
return 0;
}
 

下記はC言語の設定である、

#include <xc.h>

//#include <delay.h>
#define _XTAL_FREQ 10000000 //PICの外付けクロック 10Mセラロック

__CONFIG(FOSC_HS & DEBUGDIS & LVPDIS & UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;

#pragma config FOSC = HS //セラロック 4M以上
#pragma config WDTE = OFF //ウォッチドッグ
#pragma config PWRTE = ON //電源ON後64ms後にプログラム開始
#pragma config CP = OFF


#define LED_R RA0
#define LED_G RA1
#define KEY_1 RA2
#define KEY_2 RA3
#define LCD_E RB4
#define LCD_RS RB5
#define LCD_D4 RB0
#define LCD_D5 RB1
#define LCD_D6 RB2
#define LCD_D7 RB3

PIC16G48AでLCD2004を点灯させる事からはじめよう

SC2004 は 20行×4行のバックライト付きLCDである
信号ラインは RS、E と4ビットのPB4〜PB7 読み出しはしないので R/W信号は GNDに落とし
Write専用にしておく、バックライトは3.3Ωをアノードラインに付けて5V供給すればよい

8ビット送信 char C を1ビットづつ上位4ビットをセットする
その後下位4ビットセットする


/*-----------------------------------------------------------*/
/* LCD 8ビット送信 */
/*-----------------------------------------------------------*/
void lcd_write8(unsigned char c)
{
//上位4ビット送信
LCD_D4 = ((c >>4) & 0x01);
LCD_D5 = ((c >>5) & 0x01);
LCD_D6 = ((c >>6) & 0x01);
LCD_D7 = ((c >>7) & 0x01);
LCD_E =1;
__delay_ms(1);
LCD_E =0;
LCD_D4 = ((c ) & 0x01);
LCD_D5 = ((c >>1) & 0x01);
LCD_D6 = ((c >>2) & 0x01);
LCD_D7 = ((c >>3) & 0x01);
LCD_E =1;
__delay_ms(1);
LCD_E =0;
__delay_ms(1);

}

*-----------------------------------------------------------*/
/* LCD 4ビット送信 */
/* 引数: char bitdata : DB7-4に与えるデータ */
/*-----------------------------------------------------------*/
void lcd_write4( unsigned char c )
{

LCD_D4 = ((c ) & 0x01);
LCD_D5 = ((c >>1) & 0x01);
LCD_D6 = ((c >>2) & 0x01);
LCD_D7 = ((c >>3) & 0x01);
LCD_E =1;
__delay_ms(1);
LCD_E =0;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
RS=0にして
 初期設定 (init)する
 4ビットモードにして PB4〜PB7を使うようにする
RS=1にして終了

後は、キャラクタ文字 数字の1 =0x31 を送るときは
上位 4ビット(03H)を送り Eラインを 1--->1ms -->0
次に下位 4ビット 01Hを送り Eを H−−>Lにする
 

動作の基本
RS=0で プログラムモードになり、LCDの初期設定やカーソルを指示するとき
RS=1は キャラクタを表示する場合である
E信号は PB4〜PB7にデータをセットして、Eラインを1msON(HiGH)にすると書き込み完了である

工事中ーー