OLED(SO1602AWYB-UC-XX)表示処理用プログラム==OLED初期化== #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys/ioctl.h> #include <linux/i2c-dev.h> main(int argc, char *argv[]) { int i2c_fd; //I2Cバス用のファイル・ディスクリプタ char *i2cbus = "/dev/i2c-1"; //バス1側のデバイス名 int oled_addr = 0x3c; //OLEDのアドレス unsigned char oled_reg = 0x40; //書き込み対象のレジスタ int i; //汎用カウンタ unsigned char buf[4カテゴリ:PIAST]; //書き込み用バッファ char dmesg[256]; if(argc OLED実装時< 1) exit(1); br> //I2Cバスをオープンする if((i2c_fd = open(i2cbus, O_RDWR))<0){br> perror("oledinit open"); exit(1); } //スレーブのアドレスをioctlで設定 if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){ perror("oledinit can't set slave"); close(i2c_fd); exit(1); } usleep(100); //OLED初期化 //ディスプレイ消去 buf[0] = 0x00; buf[1] = 0x01; write(i2c_fd,buf,2); usleep(20); //カーソルをホームへ buf[0] = 0x00; buf[1] = 0x02; write(i2c_fd,buf,2); usleep(20); //表示ON,カーソル表示なし buf[0画像:PIAST PCB-OLED.png] = 0x00; buf[1] = 0x0c; write(i2c_fd,buf,2); usleep(20); //表示ON buf[0] = 0x00; buf[1] = 0x01; write(i2c_fd,buf,2); usleep(20); close(i2c_fd); }==OLED1行目表示用== #include <stdio.hbr> #include <stdlib.hbr> #include <strings.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys/ioctl.h> #include <linux/i2c-dev.h> main*フロント部にOLED(int argc, char *argv[]16x2)表示器を付ける場合の実装 { int i2c_fd; //I2Cバス用のファイル・ディスクリプタ char *i2cbus = "/dev/i2c-1"; //バス1側のデバイス名 int oled_addr = 0x3c; //OLEDのアドレス unsigned char oled_reg = 0x40; //書き込み対象のレジスタ int i; //汎用カウンタ unsigned char buf[4]; //書き込み用バッファ char dmesg[256];対応部品 :JP2の位置にピンソケットを実装 if(argc < 2) exit(1); //I2Cバスをオープンする if((i2c_fd = open(i2cbus, O_RDWR))<0){ perror("oledinit open"); exit(1); } //スレーブのアドレスをioctlで設定 if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){ perror("oledinit can't set slave");br> close(i2c_fd); exit(1); } //カーソルをホームへ buf[0] = 0x00; buf[1画像:PIAST_OLED_CARRY.png] = 0x02; write(i2c_fd,buf,2); usleep(20); //1行目処理 strncpy(dmesg, argv[1], 16); //メッセージ書き込み for(i=0;i<16;i++) {br> buf[0] = 0x40;OLED用キャリーボードを使用すると直結可能。キャリーボードは以下のように組み立て if(dmesg[i] == 0) break;:SA0 - I2Cアドレス選択用ハンダジャンパ―、L側で0、H側で1 buf[1] = dmesg[i];:C - パスコン用 write(i2c_fd:R1,buf,2);R2 - 実装しない usleep:注意1:アングルピンヘッダは写真の位置に実装するが、写真のように長ピン側に黒いプラスチックがあるものを選択のこと(20ピンの長さの関係);。 }:注意2:アングルピンヘッダの裏面飛び出し量に注意。OLED本体のパーツと接触しないように。 :対応OLEDモジュール - 秋月電子扱いの16×2文字表示タイプ close(i2c_fd); }==OLED2行目表示用== #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <sys::白 http:/ioctl.h> #include <linux/i2c-devakizukidenshi.h> main(int argc, char *argv[]) { int i2c_fd; com/catalog/I2Cバス用のファイル・ディスクリプタ char *i2cbus = "g/dev/i2cgP-1"; /08277/バス1側のデバイス名 int oled_addr = 0x3c; ::緑 http://OLEDのアドレス unsigned char oled_reg = 0x40; akizukidenshi.com/catalog/書き込み対象のレジスタ int i; g/gP-08276/汎用カウンタ unsigned char buf[4]; ::黄 http://書き込み用バッファ char dmesg[256]; if(argc < 2) exit(1); akizukidenshi.com/catalog/I2Cバスをオープンする if((i2c_fd = open(i2cbus, O_RDWR))<0){ perror("oledinit open"); exit(1); } g/gP-08278/スレーブのアドレスをioctlで設定 if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){:OLEDのピン数に対してOLEDキャリーボード側のピン数が少ないが、1番ピン側からあわせて取り付けること。 perror("oledinit can't set slave");*参考 close(i2c_fd);:要するにI2C接続タイプのディスプレイを搭載するためのものなので他のI2Cディスプレイでも接続可能。その場合の接続はJP2のピンアサインが以下のようになっているので、これに合わせてキャリーボードを製作すること。 exit(:1); } //DDRAMを2行目へ- GND buf[0] = 0x00; buf[1] = 0xa0; write(i2c_fd,buf,:2); usleep(20); //2行目処理 strncpy(dmesg, argv[1], 16); //メッセージ書き込み for(i=0;i<16;i- ++) {3.3v buf[0] = 0x40;:3 - NC if(dmesg[i] == 0) break;:4 - NC buf[1] = dmesg[i];:5 - NC write(i2c_fd,buf,2);:6 - NC usleep(20);:7 - SDA }:8 - SCL :9 - NC close(i2c_fd); }:10 - NC