概要

LCD液晶にユーザー定義文字を表示します。
LCD液晶はSC1602を対象としているが、液晶モジュールの電源の接続をVDD,GNDを入れ替えればSC2004でも対応可能。ただしldc2c.cを修正しない場合16文字*2行でしか表示されないので注意。LCD表示用ライブラリは、SC1602,SC2004いずれでも動作する。
約0.2秒の時間はソフトウェアによるディレイ(クロック周波数に依存)で対応。
クロックはUSB-IOで接続済みの12MHzのセラミック振動子を使用しPLLで4倍にしている。書込みはPICKit3を前提とする。
液晶表示例

 CGRAM ■◆◆
 ■■■■
■◆がユーザー定義キャラクタを使用しています。
1行目の■は液晶表示では網掛けとなります
2行目の■は縦の長さが時間とともに変化します。
回路は次のとおりである。
回路図(PNG) 回路図(PDF) 回路図(DXF)

プログラムの説明

ソースファイル

以下のファイルで構成されている
lcd2c.c ・・・ メインプログラム
lcd.c   ・・・ LCD表示用ライブラリ Version 1.00
lcd.h   ・・・ LCD表示用インクルードファイル Version 1.00

ソースファイルのダウンロード lcd2c.zip

lcd.c

主にSC1602向けのLCD液晶表示用のライブラリである。
液晶モジュールと接続するポートはマクロで変更可能である。
busyフラグはチェックせずソフトウェアディレイで対応しているためクロック周波数が変更された場合はディレイの調整が必要
ユーザー定義キャラクタに対応
詳細は以下のリンクを参照されたい
lcd.c

lcd2c.c

メインプログラムである。
IOポートの入出力の設定をし、LCDの初期化サブルーチンコール、0.2秒おきのカウント処理を行い2行目のユーザー定義文字の高さを変更しています。LCDにユーザー定義コードのキャラクターが表示されている場合は、フォントの変更のみ実施すれば文字が変更されます。

/*
 * LCDモジュールのユーザー定義キャラクタの使用例  Version 1.00
 * File:        lcd2c.c
 * Target:      PIC18F14K50 48Mhz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/10/9 21:00
 *
 * 表示例
 *
 *   1行目    CGRAM ■◆◆
 *   2行目    ■■■■
 *
 *   ■◆がユーザー定義キャラクタを使用しています。
 *  1行目の■は液晶表示では網掛けとなります
 *   2行目の■は縦の長さが時間とともに変化します。
*/

#include <stdio.h>
#include <stdlib.h>
#include <p18f14k50.h>
#include <plib\delays.h>
#include "lcd.h"

#pragma config  FOSC = HS,CPUDIV = NOCLKDIV,PLLEN=ON,WDTEN=OFF,LVP=OFF

unsigned char lcd_font1[]={  // 50% ハッチ
    0b00010100,
    0b00001010,
    0b00010100,
    0b00001010,
    0b00010100,
    0b00001010,
    0b00010100,
    0b00000000 };

unsigned char lcd_font2[]={ // □
    0b00011111,
    0b00010001,
    0b00010001,
    0b00010001,
    0b00010001,
    0b00010001,
    0b00011111,
    0b00000000 };

unsigned char lcd_font3[]={ // ◆
    0b00000000,
    0b00000100,
    0b00001110,
    0b00011111,
    0b00001110,
    0b00000100,
    0b00000000,
    0b00000000 };

unsigned char lcd_font4[8]; // プログラムで書き換える

void main(void) {
    signed char data;

    ANSEL=0;
    ANSELH=0;
    SLRCON=0;
    TRISA=0;
    TRISB=0b11110000;
    TRISC=0;
    PORTC=0;

    lcd_init();
            //0123456789abcdef  0123456789abcdef
    lcd_disp("HelloPIC18F14K50\nXC8 LCD SAMPLE ");

    lcd_disp(rs232c_buf);

        Delay10KTCYx(240);
        Delay10KTCYx(240);
        Delay10KTCYx(240);
        Delay10KTCYx(240);

        lcd_clear();

    lcd_cgram(0x00,lcd_font3);
    lcd_cgram(0x08,lcd_font2);
    lcd_cgram(0x10,lcd_font1);
    lcd_cgram(0x18,lcd_font3);
        
    lcd_ddramxy(0,0);
    lcd_puts("CGRAM \x2\x3");
    lcd_putc(0);

    lcd_ddramxy(0,1);
    lcd_puts("\x1\x1\x1\x1");
    lcd_en(LCD_DISPON | LCD_BLINKON);

      for(;;){
        for(int n=0;n<7;n++){

            for(int y=0;y<8;y++)
                lcd_font4[y]=0;
            for(int y=0;y<n;y++){
                lcd_font4[6-y]=0b00011111;
            }
            lcd_cgram(0x08,lcd_font4);
            
            Delay10KTCYx(240);

        }
      }
}