ユーザ定義文字を表示する


YouTubeを見ていたら面 白い動画を見つけました。
Arduinoを使ってLCDに外字を登録して、大文字の数字を表示しています。
同じことをRaspberryでやってみました。

WiringPiのLCD LibraryにはlcdCharDef()の外字登録用の関数が用意されています。
HD44780チップを使ったLCDには最大8文字の外字を登録することができます。
そこで、以下の8文字の外字を登録します。



これだけでは何の文字か不明ですが、この8文字を組み合わせることで、以下の表示が可能です。




結線はここで紹介しているものと同じです。
ソースは以下の通りです。
level0からlevel7のビットパターンで外字を登録しています。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

/*
 cc -o lcd lcd.c -lwiringPi -lwiringPiDev
*/

#define    SP    0x20

void lcdNumber(int fd_lcd, int num, int pos) {
    int pat[60] = { 1, 2, 0, 1, 3, 0,    //0
                   SP,SP, 0,SP,SP, 0,    //1
                    5, 4, 0, 1, 3, 3,    //2
                    5, 4, 0, 7, 3, 0,    //3
                    1, 3, 0,SP,SP, 0,    //4
                    1, 4, 6, 7, 3, 0,    //5
                    1, 4, 6, 1, 3, 0,    //6
                    1, 2, 0,SP,SP, 0,    //7
                    1, 4, 0, 1, 3, 0,    //8
                    1, 4, 0, 7, 3, 0};   //9

    if(num < 0 || num > 9) return;

    lcdPosition(fd_lcd, pos, 0);
    lcdPutchar(fd_lcd, pat[num*6]);
    lcdPosition(fd_lcd, pos+1, 0);
    lcdPutchar(fd_lcd, pat[num*6+1]);
    lcdPosition(fd_lcd, pos+2, 0);
    lcdPutchar(fd_lcd, pat[num*6+2]);
    lcdPosition(fd_lcd, pos, 1);
    lcdPutchar(fd_lcd, pat[num*6+3]);
    lcdPosition(fd_lcd, pos+1, 1);
    lcdPutchar(fd_lcd, pat[num*6+4]);
    lcdPosition(fd_lcd, pos+2, 1);
    lcdPutchar(fd_lcd, pat[num*6+5]);

}
   


int main(int argc, char **argv) {
    int fd_lcd;
    int i;
    char level0[8] = { 0b11100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11100};
    char level1[8] = { 0b00111, 0b01111, 0b01111, 0b01111, 0b01111, 0b01111, 0b01111, 0b00111};
    char level2[8] = { 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
    char level3[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
    char level4[8] = { 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
    char level5[8] = { 0b01111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00011, 0b00111};
    char level6[8] = { 0b11110, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11000, 0b11100};
    char level7[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b01111};

    if(wiringPiSetup() == -1) {
        printf("Setup Fail\n");
        exit(1);
    }
    fd_lcd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);

    lcdCharDef(fd_lcd, 0, level0);
    lcdCharDef(fd_lcd, 1, level1);
    lcdCharDef(fd_lcd, 2, level2);
    lcdCharDef(fd_lcd, 3, level3);
    lcdCharDef(fd_lcd, 4, level4);
    lcdCharDef(fd_lcd, 5, level5);
    lcdCharDef(fd_lcd, 6, level6);
    lcdCharDef(fd_lcd, 7, level7);
 
    lcdPosition(fd_lcd, 0,0);
    for (i = 0; i < 8; i++){
        lcdPosition(fd_lcd, i, 0);
        lcdPutchar(fd_lcd, i);
    }
    getchar();
    lcdNumber(fd_lcd,0,0);
    lcdNumber(fd_lcd,1,3);
    lcdNumber(fd_lcd,2,6);
    lcdNumber(fd_lcd,3,9);
    lcdNumber(fd_lcd,4,12);
    getchar();
    lcdNumber(fd_lcd,5,0);
    lcdNumber(fd_lcd,6,3);
    lcdNumber(fd_lcd,7,6);
    lcdNumber(fd_lcd,8,9);
    lcdNumber(fd_lcd,9,12);
}