【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!

2021年2月22日


◆dsPIC33FJ128MC802でaitendoの1.44インチTFT液晶ZY-FGD1442701V1-PCBを使ってみます。
液晶はaitendoで購入できます。
PMP接続自体はスピードアップにはつながりませんが後のDMA転送時に便利です。

参考記事

以前の作成した記事PMPを使ってみる。秋月LCD-SD1602と接続。をちょっと変更するだけでできます。
リファレンスマニュアル:DS70299Cの通りに設定すればできます。

PMPの設定

aitendoの1.44インチTFT液晶ZY-FGD1442701V1-PCBをPMP接続する場合には
「書き込みenable」がないのでPMENBとの接続は必要ありません。

PICでLCDコントローラの例

パラレルポートモードビットの設定

 PMMODEbits.MODE = 0b11

 ”11”の場合はMasterMode1でPMP接続はCS、RD/WR、Address、DATAになります。
 ”10”の場合はMaserMode2でCS、WR、RD、Address、DATAになります。
 今回はMasterMode1に設定しました。

読み/書きイネーブルPTRDENを有効にする。

 LCDからREADすることはないので今回は未使用です。
 LCDのRDピンはHighで固定します。

 PMCONbits.PTRDEN = 1;

 MaserMode1で"1″の場合、PMRD/PMWRポートがEnableになります。
 pin24がPMRD/PMWRになります。

読み込みスロープの設定

 PMCONbits.RDSP = 1;

 MaserMode1で"1″の場合、スロープはRD:アクティブHi、WR:アクティブLowになります。
 LCDのWRとPICのPMRD/PMWRを接続します。

PMP制御のフロー

書き込みのとき・・・

 ・PMADDRbits.ADDR0をセットします。
 ・PMDIN1にデータを入れる。
 ・勝手にWRはパタパタします。
 ・ADDR0を固定すれば連続書き込みが可能!!

読み込みのとき・・・

 ・PMADDRbits.ADDR0をリセットします。
 ・PMDIN1から読み出します。
 ・今回は使いません。

メインのプログラム

LCDの初期化等は省きます。
ブルーバック後、任意の個所に赤ラインを描画します。
256byte連続で書き込みます。

unsigned char *st_pointer;      //line_pointer
unsigned char st_box[256];      //line_data
void zy_write(unsigned flag, unsigned char data);  //(flag:0:command/1:data)
void zy_full_set(unsigned char h_byte, unsigned char l_byte);
void zy_line(unsigned char *byte);            //line_out
st_pointer = &st_box[0];    //first_byte_set
zy_full_set(0x00,0x1f);      //blueback
//== while文 ===========================================================
while(1)
{
zy_line(st_pointer);            //line_out
}//while(1)
//== set ===================================================
unsigned char st_box[256] =
{
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00
};
//==========================================================
//== zy_fgd Write  0:cmd/1:data ====================================================
void zy_write(unsigned flag, unsigned char data)
{
//zy_cs = 0;
//command_mode
if(flag == 0)
{PMADDRbits.ADDR0 = 0;}   //command_mode/cd_low
//data_mode
else{PMADDRbits.ADDR0 = 1;}      //data_mode
//PMP
while(PMMODEbits.BUSY == 1);    //PMP_OK?
PMDIN1 = data;
}//void zy_write(unsigned flag, unsigned char data)
//== zy_fgd_full_set ============================================
void zy_full_set(unsigned char h_byte, unsigned char l_byte)
{
unsigned int i;
for(i=0; i<16384; i++)
{
zy_write(1,h_byte);
zy_write(1,l_byte);
}
}//void zy_full_set(unsigned char h_byte, unsigned char l_byte);
//=================================================================================
void zy_line(unsigned char *byte)
{
zy_write(0,0x2a); //x_address
zy_write(1,0x00); //start
zy_write(1,0x02);
zy_write(1,0x00); //end
zy_write(1,0x81);
zy_write(0,0x2b); //y_address
zy_write(1,0x00); //start
zy_write(1,0x04);
zy_write(1,0x00); //end
zy_write(1,0x04);
zy_write(0,0x2c); //memory_write
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
PMADDRbits.ADDR0 = 1; //data_mode_set
unsigned char count;
for(count=0; count<256; count++)
{
PMDIN1 = *(byte+count);         //auto_increment
//byte++;
}//for(count=0; count<128; count++)+
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
}//void zy_line()
//======================================================================

オシロスコープにて確認

黄色がWRの挙動です。ピンクはRA1に接続してます。1ライン転送毎に切り替えてます。
1ライン描画するのに84μsecかかりました。
2437654c.png

実行時のLCDの様子。

aitendoの1.44インチ液晶TFT(ZY-FGD)PMP接続1ライン出力

回路図

28b9ed33.png

次回はPMPのDMA転送です。転送スピードが3倍程度速くなります!

よろしければバナーをクリックお願いします!