PIC16F1455の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
パラレル接続LCD表示器

16F1455のDigital I/Oに、小型16文字x2行のLCD表示器を接続しました。LCDは、4ビット接続とし、PortCに接続されています。

LCD表示器のプログラム例

文字を画面に表示するだけのプログラムです。プログラムは、メインプロルーティンとLCD表示関数から構成されています。 メインルーティンは、これら表示関数を呼び出して、文字を表示させます。具体的には、以下の手順で表示します。

  1. LCD_int() で表示器を初期化し、
  2. LCD_posyx() で表示位置を指定し、
  3. LCD_dat()、LCD_str()、などの関数で文字を表示

*注意*
アプリケーションプログラムを動作させる時は、PICkit3を取り外すか、一度電源をOFFにしリセットする必要があります。

<プログラム>

//*********************************************************
//  データをLCDに表示する。
//     1)Define I/O PORT
//         PIC     pin :  LCD     pin   PIC     pin :  LCD     pin
//         PORTC(3) 7  :  LCD(DB7)14    PORTC(4) 6  :  LCD_(EN) 6
//         PORTC(2)14  :  LCD(DB6)13    GND         :  LCD_(RW) 5
//         PORTC(1)15  :  LCD(DB6)12    PORTC(5) 5  :  LCD_(RS) 4
//         PORTC(0)16  :  LCD(DB4)11    VR          :  LCD_(Vo) 3
//         +3.3v       :  LCD(Vdd) 2
//         GND         :  LCD(Vss) 1
//     2)OSC
//         4MHz (内部クロック)
//
//    Language: MPLABX XC8
//    Target: PIC16F1455
//*********************************************************
#include <xc.h>
#define _XTAL_FREQ 4000000

//************* I/O Define  **********************
#define         LCD_DB          LATC
#define         LCD_EN          LATC4
#define         LCD_RS          LATC5

//************* Config  **********************
#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

//********************************************************
void LCD_dat(char);                // 1文字表示
void LCD_cmd(char);                // コマンド出力
void LCD_clr(void);                // 全消去
void LCD_int(void);                // 初期化
void LCD_str(char *);              // 文字列表示
void LCD_ROMstr(const char *);     // ROM文字列表示
void LCD_posyx(char,char);         //カーソル位置指定、行 y、横位置 x
void LCD_hex(char);                // 16進文字変換表示

//////////// Main //////////////////////////////////
void main(void){
    char msgStart[] ="LCD Test";
    unsigned char num = 0;
    OSCCON = 0b00110100;           // 内部クロック4Mhz
    TRISC  = 0b00000000;           // LCD接続端子を出力にする
    LCD_int();                     // LCD初期化
    // --------------------------------------------
    LCD_str(msgStart);             // 1行目に表示
    LCD_dat(' ');
    LCD_dat('!');
    // --------------------------------------------
    LCD_posyx(1,0);                // 2行目に表示
    LCD_ROMstr("1234567890123456");
    while(1){
        LCD_posyx(0,14);           // 1行14文字目に表示
        LCD_hex(num++);            // 数値を表示し、+1する
        __delay_ms(1000);          // 1000msec
    }
}

//////////// LCD //////////////////////////////////
//-------- 上位4ビットをデータ出力 (Lower nibble接続)
void LCD_out(char c){
    LCD_DB = (c>>4) | (LCD_DB & 0xF0);
    LCD_EN = 1;                    // Enable Hi
    NOP();                         // NOP
    LCD_EN = 0;                    // Enable Low
}
//-------- 1文字表示
void LCD_dat(char c){
    LCD_RS = 1;                    // 表示データの送信
    LCD_out(c);                    // 上位4ビット出力
    LCD_out(c<<4);                 // 下位4ビット出力
    __delay_us(50);                // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char c){
    LCD_RS = 0;                    // コマンドデータの送信
    LCD_out(c);                    // 上位4ビット出力
    LCD_out(c<<4);                 // 下位4ビット出力
    if(c & 0xFC)                   // 上位6ビットに1がある命令
        __delay_us(50);            // 50usec
    else
        __delay_ms(2);             // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
    LCD_cmd(0x01);                 //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
    unsigned char pcode;
    switch(ypos & 0x03){
        case 0:    pcode=0x80;break;
        case 1:    pcode=0xC0;break;
        case 2:    pcode=0x94;break;
        case 3:    pcode=0xD4;break;
    }
    LCD_cmd(pcode += xpos);
}
//-------- 文字列出力
void LCD_str(char *str){
    while(*str)                   //文字列の終わり(00)まで継続
        LCD_dat(*str++);          //文字出力しポインタ+1
}
// //-------- Rom 文字列出力
 void LCD_ROMstr(const char *str){
     while(*str)                  //文字列の終わり(00)まで継続
         LCD_dat(*str++);         //文字出力しポインタ+1
 }
//-------- 16進文字変換表示
void LCD_hex(char c){
    const char hexch[] ="0123456789ABCDEF";
    LCD_dat(hexch[c >> 4]);
    LCD_dat(hexch[c & 0xF]);
}

//-------- 初期化
void LCD_int(void){
    __delay_ms(40);               //40msec
    LCD_RS = 0;                   //コマンドの送信
    LCD_out(0x30);__delay_ms(5);  // 8bit mode set//5msec
    LCD_out(0x30);__delay_ms(1);  // 8bit mode set
    LCD_out(0x30);__delay_ms(1);  // 8bit mode set
    LCD_out(0x20);__delay_ms(1);  // 4bit mode set
    LCD_cmd(0x2E);                // DL=0 (4bit mode)
    LCD_cmd(0x08);                // Display off
    LCD_cmd(0x0C);                // Display on Cursor=1 Blink=0
    LCD_cmd(0x06);                // Entry Inc/Dec=1 Shift=0
    LCD_cmd(0x01);                // Clear
}