/******************************************************************** * プロジェクト名: LCD_TX1094A_TEST_2 * PIC32MXトレーニング基板使用 * * <動作仕様> * aitendoの、6角外形の風変わりなセグメント液晶の簡易テスト2 * STEP2: * 中央の7セグに、'0'〜'9'までを、約1秒毎に表示させる。 * ℃"セグメントは"℃"は固定表示でよい。 * 簡易的に、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/19 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 unsigned char seg_data[] = { // Data Table 7Segment 0x77, 0x12, 0x5d, 0x5B, 0x3A, 0x6b, 0x6f, 0x52, 0x7f, 0x7B // [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] }; char count= 0; char number= 0; // 他の定義 #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 // プロトタイプ宣言 #define Fosc 80 // ループ遅延用クロック周波数 void delay_us(unsigned int usec); void delay_ms(unsigned int msec); /************************************************************************** * 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ならば以下を実行 ++count; SEVEN_SEG_PORT= seg_data[number] | 0x80; // count=1〜30まで同じデータをSEGに出力(最初は、'0'表示) if (count == 31) { // 32mS x (31-1) = 960mS毎に、セグデータ更新('1'〜'9') count= 0; ++number; if (number < 10) SEVEN_SEG_PORT= seg_data[number] | 0x80; else number= 0; // number= 10で、0にリセット } } } 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; /// 初期7セグデータ設定 //// 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