目次

LCD制御ライブラリ(mikroCコンパチブル)

概要

mikroCには、標準でLCD制御ライブラリが含まれているので、LCDの制御命令、信号のタイミング、制御手順などを意識することなく、容易にLCDを利用することが出来ます。

しかし、今回はLCD制御の勉強も兼ねて、「LCD制御ライブラリ」を自作してみました。
ライブラリの仕様は、mikroCコンパチブルとしました。従って、関数名さえ変更すれば、どちらのライブラリでも同じように動作させることが出来ます。

mikroC版LCD制御ライブラリ 自作LCD制御ライブラリ
Lcd_Init Lcd2_Init
Lcd_Out Lcd2_Out
Lcd_Out_Cp Lcd2_Out_Cp
Lcd_Chr Lcd2_Chr
Lcd_Chr_Cp Lcd2_Chr_Cp
Lcd_Cmd Lcd2_Cmd

動作原理

PICにLCDを接続する方法には、次の4種類があります。

今回は、接続線の最も少ない(4ビットモード+ビジーフラグ(BF)未使用)を採用しました。

<LCD制御ライブラリで提供する関数>

※mikroCコンパチブルにしましたので、詳細については、其方(HELP)を参照してください。
※LCD制御ライブラリの動作確認には、PIC16F88を使用しましたが、他のPICでも同様に動作します。

<動作確認用のプログラムの処理>

<LCDの接続方法>

<LCDの制御命令>

<LCDのブロックダイアグラム>

<LCDの書き込みタイミングチャート>

<LCDの読み込みタイミングチャート>※今回は使用しません。

<LCDのタイミング時間>

回路図

ソースコード

◎動作確認用のプログラム

lcd_display.c
//**********************************************************************
/*
  <LCD制御ライブラリ(mikroCコンパチブル)> 
*/
//**********************************************************************
//■■■関数宣言■■■
extern  void    main();
extern  void    opening_demonstration(); 
//**********************************************************************
//■■■インクルード■■■
#include "lcd_lib_4bit.h"
//**********************************************************************
//■■■マクロ定義■■■
sbit LCD_RS at RA6_bit;
sbit LCD_EN at RA7_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISA6_bit;
sbit LCD_EN_Direction at TRISA7_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
//**********************************************************************
//■■■メイン関数■■■ 
void    main()
{
        char    buf[16];
        double  ad;
        //
        OSCCON = 0b01110000;
        ANSEL  = 0b00001111;
        TRISA  = 0b00101111;
        TRISB  = 0b00000000;
        //
        Lcd2_Init();
        Lcd2_Cmd(_LCD_CLEAR);
        Lcd2_Cmd(_LCD_CURSOR_OFF);
        //
        opening_demonstration();
        //
        Lcd2_Out(1, 6, "mV");
        Lcd2_Out(1, 14, "mV");
        Lcd2_Out(2, 6, "mV");
        Lcd2_Out(2, 14, "mV");
        while (1) {
                ad = Adc_Read(0);
                ad *= 4.8828125;
                WordToStr(ad, buf);
                Lcd2_Out(1, 1, buf);
                //
                ad = Adc_Read(1);
                ad *= 4.8828125;
                WordToStr(ad, buf);
                Lcd2_Out(1, 9, buf);
                //
                ad = Adc_Read(2);
                ad *= 4.8828125;
                WordToStr(ad, buf);
                Lcd2_Out(2, 1, buf);
                //
                ad = Adc_Read(3);
                ad *= 4.8828125;
                WordToStr(ad, buf);
                Lcd2_Out(2, 9, buf);
                //
                Delay_ms(500);
        }
}
//**********************************************************************
//■■■オープニングデモ関数■■■ 
void    opening_demonstration()
{
        short   cnt;
        //
        Lcd2_Chr(1, 1, 'j');
        Lcd2_Chr(1, 2, 'f');
        Lcd2_Chr(1, 3, '3');
        Lcd2_Chr(1, 4, 's');
        Lcd2_Chr(1, 5, 'f');
        Lcd2_Chr(1, 6, 'b');
        Delay_ms(1000);
        //
        Lcd2_Chr_Cp(' ');
        Lcd2_Chr_Cp('J');
        Lcd2_Chr_Cp('F');
        Lcd2_Chr_Cp('3');
        Lcd2_Chr_Cp('S');
        Lcd2_Chr_Cp('F');
        Lcd2_Chr_Cp('B');
        Delay_ms(1000);
        //
        Lcd2_Out(2, 1, "JF3SFB");
        Delay_ms(1000);
        //
        Lcd2_Out_Cp(" jf3sfb");
        Delay_ms(1000);
        //
        Lcd2_Cmd(_LCD_CLEAR);
        for (cnt = 0; cnt < 16; cnt++) {
                Lcd2_Chr(1, cnt + 1, 0xFF);
                Delay_ms(100); 
        }
        for (cnt = 0; cnt < 16; cnt++) {
                Lcd2_Chr(2, cnt + 1, 0xFF);
                Delay_ms(100); 
        }
        Delay_ms(1000);
        //
        for (cnt = 0; cnt < 10; cnt++) {
                Lcd2_Cmd(_LCD_TURN_OFF);
                Delay_ms(100);
                Lcd2_Cmd(_LCD_TURN_ON);
                Delay_ms(100);
        }
        //
        Lcd2_Cmd(_LCD_RETURN_HOME);
        for (cnt = 0; cnt < 16; cnt++) {
                Lcd2_Chr(1, cnt + 1, ' ');
                Delay_ms(100); 
        }
        for (cnt = 0; cnt < 16; cnt++) {
                Lcd2_Chr(2, cnt + 1, ' ');
                Delay_ms(100); 
        }
        Delay_ms(1000);
}
//**********************************************************************

