/******************************************************************************** * GLCD_TEST: 超小型SPI制御 128x64dot モノクロ液晶の表示テスト *       (AQM1248A "aitendo"使用) * プロジェクト名: dsPIC33F_AQM1248A_TEST_2 * * WAV Player V2のハードで、表示テストを実行する。 * * MPU: dsPIC33FJ64GP802 * * オリジナル・ソース:サイト名:「はじめての PIC」岩本さん(PIC1814K50使用) * ソース変更: 2015/11/10 N.Ishii *         フォントテーブルは自分用に置換えました。 * オリジナルは、全96文字(記号・小文字は幅狭文字対応)、 * それを、以前から常用している、特殊キャラクタ含む全192文字(全て標準サイズ)に変更しました。 **********************************************************************************/ #include "p33FJ64GP802.h" #include "AQM1248A_Lib.h" //// コンフィギュレーション設定 80MHz _FOSCSEL(FNOSC_FRCPLL & IESO_OFF); // Oscillator Mode (Internal Fast RC (FRC) w/ PLL) // Internal External Switch Over Mode (Start-up device with user-selected oscillator source) _FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_ON & POSCMD_NONE); // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled) // Peripheral Pin Select Configuration (Allow Multiple Re-configurations) // OSC2 Pin Function (OSC2 pin has digital I/O function) // Primary Oscillator Source (Primary Oscillator Disabled) _FWDT(WDTPOST_PS32768 & WDTPRE_PR128 & WINDIS_OFF & FWDTEN_OFF); // Watchdog Timer Postscaler (1:32,768) // WDT Prescaler (1:128) // Watchdog Timer Window (Watchdog Timer in Non-Window mode) // Watchdog Timer Enable (Watchdog timer enabled/disabled by user software) _FPOR(ALTI2C_OFF & FPWRT_PWR64); // Alternate I2C pins (I2C mapped to SDA1/SCL1 pins) // POR Timer Value (64ms) _FICD(JTAGEN_OFF & ICS_PGD2); // JTAG Port Enable (JTAG is Disabled) // Comm Channel Select (Communicate on PGC2/EMUC2 and PGD1/EMUD1) _FBS(BWRP_WRPROTECT_OFF & BSS_NO_FLASH & RBS_NO_RAM) // Boot Segment Write Protect (Boot Segment may be written) // Boot Segment Program Flash Code Protection (No Boot program Flash segment) // Boot Segment RAM Protection (No Boot RAM) _FSS(SWRP_WRPROTECT_OFF & SSS_NO_FLASH & RSS_NO_RAM) // Secure Segment Program Write Protect (Secure segment may be written) // Secure Segment Program Flash Code Protection (No Secure Segment) // Secure Segment Data RAM Protection (No Secure RAM) _FGS(GWRP_OFF & GSS_OFF) // General Code Segment Write Protect (User program memory is not write-protected) // General Segment Code Protection (User program memory is not code-protected) void main(void){ unsigned char i,ypos,xpos; /// クロックの設定 7.37MHz*4=32MHz CLKDIVbits.PLLPRE = 0; // 7.37MHz /2=3.685(内蔵クロック使用 追記) PLLFBDbits.PLLDIV = 42; // 3.685MHz * 44 = 162MHz CLKDIVbits.PLLPOST = 0; // 162MHz / 2 = 81MHz -> 40.5MIPS(約40MIPS) /// Initialize Port AD1PCFGL = 0xFFFF; // すべてデジタルにセット TRISA = 0x001C; // RA0(SPI_CS),1,4 is Out, Other is Input TRISB = 0xFCD4; // RB9:SPI_SDI, RB8:SPI_SCK, RB5:SPI_CS is Out) /// スイッチ関連設 CNPU2bits.CN24PUE = 1; // RB6 Pullup CNPU2bits.CN23PUE = 1; // RB7 Pullup LATAbits.LATA1 = 0; // Green LED OFF /// SPI信号のイニシャル・レベル設定 N.Ishii SPI_CS = 1; SPI_SCK = 1; SPI_SDI = 1; /// 補助クロック初期化 ACLKCONbits.SELACLK = 1; // Select SOSC 11MHz ACLKCONbits.AOSCMD = 1; // HS mode ACLKCONbits.APSTSCLR = 7; // 1/1 ACLKCONbits.ASRCSEL = 0; // Select SOSC /// <オーディオDACの初期化> /// DMAなしでのオーディオDAC動作の設定になっている /// FIFOがフルでない時(FIFOが空いた時)は、必ず両方のチャンネルの割込みが発生するように設定している /// デフォルトで挿入するデータを、0x0000として、割込み発生時にデータが何もない時には自動的に無音状態になるように設定されている DAC1CONbits.FORM = 1; // signed int DAC1CONbits.DACFDIV = 0; // No divide:補助オシレータ周波数設定= 25.6MHz(DACCLKレート= Fs x 256= 44.1k x 256= 25.6MHz) DAC1STATbits.LOEN = 1; // Left Out Enable DAC1STATbits.LITYPE = 0; // Interrupt not ful DAC1STATbits.ROEN = 1; // Right Out Enable DAC1STATbits.RITYPE = 1; // Interrupt not full DAC1DFLT = 0; // default out DAC1LDAT = 0; // out off DAC1RDAT = 0; // out off DAC1CONbits.DACEN = 1; // DAC Enable:両チャンネルのDAC割込みが発生 IFS4bits.DAC1LIF = 0; // Left Flag Clear:LCH割込みフラグクリア IFS4bits.DAC1RIF = 0; // Right Flag Clear:RCH割込みフラグクリア LCD_int (); // Grafic LCD 初期設定 ypos = 0; xpos = 10; // 文字表示位置 xpos = LCD_ROMstr3x("ABC",ypos,xpos); // 3倍文字列表示 ypos = 1; xpos = LCD_ROMstr2x("ABC",ypos,xpos); // 2倍文字列表示 ypos = 2; xpos = LCD_ROMstr1x("ABC",ypos,xpos); // 通常文字列表示 LCD_posyx (4,20); // 文字表示位置 LCD_dat('S'); // 通常文字表示 LCD_ROMstr("PI LCD AQM1248A"); // 通常文字列表示 LCD_posyx (5,0); // 下段枠表示位置 for(i=0; i<128 ; i+=2) { // コラムデータを順に取得 LCD_ram(0b11101000); // 下段枠文様 LCD_ram(0b11010000); } Delay_ms(5000); //--------------------------------------------------------------------------------------------- //// 追加1:WAV Player V2 タイトル・デモ LCD_clr (); // 表示クリア ypos = 0; xpos = 0; // 文字表示位置 LCD_ROMstr3x("WAV",ypos,xpos); // 3倍文字列表示 ypos = 3; xpos = 0; LCD_ROMstr3x("PLAYER2",ypos,xpos); // 3倍文字列表示 Delay_ms(5000); //--------------------------------------------------------------------------------------------- //// 追加2:WAV Player V2 リスト表示・デモ1: 通常サイズ表示 LCD_clr (); // 表示クリア LCD_posyx (0,0); LCD_dat(0x8C); // Black Circle // LCD_dat(' '); // スペース LCD_posyx (0,12); // x=3キャラ目(横3キャラ目より表示: 1キャラ幅5dot+1dot自動スペースで1文字構成=6dot幅 // になるので、3キャラ目のx座標(dot単位)指定= (3-1)*6= 12 になる。) LCD_ROMstr("HANAFUDE.WAV"); LCD_posyx (1,12); LCD_ROMstr("AI_KOWAR.WAV"); LCD_posyx (2,12); LCD_ROMstr("KONO_MUNE.WAV"); LCD_posyx (3,12); LCD_ROMstr("NAOM_JP.WAV"); LCD_posyx (4,12); LCD_ROMstr("BURNINGL.WAV"); LCD_posyx (5,12); LCD_ROMstr("RAIN_JUN.WAV"); LCD_posyx (0,108); // x=19キャラ目((19-1)*6=108) LCD_ROMstr("Tot"); LCD_posyx (1,108); LCD_ROMstr("256"); LCD_posyx (4,108); LCD_ROMstr("Num"); LCD_posyx (5,108); LCD_ROMstr("010"); Delay_ms(5000); //--------------------------------------------------------------------------------------------- //// 追加3:WAV Player V2 リスト表示・デモ2: 2倍サイズ表示 151103 LCD_clr (); // 表示クリア ypos = 0; xpos = 0; LCD_ROMstr2x("> ",ypos,xpos); xpos = 24; LCD_ROMstr2x("HANAFUDE",ypos,xpos); ypos = 2; LCD_ROMstr2x("AI_KOWAR",ypos,xpos); ypos = 4; LCD_ROMstr2x("KONO_MUN",ypos,xpos); Delay_ms(5000); //--------------------------------------------------------------------------------------------- //// 追加4: 全キャラクタ表示(192文字) LCD_clr (); // 表示クリア /// 1画面目: 126文字表示 ypos= 0; LCD_posyx (ypos,0); for(i=0; i<126; i++) { if((i>20) && (i%21==0)){ ypos++; LCD_posyx (ypos,0); } LCD_dat(i+0x20); } Delay_ms(5000); /// 2画面目: 残り66文字表示 LCD_clr (); ypos= 0; LCD_posyx (ypos,0); for(i=0; i<66; i++) { if((i>20) && (i%21==0)){ ypos++; LCD_posyx (ypos,0); } LCD_dat(i+0x9E); } while(1); }