PIC16F1827 OLED表示テスト

JH7UBC 2020.8.26


これまでの電子工作では、表示に主にLCDを使用してきましたが、最近OLED(有機ELディスプレイ)の表示器が
比較的安価に購入できるようになりましたので、テストしてみます。
 0.96インチ128×64ドットのOLEDは、秋月電子やAmazonで購入できます。
どちらもコントロールにはSSD1306が使われています。今回はAmazonからHiLetgoのものを調達しました。

 
今回は、PIC(PIC16F1827)を使って、表示テストを行います。
OLEDの表示プログラムは、Arduinoなどのものが多く、PICでの表示例は少ないです。
以下の2つのサイトが参考になります。
JR3TGS局のサイト
LSI Jiu-Jitsu  半導体とブラジリアン柔術(Raspberry Piでの表示例)

まずは、JR3TGS局のサイトにあるプログラムをコピペして、表示テストをしてみました。問題なく表示されました。
電源は乾電池3本(3V)で、消費電流は、PIC,OLEDを合わせて約7mAでした。
なお、フォントはfont6.hとfont12.hとしてMPLAB X IDEの当該プロジェクトのHeader Fileフォルダーの中に保存します。

PIC16F1827とOLEDの接続は、下のとおりです。I2Cのプルアップ抵抗は、OLEDモジュールに内蔵されていますので、つけていません。

ここまで、クロック16MHzでしたが、32MHzに上げて実験を続けました。
OLEDを初期化するだけのプログラムを実行すると


GDDRAMがクリアされていませんので、テレビの砂の嵐のような画面になります。したがって、画面をクリアする関数 oled_clr();を実行します。
SSD1306のGDDRAMへの書き込みモードは、
Horizontal addressing mode
Vertical addressing mode
Page addressing mode
の3種類です。それぞれのモードの説明は、省略しますが、上記参照サイトおよびSSD1306の説明書を見てください。


 自分なりに表示させてみました。一番下の行は0から数字をカウントアップさせています。printf()関数が使えますので、便利です。



参考までにmainプログラムのみ以下に掲載します。
内部クロックは8MHzですが、PLL ONで32MHzで動作しています。
void main(void) {
ANSELA = 0b00000000; // AN0-AN4は使用しない
ANSELB = 0b00000000; // AN5-AN11は使用しない
TRISA = 0b00000000; // PORTAは全て出力(RA5は入力)
TRISB = 0b00010010; // RB1(SDA)とRB4(SDA)は入力、他は出力
PORTA = 0b00000000; // PORTA初期化
PORTB = 0b00000000; // PORTB初期化
OSCCON = 0b01110000; // 内部クロック 8MHz

I2C_init(); // I2C初期化
OLED_init(); // OLED初期化
OLED_clr(); // OLED画面消去

unsigned int i = 0;

font6_posi(0,0);
printf("ABCDEFabcded012345");

font12_posi(3, 4);
printf("50.2346MHz");

while(1){
font12_posi(6,10);
printf("%6d",i);
i += 1;
__delay_ms(500);
}
}


inserted by FC2 system