/********************************************************** * カラーQVGA液晶上の左端にカーソル線を表示し、SWにより * カーソル移動させ、移動描画し、移動量を表示させる * 簡単なテストその1 * * <動作仕様> * カーソル初期位置:最左端 * 移動SWを長押しで連続移動し、短めに押すとステップ移動する * 右移動SWの場合は、最右端まで移動すると、それ以上は移動しない(左移動SWで戻す) * 左移動SWの場合は、最左端まで移動すると、それ以上は移動しない(右移動SWで戻す) * カーソル初期位置からの移動量を液晶右下に表示する * * ソース名:Move_Cursor_QVGA_TEST.C * * PIC32MXトレーニング基板を使用 * * 2.8インチQVGA液晶モジュール(aitendo): M028C9325TP * 320x240ドット 16ビットカラー 横置き表示 * * Condition: * 8MHz External X'tal Oscillator, 20x PLL (8MHzx20= 160MHz) * Fcy=160MHz/2=80MHz, Tcy=12.5ns * * CPU: PIC32MX340F256H * * N.Ishii 2014.7.16 ************************************************************/ #include /* PIC32 peripheral library */ #include "colorlcd_libdsPICVH.h" #include /// コンフィギュレーション設定 // CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off #pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2 #pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1 #pragma config FWDTEN=OFF, ICESEL=ICS_PGx2 //------------------------------------------------------------ #define MOVE_RITGH_CUR_SW PORTBbits.RB2 #define MOVE_LEFT_CUR_SW PORTBbits.RB1 //------------------------------------------------------------ /// メッセージテーブル char str_Start[] = "Start Move Cursor Test"; /// アスキー変換後の格納バッファ char DeltaXposBuf[] = "DeltaXpos= xxx"; /// A Variable (Global) //char MoveFlag = 0; short Xpos; short Ypos; //unsigned short DeltaXpos; //unsigned short Xpos_new; /// Function Prottypes void itostring(char digit, unsigned int data, char *buffer); /************************************************ * Function Main ************************************************/ int main(void) { //システム最適設定 SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 //I/O設定 AD1PCFG = 0xFFFF; //I/O設定 TRISE = 0x0000; // LCDデータバス(DB0-DB7)オール出力 TRISD = 0xFF07; // LCD_RS,CS,WR,RESET:全て出力・デバッグLED:出力・SW2-5:入力、他未使用ピンは入力設定 TRISF = 0xFFFF; // RF2-5:CH1-4入力(5Vトレラント・ピン)、RF0,RF1も入力設定(予備) TRISB = 0xFFFF; // RB1:TRG_MODE_SW, RB2:HOLD_SW入力, RB3:DSW-1入力、RB4:DSW-2入力、RB5:DSW-4入力、他未使用ピンも入力設定 LATDbits.LATD3 = 1; // デバッグLED消灯(TRG検出確認用) // 液晶表示器の初期化 Glcd_Init(); Glcd_Clear(BLACK); Glcd_Str(0, 0, str_Start, CYAN, BLACK); // delay_ms(1000); /* //スイッチ状態変化割込み許可 mCNOpen(CN_ON, CN3_ENABLE | CN4_ENABLE | CN5_PULLUP_ENABLE, CN6_PULLUP_ENABLE | CN7_PULLUP_ENABLE); // TRG_MODE_SW, HOLD_SW, DSW-1_PULLUP, DSW-2_PULLUP, DSW-4_PULLUP // TRG_MODE_SWと、HOLD_SWの、プルアップは治具の外部プルアップを使用(今回、両SWは、カーソル移動_SWとして使用) mCNClearIntFlag(); //割り込みフラグクリア ConfigIntCN(CHANGE_INT_ON | CHANGE_INT_PRI_2); // 割り込み有効化 */ // マルチベクタ割り込み設定、割り込み許可 // INTEnableSystemMultiVectoredInt(); /// Inittalize Variable Xpos = 0; Ypos = 20; Glcd_Line(Xpos, Ypos, Xpos, 220, GREEN); // イニシャル位置に縦カーソルを描画 //// メイン・ループ while(1) { delay_ms(100); // スイッチ安定待ち ※ レベルとエッジ検知を共用する為、長めに設定(割込み不要) if ((!MOVE_RITGH_CUR_SW) || (!MOVE_LEFT_CUR_SW)) { /// 移動する前に現在位置のカーソルを背景色と同じ黒で塗りつぶす(消すと同じ) Glcd_Line(Xpos, Ypos, Xpos, 220, BLACK); //Xpos_old= Xpos; if (!MOVE_RITGH_CUR_SW) { Xpos++; if (Xpos == 320) Xpos= 319; } if (!MOVE_LEFT_CUR_SW) { Xpos--; if (Xpos == -1) Xpos= 0; } //Xpos_new= Xpos; /// 移動した位置にカーソルを描画する Glcd_Line(Xpos, Ypos, Xpos,220, GREEN); /// Xposの移動量(この場合は、原点位置からの移動量=Xpos)を、液晶に表示する //DeltaXpos= Xpos_new - Xpos_old; itostring(3, Xpos, DeltaXposBuf+11); // ascii変換 Glcd_Str(12 , 16, DeltaXposBuf, WHITE, BLACK); } } } /* /////////////////////////////////////////////// // スイッチ状態変化割り込み処理 // HOLD SW, TRIG_MODE_SW /////////////////////////////////////////////// void __ISR(26, ipl2) CNHandler(void){ delay_ms(10); // スイッチ安定待ち if (!MOVE_RITGH_CUR_SW) MoveFlag= 1; mCNClearIntFlag(); //割り込みフラグクリア } */ ///////////////////////////////////////// // 数値から文字列に変換 ///////////////////////////////////////// void itostring(char digit, unsigned int data, char *buffer){ char i; buffer += digit; // 文字列の最後 for(i=digit; i>0; i--) { // 最下位桁から上位へ buffer--; // ポインター1 *buffer = (data % 10) + '0'; // その桁数値を文字にして格納 data = data / 10; // 桁-1 } }