◎LCD制御ライブラリ

lcd_lib_4bit.c
//**********************************************************************
/*
  <LCD制御ライブラリ(mikroCコンパチブル)> 
*/
//**********************************************************************
#include "lcd_lib_4bit.h"
//**********************************************************************
//■■■LCD文字出力(カレントカーソル位置)関数■■■ 
void    Lcd2_Chr_Cp(char out_char)
{
        LCD_D7 = out_char.B7;
        LCD_D6 = out_char.B6;
        LCD_D5 = out_char.B5;
        LCD_D4 = out_char.B4;
        LCD_RS = 1;
        LCD_EN = 1;
        asm        nop;
        LCD_EN = 0;
        //
        LCD_D7 = out_char.B3;
        LCD_D6 = out_char.B2;
        LCD_D5 = out_char.B1;
        LCD_D4 = out_char.B0;
        LCD_RS = 1;
        LCD_EN = 1;
        asm        nop;
        LCD_EN = 0;
        //
        Delay_us(100);
}
//**********************************************************************
//■■■LCD文字出力(行列指定)関数■■■ 
void    Lcd2_Chr(char row, char column, char out_char)
{
        Lcd2_Cmd_8bit(0x80 + (column - 1) + ((row - 1) * 0x40));
        Lcd2_Chr_Cp(out_char);
}
//**********************************************************************
//■■■LCD文字列出力(カレントカーソル位置)関数■■■ 
void    Lcd2_Out_Cp(char *text)
{
        while (*text != 0x00) {
                Lcd2_Chr_Cp(*text);
                text++;
        }
}
//**********************************************************************
//■■■LCD文字列出力(行列指定)関数■■■ 
void    Lcd2_Out(char row, char column, char *text)
{
        Lcd2_Cmd_8bit(0x80 + (column - 1) + ((row - 1) * 0x40));
        Lcd2_Out_Cp(text);
}
//**********************************************************************
//■■■LCDコマンド出力関数■■■ 
void    Lcd2_Cmd(char cmd)
{
        Lcd2_Cmd_8bit(cmd);
        Delay_ms(10);
}
//**********************************************************************
//■■■LCD初期化関数■■■ 
void    Lcd2_Init()
{
        LCD_RS_Direction = 0;
        LCD_EN_Direction = 0;
        LCD_D7_Direction = 0;
        LCD_D6_Direction = 0;
        LCD_D5_Direction = 0;
        LCD_D4_Direction = 0;
        LCD_RS = 0;
        LCD_EN = 0;
        Delay_ms(20);
        Lcd2_Cmd_4bit(0b00110000);   //ファンクションセット(8bitモード) 
        Delay_ms(10);
        Lcd2_Cmd_4bit(0b00110000);   //ファンクションセット(8bitモード)
        Delay_ms(10);
        Lcd2_Cmd_4bit(0b00110000);   //ファンクションセット(8bitモード)
        Delay_ms(10);
        Lcd2_Cmd_4bit(0b00100000);   //ファンクションセット(4bitモード)
        Delay_ms(10);
        Lcd2_Cmd_8bit(0b00101000);   //ファンクションセット(4bitモード,1/16デューティ,5×7ドット)
        Delay_ms(10);
        Lcd2_Cmd_8bit(0b00001000);   //表示オフ 
        Delay_ms(10);
        Lcd2_Cmd_8bit(0b00000001);   //表示クリア 
        Delay_ms(10);
        Lcd2_Cmd_8bit(0b00000110);   //エントリーモードセット
        Delay_ms(10);
}
//**********************************************************************
//■■■LCD初期化用コマンド出力(4bit)関数■■■ 
void    Lcd2_Cmd_4bit(char cmd)
{
        LCD_D7 = cmd.B7;
        LCD_D6 = cmd.B6;
        LCD_D5 = cmd.B5;
        LCD_D4 = cmd.B4;
        LCD_RS = 0;
        LCD_EN = 1;
        asm        nop;
        LCD_EN = 0;
        //
        Delay_us(100);
}
//**********************************************************************
//■■■LCD初期化用コマンド出力(8bit)関数■■■ 
void    Lcd2_Cmd_8bit(char cmd)
{
        LCD_D7 = cmd.B7;
        LCD_D6 = cmd.B6;
        LCD_D5 = cmd.B5;
        LCD_D4 = cmd.B4;
        LCD_RS = 0;
        LCD_EN = 1;
        asm        nop;
        LCD_EN = 0;
        //
        LCD_D7 = cmd.B3;
        LCD_D6 = cmd.B2;
        LCD_D5 = cmd.B1;
        LCD_D4 = cmd.B0;
        LCD_RS = 0;
        LCD_EN = 1;
        asm        nop;
        LCD_EN = 0;
        //
        Delay_us(100);
}
//**********************************************************************

動作確認

オープニングデモの様子です。

4チャネル分のアナログデータを、左上:CH1、右上:CH2、左下:CH3、右下:CH4の順番に表示します。

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details