JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1827 OLED 表示テスト

2020-08-08 19:45:33 | PIC16F1827
 これまでの電子工作では、表示に主にLCDを使用してきましたが、最近OLED(有機ELディスプレイ)の表示器が比較的安価に購入できるようになりましたので、テストしてみます。

 0.96インチ128×64ドットのOLEDは、秋月電子では、580円 Amazonでは760円で購入できます。どちらもコントロールにはSSD1306が使われています。
 今回はAmazonからHiLetgoのものを調達しました。
 幅、高さとも3cm未満で小さいです。

 裏面です。

 今回は、PIC(PIC16F1827)を使って、表示テストを行います。
 OLEDの表示プログラムは、Arduinoなどのものが多く、PICでの表示例は少ないです。
 以下の2つのサイトが参考になります。

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




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

 既に、PICでPLED表示の実験をしている仲間からOLEDから大きなノイズが出るという報告があり、電源ラインのノイズをpicoスコープで見てみました。

 PIC OLEDともパスコン(0.1uF)を付けていますが、電圧3Vを中心に約0.1Vのノイズがのっています。
 今回の実験では、動作に問題はありませんでしたが、目的、回路によっては対策が必要になると思います。

 ここまで、クロック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);
}
}