プロメモグラム

誰が見てもわかるような文章を目指す

LCDのSD1602HULBをpic18F45K20で制御

参考文献

普通最後に書くところだけどほとんどここを参考にしたので、最初に書く。 PICで遊ぶ電子工作 - 液晶ディスプレイを使う

ハードウェア部

すでに資料があるのに自分で新たにつくるのは正直面倒。

ソフトウェア部

仕組みはともかく、作ったソースコードのみを公開することにする。 上のサイトを参考にすれば似たようなものができるだろう。

#include <xc.h>

//コンフィギュレーションビット(内部オシレータを使用)
#pragma config BOREN = ON, CPD = OFF, DEBUG = OFF, WRT = OFF, FOSC = HS, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = ON


//クロック周波数の指定(10MHz)
#define _XTAL_FREQ 10000000

//各種ポート名
#define EN  PORTBbits.RB3
#define RS   PORTBbits.RB1
#define RW   PORTBbits.RB2
#define DB4  PORTBbits.RB4
#define DB5  PORTBbits.RB5
#define DB6  PORTBbits.RB6
#define DB7  PORTBbits.RB7

//プロトタイプ宣言
void write4bit(unsigned char);
void picInit();
void lcdInit();
void lcdTest();
void lcd_data(unsigned char);
void lcd_cmd(unsigned char);
void write4bit(unsigned char);

//メイン関数
void main()
{

    //PICマイコンの初期化
    __delay_ms(49);
    picInit();

     //ディスレイ初期化開始
    lcdInit();

     //テスト用(LEDを点滅させながらLCDに文字を表示)
     while(1) {
         __delay_ms(49);
         PORTAbits.RA0 = 1;
         __delay_ms(49);
         PORTAbits.RA0 = 0;
         lcdTest();
     }

}

void picInit()
{
     OSCCON = 0b00000000 ;    //クロック周波数の指定
     ANSEL  = 0b00000000 ;    //デジタルで出力
     ANSELH = 0b00001000 ;    // デジタルで出力
     TRISA  = 0b00000000 ;    //すべてのピンを出力にする
     TRISB  = 0b00000000 ;   
     TRISC  = 0b00000000 ;   
     TRISD  = 0b00000000 ; 
     PORTA  = 0b00000000 ;    //すべてのピンをLowにする
     PORTB  = 0b00000000 ;   
     PORTC  = 0b00000000 ;   
     PORTD  = 0b00000000 ;  
     PORTAbits.RA2 = 1;
}

void lcdInit()
{
    EN = 0;
    RS = 0;
    RW = 0;

   //8ビットモードへ
    __delay_ms(20);
    write4bit(0x3);
    __delay_ms(10);
    write4bit(0x3);
    __delay_ms(5);
    write4bit(0x3);
    //4ビットモードへ
    __delay_ms(5);
    write4bit(0x2);
    __delay_ms(5);
    //2桁表示
    lcd_cmd(0x28);
    __delay_ms(5);
    //LCD ON
    lcd_cmd(0x08);
    __delay_ms(5);
    //ディスプレイオン
    lcd_cmd(0x0D);
    __delay_ms(5);
    //エントリーモードセット
    lcd_cmd(0x06);
    __delay_ms(5);
}

void lcdTest()//0x44を出力し続ける。
{
   
    lcd_cmd(0x80);
    __delay_ms(20);
    lcd_cmd(0x80);
    __delay_ms(20);
    lcd_cmd(0x80);
    __delay_ms(20);
   
    lcd_data(0x44);
}

void write4bit(unsigned char data)
{
    PORTB = (data &lt;&lt; 4);
    EN = 1;
   __delay_us(20);
    EN = 0;
    __delay_us(20);
}

void lcd_data(unsigned char data)
{
    RS = 1;
    PORTB = (data &amp; 0xF0);
    EN = 1;
   __delay_us(20);
    EN = 0;
    __delay_us(20);

    PORTB = (data &amp; 0x0F) &lt;&lt; 4;
    EN = 1;
    __delay_us(20);
    EN = 0;
    __delay_us(20);
}

void lcd_cmd(unsigned char data)
{
    RS = 0;
    PORTB = (data &amp; 0xF0);
    EN = 1;
    __delay_us(20);
    EN = 0;
    __delay_us(20);

    PORTB = (data &amp; 0x0F) &lt;&lt; 4;
    EN = 1;
    __delay_us(20);
    EN = 0;
    __delay_us(20);
}