/******************************************************************** * プロジェクト名: LCD_TX1094A_TEST_1 * PIC32MXトレーニング基板使用 * * <動作仕様> * aitendoの、6角外形の風変わりなセグメント液晶の簡易テスト * STEP1: * 中央の7セグと"℃"セグメントを使って"3℃"と固定表示させる。 * 簡易的に、COM1のみで、COM0,COM2〜COM6は未接続にしてあるので、目的のセグメント以外も * 点灯してしまうが、それは今回は無視する。(動作原理を実験によって理解するのが目的) * * <実験の目的・目標> * コントローラを持たないので、PICのみで制御することを目標にする。 * COMとSEGピンに、約32Hzの矩形波を加えて、タイミングを取りながら * スキャンさせる方法を実験により確認する。 * * セグメント液晶: aitendo_TX1094A-02 * * 参考サイト等: * トラ技2008年1月号「PICでLCDパネルを直接駆動」投稿:庄野和宏さん * * Condition: * 8MHz External X'tal Oscillator, 20x PLL (8MHzx20= 160MHz) * Fcy=160MHz/2=80MHz, Tcy=12.5ns * * CPU: PIC32MX340F256H * * デバッグ年月日: 2020/12/17 N.Ishii *********************************************************************/ #include // PIC32 peripheral library // コンフィギュレーション設定 // 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 Fosc 80 // ループ遅延用クロック周波数 void delay_us(unsigned int usec); void delay_ms(unsigned int msec); // 他の定義 #define LED LATFbits.LATF0 // 今回はデバッグ要LEDとして使う。本来は、COM0で使用 #define COM1 PORTFbits.RF1 // COM1は書込みと読込み両方必要なので、PORTに定義 #define SEVEN_SEG_PORT LATE // ℃"セグを含めた7セグポート全体8bit /// SEG1:RE0:7セグ 2b /// SEG2:RE1:7セグ 2c /// SEG3:RE2:7セグ 2d /// SEG4:RE3:7セグ 2e /// SEG5:RE4:7セグ 2f /// SEG6:RE5:7セグ 2g /// SEG7:RE6:7セグ 2h /// SEG0:RE7:℃"セグ 2a /************************************************************************** * T1割込み処理 * T1割込み周期= 16mS(62.5Hz) * セグメント・データ更新周期= 32mS(31.25Hz) ***************************************************************************/ void __ISR(4, IPL2) T1Handler(void) { mT1ClearIntFlag(); // 割込みフラグクリア //// 交流ドライブ /// イニシャルレベルは共に、Hi /// 割込みの頭で、COM1・7SEG_PORTのデータを反転する。 COM1 ^= 1; SEVEN_SEG_PORT ^= 0xFF; /// セグメント・データ更新処理(今回は固定表示) if (!COM1) { // COM1が Loならば以下を実行 SEVEN_SEG_PORT= 0b11011011; // 0xDB→ "3℃"を表示 } } int main(void) { /* システム最適設定 */ SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 /* I/O初期設定 */ AD1PCFG = 0xFFFF; // デジタルに TRISE = 0x0000; // 全て出力:RE0〜 RE6:SEG1〜 SEG7(7セグに対応), RE7= SEG0 "℃" TRISF = 0x0030; // RF0〜 RF3出力:COM0〜 COM3(今回はCOM1のみ使用し、RF0にデバッグLEDを接続), // RF4,5入力(SW未使用)※ RFポート=全6bit TRISC = 0xF000; // OSC,SOSC TRISD = 0x0F00; // RD11〜RD8入力:SW(未使用),他ビット出力未使用 ※ RDポート=全12bit TRISB = 0x00C1; // RB0入力未使用(AN0), RB4,5入力:PICkit2, 他bitは出力未使用(SC1602液晶・NCピン) ※ RBポート=全16bit TRISG = 0x0000; // 今回は全BIT未使用で出力にセット(RG2,3:EEPROM, RG6,7,8:SD, RG9=NC) ※ RGポート=全6bit /// LED・LCDポートレベル初期化 // LED= 0; // 何故かここでLoにすると次の、com1=1;を実行した時に、RF0がHiで点灯してしまうので、LATE = 0xFF;の後に移動  COM1= 1; LATE = 0xFF; LED= 0; //// T1タイマ初期設定 /// 12.5nS x 256 x 分周定数= 16mS(62.5Hz)とすれば /// 0.000025mS x 256 x 分周定数:PR= 16mS  但し256は、プリスケーラ:PS値 /// ∴ PR= 16/0.000025 x 256= 2500 → PR-1の値をマクロ関数の引数にセット OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, 2499); //// T1割込み設定 /// T1割込み許可 ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2); /// マルチベクタ割込み設定 割込み許可 INTEnableSystemMultiVectoredInt(); //// メインループ while(1); } /********************************** * ループ遅延関数 usec単位 **********************************/ void delay_us(unsigned int usec) { unsigned int i, Max; Max = usec * 640/Fosc; for(i=0; i