GPIO接続のLCDへ表示する(PCF8574を使う)


またまた、新しいIOエクスパンダを入手しましたので紹介します。
今回はi2c接続のPCF8574を 使ってLCDを表示する方法を紹介します。
以下のページで使い方が紹介されています。
http://wiringpi.com/extensions/i2c-pcf8574/

回路図は以下のようになります。
PCF8574は右上が1番ピンです。
赤のラインは3.3V、オレンジのラインは5Vです。



コードは以下のとおりです。
MCP23017のときに紹介したコードから下線の部分だけ変更しています。

pcf8574Setup()の2番目の引数でi2cアドレスを指定します。
今回使用したチップは「PCF8574P」「PCF8574AP」の刻印があるチップですが、
調べてみたところ、「PCF8574P」のi2cアドレスは0x20-0x27、「PCF8574AP」のi2cアドレスは0x38-0x3fで した。

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

int main(int argc, char **argv) {
    int fd_lcd;
    int c;
    int i;

    if(pcf8574Setup(100,0x20) == -1) {
        printf("wiringPiSetup Fail\n");
        exit(1);
    }
    fd_lcd = lcdInit(2,16,4,104,105,100,101,102,103,0,0,0,0);

    lcdClear(fd_lcd);
    lcdPuts(fd_lcd,"ABCDEFGHIJKLMNOP");
    lcdPosition(fd_lcd,0,1);
    lcdPuts(fd_lcd,"abcdefghijklmnop");

    while (1){
        printf("0:lcdDisplay test\n");
        printf("1:lcdCursor test\n");
        printf("2:lcdBlink test\n");
        printf("q:End\n");
        c=getchar();
        if(c == 'q') break;

        if(c == '0') {
            for(i=0;i<10;i++) {
                lcdDisplay(fd_lcd,0);
                sleep(1);
                lcdDisplay(fd_lcd,1);
                sleep(1);
            }
        }

        if(c == '1') {
            for(i=0;i<16;i++){
                lcdPosition(fd_lcd,i,0);
                lcdCursor(fd_lcd,1);
                sleep(1);
            }
            lcdCursor(fd_lcd,0);
        }

        if(c == '2') {
            for(i=0;i<16;i++){
                lcdPosition(fd_lcd,i,1);
                lcdCursorBlink(fd_lcd,1);
                sleep(1);
            }
            lcdCursorBlink(fd_lcd,0);
        }
    }
    lcdClear(fd_lcd);
}


MCP32017の場合

MCP32017の場合

このチップは8チャンネルとチャンネル数が少ないので、6チャンネルしか使わないLCDを制御するのには最適かもしれません。
新しいIOエクスパンダを入手したらまた紹介します。