aitendoで入手したカラーグラフィックLCD(M028C9325TP (320 x 240ピクセル)には、SDカードのソケットも実装されています。 ここに画像ファイル(BMP)を入れてLCDへの表示をしました。
PIC18F26K22を使用してXC8のCコンパイラ用のプログラムでLCD(M028C9325TP)への表示とSDカードの読み出しとは先日個別にできているので、合体することでSDカード内の画像ファイルを読み出してLCDに表示しました。
SD関連の結線は前回のそのままですが、LCD関連の結線はRCxからRBxに変更しました。
PICとSDカードの接続
PIC SDカード(変更なし)
————————————–
RC0 SD_CS (10kΩの抵抗器でプルアップ)
RC3/SCK1 SD_SCK
RC4/SDI1 SD_OUT (10kΩの抵抗器でプルアップ)
RC5/SDO1 SD_DIN
PICとLCDの接続(RCx→RBxに変更)
PIC LCD
————————-
RA0 DB8
RA1 DB9
・ ・
・ ・
RA7 DB15
RC0 RB3 RS
RC1 RB2 WR
RC2 RB1 RD
RC6 RB4 CS
RC7 RB5 RST
元々ベースにしたC言語のコードは先日の日記にも記載しているように、
LCD関連: aitendo のサイトのこのLCDのページにあるC言語の参考コード(但しSTM32用)
SD関連:こちらのサイト(Interfacing SD Card With PIC Microcontroller-XC8)
です。 これらに変更を加えた形になっています。
プログラムはSDカード読み書きのものをベースにして、LCD関係のコード(ILI93xx.c (修正したもの), lcd.h(修正したもの), font.h)を組み込み、つじつまをあわせる感じで行いました。)
その上でILI93xx.cにBMPファイルをLCDに表示するために変更しました。
主な変更点は、画像表示RAM(GRAM) アドレス制御の変更 (ILI9325のAMビット=0→1, I/Dビット=11→00)。 (これによってLCD_WR_DATA()を連続で読み出している関数のLCD_Fill()とLCD_Clear()は副作用を受ける。)です。
LCD_Init()関数
LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K
→ LCD_WriteReg(0x0003,(1<<12)|(0b00<<4)|(1<<3) );//65K
LCD_Clear()関数
LCD_SetCursor(0x00,0x0000);//
→ LCD_SetCursor(0x00,LCD_H – 1);
LCD_Fill()関数
#ifdef USE_HORIZONTAL
→ #ifndef USE_HORIZONTAL
さらに、BMPファイルの画像データをLCD_WR_DATA()関数を使用してLCDの画像表示RAM(GRAM)に転送する関数を追加。 main()でf_read()に続いてこれを呼び出します。
上記の変更でBMPファイルデータ順(画像左下始まり、水平方向にスキャン、右上終わり)とLCD_WR_DATA()関数を連続使用したときの画像表示データRAM(GRAM)のアドレス変化の方向が同一になっています(LCD_WR_DATA()で連続転送できる)。 RGBのビット位置合せは必要ですけど。
PIC18FでのC言語の扱いと、カラーグラフィック液晶をどのような感じで使うのかが大体わかった気がします。 このLCDモジュール(M028C9325TP)はタッチスクリーンもついているのですが、試してみるかどうかまだ迷っています。
関連記事
C言語でPIC18F、まずはLチカ (LED点滅)
C言語でPIC18F、カラーグラフィックLCD(M028C9325TP) 接続
C言語でPIC18F、カラーグラフィックLCD(M028C9325TP) 接続2
C言語でPIC18F、SDカード読み書き
C言語でPIC18F、SDカードの画像ファイルをLCD(M028C9325TP)に表示
ZEROPLUS ロジックアナライザ 【LAP-C(16032)】 |
コメントを書く