/********************************************************** * Scope Hardware V6(2現象としては、3号機) * オシロ_V5aの、カラーQVGA液晶表示版 * * 2.8インチQVGA液晶モジュール(aitendo): M028C9325TP * 240x320ドット 16ビットカラー 横置き表示 * * Condition: * 8MHz External X'tal Oscillator, 10x PLL (8MHzx10= 80MHz) * Fcy=80MHz/2=40MHz, Tcy=25ns * * CPU: PIC24HJ64G206 * * N.Ishii 2014.7.1 ************************************************************/ #include #include "colorlcd_lib_pic24hj64.h" /// Set Configuration Word: 8MHz External X'tal OSC _FBS(BSS_NO_FLASH & BWRP_WRPROTECT_OFF ) _FGS(GSS_OFF & GCP_OFF & GWRP_OFF ) _FOSCSEL(FNOSC_PRIPLL & IESO_ON) _FOSC(FCKSM_CSECME & OSCIOFNC_OFF & POSCMD_XT ) _FWDT(FWDTEN_OFF & WINDIS_OFF) _FPOR(FPWRT_PWR32) //--------------------------------------------------------------- #define AC_DC_SW_1 PORTDbits.RD4 #define AC_DC_SW_2 PORTDbits.RD5 #define HOLD_RUN_SW PORTDbits.RD6 #define TRIG_MODE_SW PORTCbits.RC13 #define READY_SW PORTCbits.RC14 #define SLOPE_SW PORTDbits.RD7 #define XY_SW PORTGbits.RG9 //-------------------------------------------------------------- /// A Variable (Global) // Data Buffer for GLCD int Buffer1[512]; // CH1用 int Buffer2[512]; // CH2用 int Index,POT,TSW,VSW_1,VSW_2; char EndFlag; /// DMA_Buffer Location & BufferA/B Change Flag // AN0:1CH信号入力、AN1:2CH信号入力、AN2:トリガレベル入力 unsigned int BufferA[4] __attribute__((space(dma))); // DMAバッファ_A側 unsigned int BufferB[4] __attribute__((space(dma))); // DMAバッファ_B側 unsigned int DmaBuffer = 0; // DMAバッファ・チェンジ・フラグ char HOLD_ON_flag = 0; char hold_status = 0; char READY_flag = 0; char ready_status = 0; char POS_flag = 1; // Defult Trigger Slope is positive //--------------------------------------------------------------- /// Function Prottypes void Oscillo(void); void AxisDraw(void); void dotyline(int x0); void dotxline(int y0); void Oscillo_single_mode(void); void Single_trigger_mode(void); /************************************************ * Function Main ************************************************/ int main(void){ /* Initialize Clock */ CLKDIVbits.PLLPRE = 0; // PLLPRE=1/2 to 4MHz PLLFBDbits.PLLDIV = 38; // PLLDIV=1/40 to 160MHz CLKDIVbits.PLLPOST = 0; // PLLPOST=1/2 to 80MHz then 40MIPS /* Initialize Port */ AD1PCFGL = 0xFFF8; // AN0-2 are Analog AD1PCFGH = 0xFFFF; // OTHER Digital TRISB = 0x00FF; // LCD_DataPort(RB8-RB15) is output, TSW_IN(RB3-RB5) is input TRISC = 0xFFFF; // TRG_MODE_SW, READY_SW(RC13, RC14) is input TRISD = 0xF0F0; // LCD_ControlPort(RD0, RD8-RD11) is output, SLOPE,HOLD_SW,DC/AC_SW_1,2(RD7-RD4) is input TRISF = 0xFFFF; // VSW2-1,2,4(RF3,RF4,RF5) is input TRISG = 0x8FFF; // HOLD.READY,TRIG_LED(RG14,13,12) is output, VSW-1,2,4(RG6-RG8),XY_SW(RG9) is input // CNPU1 = 0x8001; // HOLD,READY_SW(RD6,RC14) is pull up CNPU1 = 0xE8E3; // HOLD,READY_SW(RD6,RC14) TSW(RB3-5),AC/DC_SW1(RD4).AC/DC_SW2(RD5),XY_SW(RG9) is pull up CNPU2 = 0x0001; // SLOPE_SW(RD7) is pull up /// Set Switch Change Notification Interrupts CNEN1 = 0x8001; // Valid CN15,CN0: HOLD,READY_SW CNEN2 = 0x0001; // Valid CN16: SLOPE_SW IPC4bits.CNIP = 3; // The Order of Priority: CN INT=6, (DMA5 Defult INT=4) IEC1bits.CNIE = 1; // Enable CN INT LATGbits.LATG12 = 1; // Green LED(TRIG) OFF LATGbits.LATG13 = 1; // Red LED(READY) OFF LATGbits.LATG14 = 1; // YELLOW LED(HOLD) OFF // 液晶表示器の初期化 lcd_Init(); lcd_Clear(BLACK); lcd_Str(0, 0, "Scope V6", CYAN, BLACK); delay_ms(1000); //// Initialize DMA Oチャンネル DMA0CONbits.AMODE = 0; // Configure DMA for Register indirect mode // with post-increment DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode DMA0PAD = (volatile unsigned int)&ADC1BUF0; // Point DMA to ADC1BUF0 DMA0CNT = 3; // 4 DMA request DMA0REQ = 13; // Select ADC1 as DMA Request source (IREQ13) DMA0STA = __builtin_dmaoffset(BufferA); // Read New DMA Address A-side DMA0STB = __builtin_dmaoffset(BufferB); // Read New DMA Address B-side IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit DMA0CONbits.CHEN=1; // Enable DMA /// Initialize ADC(2CHオシロの設定:4CH同時サンプリング) AD1CON1 = 0x004C; // b15:ADON:0:ADCモジュールOFF // b14:x:0 // b13:ADSIDL:0:アイドルモードでも動作継続 // b12:ADDMABM:0:DMAバッファはスキャッタ/ギャザモードで書込まれる //------------------------------------------------------------------------------------------ // b11:x:0 // b10:AD12B:0:10bitで4CHのAD動作 // b_9:FORM<1>:0:データフォーマット= 整数 // b_8:FORM<0>:0 //------------------------------------------------------------------------------------------ // b_7:SSRC<2>:0:サンプルクロックソース= T3一致でサンプリング終了し変換開始(ADC1の場合) // b_6:SSRC<1>:1 // b_5:SSRC<0>:0 // b_4:x:0 //------------------------------------------------------------------------------------------ // b_3:SIMSAM:1:※ 同時サンプリング // b_2:ASAM:1:サンプリングは最後の変換終了直後に開始する。SAMPビットは自動セットされる // b_1:SAMP:0:S/Hはホールド中 // b_0:DONE:0:ADCステータスビット //------------------------------------------------------------------------------------------ AD1CON2 = 0x0200; // b15:VCFG<2>:0:VREF=AVDD-AVSS // b14:VCFG<1>:0: // b13:VCFG<0>:0: // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:CSCNA:0:※ 今回は4CH同時サンプルなので、4つのS/H(CH0〜3)を使用し入力スキャンは使用しない // b_9:CHPS<1>:1:※ 4CH(CH0〜3)を変換 // b_8:CHPS<0>:0: (AN3はDSW-1デジタル入力としているのでAVSS=0Vが変換される) //------------------------------------------------------------------------------------------ // b_7:BUFS:0(R-Only):※ バッファフルステータス  // b_6:x:0          BUF_0〜7に書込み中、BUF8〜15内のデータにアクセスせよ // b_5:SMPI<3>:0:※ 4CH同時サンプルの場合は、1回のサンプルで4CH分の同時サンプル終了後、4CH分の // b_4:SMPI<2>:0   変換が完了する毎にAD割込みを発生させる //------------------------------------------------------------------------------------------ // b_3:SMPI<1>:0 // b_2:SMPI<0>:0 // b_1:BUFM:0:毎回のサンプル/変換動作完了ごとにDMAアドレスを+1 // b_0:ALTS:0 //------------------------------------------------------------------------------------------ AD1CON3 = 0x0202; // b15:ADRC:0:ADCクロックソース= システムクロックから取出したクロック // b14:x:0 // b13:x:0 // b12:SAMC<4>:0:自動サンプル時間(Acquisition Time)Tsmp=2Tad(200nS(40MIPS)) //------------------------------------------------------------------------------------------ // b11:SAMC<3>:0 // b10:SAMC<2>:0 // b_9:SAMC<1>:1 // b_8:SAMC<0>:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:ADCS<5>:0:ADCクロック周期(Tad)= Tcy*(ADCS+1)= 25nS*(2+1)= 75nS(規格:≧70nSmin):40MIPS // b_4:ADCS<4>:0 //------------------------------------------------------------------------------------------ // b_3:ADCS<3>:0 // b_2:ADCS<2>:0 // b_1:ADCS<1>:1 // b_0:ADCS<0>:0 //------------------------------------------------------------------------------------------ //////////////////////////////////////////////////////////////////////////////////////////////// /// <総変換時間算出> ///  @ 40MIPSの場合 /// Tconv= 12Tad= 12*0.075uS= 0.9uSなので、 /// 総変換時間= Tsmp + (Tconv*4)= 0.2u + (0.9uS*4)= 3.8uS /////////////////////////////////////////////////////////////////////////////////////////////// AD1CON4 = 0x0000; // アナログ入力ごとに、1ワードのDMAバッファを配置 // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:x:0 // b_9:x:0 // b_8:x:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:x:0 // b_4:x:0 //------------------------------------------------------------------------------------------ // b_3:x:0 // b_2:DMABL<2>:0 // b_1:DMABL<1>:0 // b_0:DMABL<0>:0 //------------------------------------------------------------------------------------------ AD1CHS123= 0x0000; // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:CH123NB<1>:0:B側のS/Hは未使用 // b_9:CH123NB<0>:0 // b_8:CH123SB:0: //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:x:0 // b_4:x:0 //------------------------------------------------------------------------------------------ // b_3:x:0 // b_2:CH123NA<1>:0:S/H(CH1-3)負側入力は、AVSSに接続 // b_1:CH123NA<0>:0 // b_0:CH123SA:0:AN0 for CH1 +IN/ AN1 for CH2 +IN/ AN2 for CH3 +IN(CH1〜3はS/HのCH) //------------------------------------------------------------------------------------------ AD1CHS0 = 0x0003; // b15:CH0NB:0:B側のS/Hは未使用 // b14:x:0 // b13:x:0 // b12:CH0SB<4>:0 //------------------------------------------------------------------------------------------ // b11:CH0SB<3>:0 // b10:CH0SB<2>:0 // b_9:CH0SB<1>:0 // b_8:CH0SB<0>:0 //------------------------------------------------------------------------------------------ // b_7:CH0NA:0:S/H(CH0)負側入力は、AVSSに接続 // b_6:x:0 // b_5:x:0 // b_4:CH0SA<4>:0:※ AN3 for CH0 +IN //------------------------------------------------------------------------------------------ // b_3:CH0SA<3>:0 // b_2:CH0SA<2>:0 // b_1:CH0SA<1>:1 // b_0:CH0SA<0>:1 //------------------------------------------------------------------------------------------ AD1CSSL = 0x0000; // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:x:0 // b_9:x:0 // b_8:x:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:CSS5:0:入力スキャンに、AN5を選択しない // b_4:CSS4:0:入力スキャンに、AN4を選択しない //------------------------------------------------------------------------------------------ // b_3:CSS3:0:入力スキャンに、AN3を選択しない // b_2:CSS2:0:入力スキャンに、AN2を選択しない // b_1:CSS1:0:入力スキャンに、AN1を選択しない // b_0:CSS0:0:入力スキャンに、AN0を選択しない //------------------------------------------------------------------------------------------ AD1PCFGL = 0xFFF8; // b15:x:1 // b14:x:1 // b13:x:1 // b12:x:1 //------------------------------------------------------------------------------------------ // b11:x:1 // b10:x:1 // b_9:PCFG9:1 // b_8:PCFG8:1 //------------------------------------------------------------------------------------------ // b_7:PCFG7:1 // b_6:PCFG6:1 // b_5:PCFG5:1 // b_4:PCFG4:1 //------------------------------------------------------------------------------------------ // b_3:PCFG3:1:AN3は、デジタル入力ピンに設定(RB1:DSW-1として使用:この場合MUXはAVSS=0Vに接続される) // b_2:PCFG2:0:AN2を、アナログ入力ピンに設定 // b_1:PCFG1:0:AN1を、アナログ入力ピンに設定 // b_0:PCFG0:0:AN0を、アナログ入力ピンに設定 //------------------------------------------------------------------------------------------ AD1CON1bits.ADON = 1; // ADC Start /* Inittalize Timer3:T3= Tcy*PS*n= 0.025uS*1*400 = 10uS */ PR3 = 399; // n = 400 (PR3=n-1): Mod. 0x018F-> 399 110423 T3CON = 0x0000; // T3_OFF, T3_GATE_OFF, T3_PS_1_1, T3_SOURCE_INT /****** Main Loop ****/ while(1){ /* Draw a Graph of Input Wave Data */ EndFlag = 0; // Clear End of Convertion Flag Index = 0; if (TRIG_MODE_SW) { // Trigger is AUTO Mode /* Switching Sampling Period */ TSW = (~PORTB & 0x0038) >> 3; // Read Decimal Dip SW /// Add Branch Set PS3: 110425 if (TSW == 7) T3CONbits.TCKPS = 1; // PS3 = 1/8 else T3CONbits.TCKPS = 0; // PS3 = 1/1 /// 2CHオシロ(4CH同時サンプリング)の場合の、T3サンプル周期設定 switch(TSW){ case 0: PR3 = 159; // 4usec:0.2msec/div break; case 1: PR3 = 399; // 10usec:0.5msec/div break; case 2: PR3 = 799; // 20usec:1.0msec/div break; case 3: PR3 = 1599; // 40usec:2.0msec/div break; case 4: PR3 = 3999; // 100usec:5.0msec/div break; case 5: PR3 = 7999; // 200usec:10msec/div break; case 6: PR3 = 39999; // 1000usec:50msec/div break; case 7: PR3 = 49999; // 10msec:500msec/div break; default:PR3 = 399; // 10usec:0.5msec/div break; } LATGbits.LATG13 = 1; // Red LED OFF READY_flag = 0; ready_status = 0; T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); Oscillo(); // Disp. Oscillo EndFlag = 0; Index = 0; /// Cheack HOLD_RUN_SW Status while (HOLD_ON_flag) { hold_status = 1; } hold_status = 0; delay_ms(1000); } else Single_trigger_mode(); } } /******************************************************************************** * ADC : 3Channel使用(AN0:1CH信号入力、AN1:2CH信号入力、AN2:トリガレベル入力) * DMA Interrupt Period = T3_Period *********************************************************************************/ void __attribute__((interrupt, auto_psv)) _DMA0Interrupt(void) { // Switch between Primary and Secondary Ping-Pong buffers if(DmaBuffer == 0) { /// x = BufferA[0]→ AN3 Input Data(AN3は、DSW-1デジタル入力なので何もしない) Buffer1[Index] = BufferA[1]; // Buffer1[] <- AN0 Input Data(オシロのCH1) Buffer2[Index] = BufferA[2]; // Buffer2[] <- AN1 Input Data(オシロのCH2) POT = BufferA[3]; // POT <- AN2 Input Data((オシロのトリガ・ポテンショレベル) } else{ // '0'-> Useing ADC1BUF0- ADC1BUF6 Side (Access is ADC1BUF8- ADC1BUFE Side) /// x = BufferB[0]→ AN3 Input Data(AN3は、DSW-1デジタル入力なので何もしない) Buffer1[Index] = BufferB[1]; // Buffer1[] <- AN0 Input Data(オシロのCH1) Buffer2[Index] = BufferB[2]; // Buffer2[] <- AN1 Input Data(オシロのCH2) POT = BufferB[3]; // POT <- AN2 Input Data((オシロのトリガ・ポテンショレベル) } ++Index; DmaBuffer ^= 1; // ALT DmaBuffer Flag if(Index >= 512){ // Buffer Full ? T3CONbits.TON = 0; // Buffer Full Then T3 OFF and EOC Flag ON EndFlag = 1; } IFS0bits.DMA0IF = 0; //Clear the DMA0 Interrupt Flag } /******************************************************* * Switch Change Notification Interrupts ********************************************************/ void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void) { delay_ms(10); if (!hold_status) { // hold_status -> 0: RUN if (!HOLD_RUN_SW) HOLD_ON_flag = 1; } else { // hold_status -> 1: HOLD_ON Loop if (!HOLD_RUN_SW) HOLD_ON_flag = 0; } if (ready_status) { if (!READY_SW) READY_flag = 1; } if (!SLOPE_SW) { if (POS_flag) POS_flag = 0; else POS_flag = 1; } IFS1bits.CNIF = 0; // Clead CNIF Flag } /************************************************************** * Disp. Oscillo (Disp. Save Buffer Data) * Detect Trigger-> Disp. 320Data from this Position * Not Detect Trigger-> Disp. 320Data from Top Position * * <X-Yモードの説明> * 1CHをX入力、2CHをY入力とし、各AD変換値格納バッファの値を * X、Y座標値に変換して液晶画面上にプロットし、ライン表示する * * X-Yモードの時は、NORMALトリガとしトリガ成立の時のみ * リサージュ図形を表示するようにする * (トリガ不成立の時は、TRIG_LEDを消灯させるだけ) ***************************************************************/ void Oscillo(void){ short i,x, Point; AxisDraw(); // 座標表示 Point = -1; // 最初のデータ /// トリガチェック if (POS_flag) { // トリガ・スロープ:正 for(x=0; x<190; x++){ if((Buffer1[x] < POT) && (Buffer1[x+5] >= POT)){ Point = x; continue; } } } else { // トリガ・スロープ:負 for(x=0; x<190; x++){ if((Buffer1[x+5] < POT) && (Buffer1[x] >= POT)){ Point = x; continue; } } } if (XY_SW != 0) { // DUALモードの時は、以下を実行 /// トリガ成立、その位置から波形表示 if(Point != -1){ LATGbits.LATG12 = 0; // LED ON for(i=1; i<=320; i++) { lcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); lcd_Line(i, Buffer2[i+Point-1]*5/22, i, Buffer2[i+Point]*5/22, GREEN); } } // トリガ不成立、最初から表示する else { LATGbits.LATG12 = 1; // LED OFF for(i=1; i<=320; i++){ lcd_Line(i, Buffer1[i-1]*5/22, i, Buffer1[i]*5/22, MAGENTA); lcd_Line(i, Buffer2[i-1]*5/22, i, Buffer2[i]*5/22, GREEN); } } } else { // X-Yモードの時は以下を実行 /// トリガ成立 if(Point != -1){ LATGbits.LATG12 = 0; // LED ON for(i=1; i<=320; i++) { lcd_Line((Buffer1[i+Point-1]*5/22)+58, Buffer2[i+Point-1]*5/22, (Buffer1[i+Point]*5/22)+58, Buffer2[i+Point]*5/22, MAGENTA); } } // トリガ不成立 else LATGbits.LATG12 = 1; // LED OFF } } /****************************************************** * Disp. Oscillo and Cheack trigger for Single mode *******************************************************/ void Oscillo_single_trigger(void){ short i,x, Point; Point = -1; // 最初のデータ /// トリガチェック if (POS_flag) { // トリガ・スロープ:正 for(x=0; x<190; x++){ if((Buffer1[x] < POT) && (Buffer1[x+5] >= POT)){ Point = x; continue; } } } else { // トリガ・スロープ:負 for(x=0; x<190; x++){ if((Buffer1[x+5] < POT) && (Buffer1[x] >= POT)){ Point = x; continue; } } } /// トリガ成立、その位置から波形表示 if(Point != -1){ LATGbits.LATG12 = 0; // Green LED ON LATGbits.LATG13 = 1; // Red LED OFF AxisDraw(); for(i=1; i<=320; i++) { lcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); lcd_Line(i, Buffer2[i+Point-1]*5/22, i, Buffer2[i+Point]*5/22, GREEN); } READY_flag = 0; } // トリガ不成立、Retry sample else { LATGbits.LATG12 = 1; // LED OFF } } /********************************************* * Single_trigger_mode **********************************************/ void Single_trigger_mode(void) { hold_status = 1; while ((!READY_flag) && (!TRIG_MODE_SW)) { ready_status = 1; } if (!TRIG_MODE_SW) { ready_status = 0; LATGbits.LATG13 = 0; // Red LED ON T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); Oscillo_single_trigger(); } } /************************** * Drawing Coordinate Axis ***************************/ void AxisDraw(void){ int i; lcd_Clear(0); /// X、Y座標軸,補助線表示 if (XY_SW != 0) { // DUALモードの時は、以下を実行 for(i=0; i<319; i+=50) lcd_Line(i, 0, i, 231, BROWN); // Y axis // にすれば合う   140603 for(i=0; i<239; i+=58) lcd_Line(0, i, 319, i, BROWN); // X axis } else { // X-Yモードの時は以下を実行 for(i=0; i<319; i+=58) lcd_Line(i, 0, i, 231, BROWN); // Y axis for(i=0; i<239; i+=58) lcd_Line(0, i, 319, i, BROWN); // X axis } /* Disp. AC/DC */ if (AC_DC_SW_1 == 0) lcd_Char(0, 16, 0x8C, YELLOW, BLACK); // CH1:DCキャラクタ表示 else lcd_Char(0, 16, 0x8B, YELLOW, BLACK); // CH1:ACキャラクタ表示 if (AC_DC_SW_2 == 0) lcd_Char(9, 16, 0x8C, YELLOW, BLACK); // CH2:DCキャラクタ表示 else lcd_Char(9, 16, 0x8B, YELLOW, BLACK); // CH2:ACキャラクタ表示 /* Disp. Unit Volt Axis (V/D or mV/D) */ VSW_1 = (PORTG & 0x01C0) >> 6; // Read VSW_1 SW VSW_2 = (PORTF & 0x0038) >> 3; // Read VSW_2 SW switch(VSW_1){ case 0: lcd_Str(1,16,"50mV/D", CYAN, BLACK); break; case 1: lcd_Str(1,16,"0.1V/D", CYAN, BLACK); break; case 2: lcd_Str(1,16,"0.25V/D", CYAN, BLACK); break; case 3: lcd_Str(1,16,"0.5V/D", CYAN, BLACK); break; case 4: lcd_Str(1,16,"1.0V/D", CYAN, BLACK); break; case 5: lcd_Str(1,16,"2.5V/D", CYAN, BLACK); break; case 6: lcd_Str(1,16,"5.0V/D", CYAN, BLACK); break; case 7: lcd_Str(1,16,"10V/D", CYAN, BLACK); break; default:lcd_Str(1,16,"2.5V/D", CYAN, BLACK); break; } switch(VSW_2){ case 0: lcd_Str(10,16,"50mV/D", CYAN, BLACK); break; case 1: lcd_Str(10,16,"0.1V/D", CYAN, BLACK); break; case 2: lcd_Str(10,16,"0.25V/D", CYAN, BLACK); break; case 3: lcd_Str(10,16,"0.5V/D", CYAN, BLACK); break; case 4: lcd_Str(10,16,"1.0V/D", CYAN, BLACK); break; case 5: lcd_Str(10,16,"2.5V/D", CYAN, BLACK); break; case 6: lcd_Str(10,16,"5.0V/D", CYAN, BLACK); break; case 7: lcd_Str(10,16,"10V/D", CYAN, BLACK); break; default:lcd_Str(10,16,"2.5V/D", CYAN, BLACK); break; } /// TRGエッジ表示 if (POS_flag) lcd_Char(18, 16, 0x8D, YELLOW, BLACK); // TRG+表示 else lcd_Char(18, 16, 0x8E, YELLOW, BLACK); // TRG-表示 /// Disp. HOLD LED if (HOLD_ON_flag == 1) LATGbits.LATG14 = 0; else LATGbits.LATG14 = 1; /// Disp. Unit Time Axis (msec/div) switch(TSW){ case 0: lcd_Str(19, 16, "0.2mS/D", CYAN, BLACK); break; case 1: lcd_Str(19, 16, "0.5mS/D", CYAN, BLACK); break; case 2: lcd_Str(19, 16, "1.0mS/D", CYAN, BLACK); break; case 3: lcd_Str(19, 16, "2.0mS/D", CYAN, BLACK); break; case 4: lcd_Str(19, 16, "5.0mS/D", CYAN, BLACK); break; case 5: lcd_Str(19, 16, "10mS/D", CYAN, BLACK); break; case 6: lcd_Str(19, 16, "50mS/D", CYAN, BLACK); break; case 7: lcd_Str(19, 16, "500mS/D", CYAN, BLACK);; break; default:lcd_Str(19, 16, "0.5mS/D", CYAN, BLACK); break; } } /******************************************* * Assist Line X Coordinate Axis (Dot Line) ********************************************/ void dotxline(int y0){ int i; for(i=0; i<128; i+=3) lcd_Pixel(i, y0-1, 1); } /******************************************* * Assist Line Y Coordinate Axis (Dot Line) ********************************************/ void dotyline(int x0){ int i; for(i=0; i<64; i+=3) lcd_Pixel(x0-1, i, 1); }