/********************************************************************* * PIC32MX370F カラーQVGA液晶テスト_2 * プロジェクト名: QVGA_TEST * * PIC32MX370F512H実験基板(簡易6CHロジアナの実験が前提)を使用 * * Condition: * 10MHz External X'tal Oscillator, 1/2 x 20x PLL (5MHzx20= 100MHz) * Fcy= Fosc= 100MHz, Tcy=10ns * * CPU: PIC32MX370F512H * * 2.4インチ・カラーQVGA液晶モジュール(aitendo): UL024TF互換品 * * * YS電子工作:斎藤氏のソースを元にモディファイ * * デバッグ年月日: 2017/9/26 N.Ishii *********************************************************************/ #include #include "colorlcd_libPIC32MXVH.h" #include #include "imagedata.h" /// 外部クロック 100MHzで動作、周辺クロック:システムクロック = 1:1(外部X'tal Oscillator= 10MHz) // DEVCFG3 #pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority Select (SRS Priority 7) #pragma config PMDL1WAY = OFF // Peripheral Module Disable Configuration (Allow multiple reconfigurations) #pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration (Allow multiple reconfigurations) // DEVCFG2 #pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) #pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) #pragma config FPLLODIV = DIV_1 // System PLL Output Clock Divider (PLL Divide by 1) // DEVCFG1 #pragma config FNOSC = PRIPLL // Oscillator Selection Bits (External X'tal Osc with PLL) #pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disabled) #pragma config IESO = OFF // Internal/External Switch Over (Disabled) #pragma config POSCMOD = XT // Primary Oscillator Configuration (XT osc mode) #pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) #pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) #pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) #pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) #pragma config FWDTWINSZ = WISZ_25 // Watchdog Timer Window Size (Window Size is 25%) // DEVCFG0 #pragma config DEBUG = OFF // Background Debugger Enable (Debugger is Disabled) #pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled) #pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) #pragma config PWP = OFF // Program Flash Write Protect (Disable) #pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) #pragma config CP = OFF // Code Protect (Protection Disabled) #define HOLD_LED LATDbits.LATD3 #define READY_LED LATGbits.LATG8 char Buf[17]; //文字列のバッファー用レジスタ char str_Hellow[] = "Hellow"; char str_World[] = "World !!"; char str_Tokyo[] = "Tokyo"; char str_Japan[] = "Japan"; char str_Chiyodaku[] = "Chiyodaku"; char str_Sotokanda[] = "Sotokanda"; char str_Akihabara[] = "Akihabara"; char str_AKB48[] = "AKB48"; long int T0 = 5000; int SW; ////--------------------------------------------------------------------------------------------------------- /********************************************* * 2次元立体グラフ描画関数 * z(x,y) = 1/(1+SQRT(x2+y2))*COS(SQRT(x2+y2)) * (-3*PI< x,y < 3*PIの範囲) * zの最大値をPOTで変更する * 追加:130517→ 後閑氏作成PIC24F用関数を、PIC32MX用に移植 *            と言っても殆ど同じだが・・・ **********************************************/ /* グローバル定数 */ #define X0 5 #define Y0 20 #define PI 3.141592654f #define NODES 38 #define SIDE 6 // 描画関数 void D2Graph(short Hight) { short i, j, px, py,x, y, z; float zf, xf, yf, sf; struct{ short x; short y; } edge[NODES], prev; Glcd_Line(X0, 3, X0, ENDPAGE-12 ,GREEN); // z axis Glcd_Line(X0-3, Y0, ENDCOL, Y0, GREEN); // x axis Glcd_Line(X0, Y0-2, X0+140, Y0+140, GREEN); // y axis for(j=0; j> 2; // DSW読込み switch(SW){ case 0: ///文字列描画 Glcd_Str(0,0,str_Hellow,BLACK,WHITE); Glcd_Str(1,1,str_World,RED,WHITE); Glcd_Str(2,2,str_Japan,BLUE,WHITE); Glcd_Str(3,3,str_Tokyo,WHITE,BLACK); Glcd_Str(4,4,str_Chiyodaku,RED,BLACK); Glcd_Str(5,5,str_Sotokanda,GREEN,BLACK); Glcd_Str(6,6,str_Akihabara,RED,YELLOW); Glcd_Str(7,7,str_AKB48,GREEN,YELLOW); delay_ms(T0); // 5秒待ち Glcd_Clear(BLACK); // クリア break; case 1: /// ASCII文字の描画 for(j=0; j<17; j++){ // ASCII文字全表示: 26文字/行 * 17文字/列=442キャラクタ for(i=0; i<26; i++){ index = j*26+i+0x20; // スペースコードから開始し、1行26文字で繰返し if (j<4) Glcd_Char(i, j, index, WHITE, BLACK); // 文字表示制御 if ((j>3) && (j<8)) Glcd_Char(i, j, index, GREEN, BLACK); if ((j>7) && (j<12))Glcd_Char(i, j, index, RED, BLACK); if ((j>11) && (j<17))Glcd_Char(i, j, index, YELLOW, BLACK); } } delay_ms(T0); // 5秒待ち Glcd_Clear(BLACK); // クリア break; case 2: /// 画面全体描画(16ビットカラー各色で順次全体描画) Glcd_Clear(WHITE); delay_ms(1000); Glcd_Clear(BLACK); delay_ms(1000); Glcd_Clear(RED); delay_ms(1000); Glcd_Clear(GREEN); delay_ms(1000); Glcd_Clear(BLUE); delay_ms(1000); Glcd_Clear(CYAN); delay_ms(1000); Glcd_Clear(MAGENTA); delay_ms(1000); Glcd_Clear(YELLOW); delay_ms(1000); Glcd_Clear(BROWN); delay_ms(1000); Glcd_Clear(ORANGE); delay_ms(1000); Glcd_Clear(PERPLE); delay_ms(1000); Glcd_Clear(COBALT); delay_ms(1000); delay_ms(T0); // 5秒待ち break; case 3: /// 斜め直線描画 Glcd_Clear(WHITE); // クリア for(i=0; i<240; i++){ // 斜め直線の表示: 白ベタ背景・黒線表示 Glcd_Pixel(i,i,BLACK); Glcd_Pixel(240+i, i,BLACK); } delay_ms(T0); // 5秒待ち Glcd_Clear(BLACK); // クリア for(i=0; i<240; i++){ // 斜め直線: 黒ベタ背景・白線表示 Glcd_Pixel(i,i,WHITE); Glcd_Pixel(240+i, i,WHITE); } delay_ms(T0); // 5秒待ち Glcd_Clear(BLACK); // クリア break; case 4: /// 直線描画テスト i = 0; for(j=0; j<120; j+=10){ // ボックス表示 Glcd_Line(j,j, 319-j, j,YELLOW); // 次第に小さなボックスへ Glcd_Line(j,j, j, 239 -j,YELLOW); Glcd_Line(319-j,239-j, 319-j,j,YELLOW); Glcd_Line(319-j,239-j, j,239-j,YELLOW); delay_ms(500); } delay_ms(T0); Glcd_Clear(BLACK); // クリア break; case 5: /// 円の描画 for(i = 0; i < 10; i++){ Glcd_Circle(320/2 + 5*i,240/2,240/2,GREEN); } delay_ms(T0); Glcd_Clear(BLACK); // クリア break; case 6: /// 曲線描画(2次元グラフ表示) for(i=0; i<8; i++){ // 曲線描画 Glcd_Clear(BLACK); Glcd_Str(0, 0, "Graphic Display", BLUE, BLACK); D2Graph(20*i); //曲面グラフ表示 delay_ms(2000); } delay_ms(T0); Glcd_Clear(BLACK); // クリア break; case 7: /// イメージグラフィック表示 Glcd_Image(0, Header1, MAGENTA, BLACK); Glcd_Image(8, Header2, CYAN, BLACK); Glcd_Image(16, My_PIC_Scope, GREEN, BLACK); delay_ms(T0); Glcd_Clear(BLACK); // クリア break; default: /// LEDブリンク READY_LED = 0; delay_ms(1000); READY_LED = 1; delay_ms(1000); break; } } int main(void) { // Data Memory SRAM wait states: Default Setting = 1; set it to 0 BMXCONbits.BMXWSDRM = 0; // SRAMのウェイトステートを0にする // Flash PM Wait States: MX Flash runs at 3 wait states @ 100 MHz CHECONbits.PFMWS = 3; // フラッシュのプリフェッチを3ウェイトステートに対応(100MHz動作時) // Prefetch-cache: Enable prefetch for cacheable PFM instructions CHECONbits.PREFEN = 1; //プリフェッチキャッシュ有効 __builtin_mtc0(16, 0, (__builtin_mfc0(16, 0) & 0xfffffff8 | 3)); // キャッシュ有効化 /// I/O設定→ 簡易6CHロジアナ実験回路と同じ設定にしておく。(最終目的:PIC32MX370Fでの、ロジアナ実験) // AN*ピンと共用ピンになっているピンを、全てデジタル・ピンに設定(デフォルト=アナログ・ピン設定なので注意) ANSELB = 0x0000; // RB0-15として使用 ANSELD = 0x0000; // RD1-3として使用 ANSELE = 0x0000; // RE2,RE4-7として使用 ANSELG = 0x0000; // RG6-9として使用 TRISB = 0xFFFF; // RB1:TRG_SLOPE_SW, RB2:HOLD_SW入力, RB3:DSW-1入力、RB4:DSW-2入力、RB5:DSW-4入力、他未使用ピンも入力設定 TRISD = 0xFF07; // LCD_RS,CS,WR,RESET:全て出力・HOLD_LED:出力・SW2-5:入力、他未使用ピンは入力設定 TRISE = 0x0000; // LCDデータバス(DB0-DB7)オール出力 TRISF = 0xFFFF; // RF0-5:CH1-6入力(5Vトレラント・ピン) TRISG = 0xFEFF; // RG6:TRIG_MODE_SW, RG7:READY_SW入力, RG8:READY_LED出力 HOLD_LED = 1; // HOLD_LED消灯 READY_LED = 1; // READY_LED消灯 // 内部プルアップ設定 CNPUBSET = 0x003F; // DSW-8,DSW-4.DSW-2,DSW-1,SLP_SW,HLD_SW CNPUGSET = 0x00C0; // RDY_SW,TRG_MODE // 液晶表示器の初期化 Glcd_Init(); Glcd_Clear(BLACK); while(1){ DisplayFunc(); } }