【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!
◆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との接続は必要ありません。
パラレルポートモードビットの設定
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かかりました。
ディスカッション
コメント一覧
まだ、コメントがありません