/********************************************************************** * HexDispModuleTest: * シリパラ変換+7SEGドライバ内蔵IC:74LV8153 2個と、 * 7SEG LED 2個を使った、デバッグ用16進表示モジュールのテストを行う。 * * PIC24Fトレーニング基板使用 * * 原典参考先: * @ トラ技 2007年8月号 山口晶大さんの記事(dsPIC30F2012使用) *   第6章 アプリケイションの製作にTRY! *      「I/O機能を使った表示モジュールの製作」 * * Condition: * 8MHz Internal RC oscillator, 4x PLL (8MHzx4= 32MHz) * Fcy=32MHz/2=16MHz, Tcy=62.5ns * * CPU: PIC24FJ64GA002 * * 2020.2.18 N.Ishii ************************************************************************/ #include /// Set Configuration Word 1 _CONFIG1 ( JTAGEN_OFF & // JTAG Port: OFF GCP_OFF & // Code Protect: OFF GWRP_OFF & // Write Protect:OFF BKBUG_OFF & // Background Debug: OFF COE_OFF & // Clip On Emulation: OFF ICS_PGx1 & // Select ICD Pin: EMUC/EMUD-> PGC1/PGD1 For Common Use FWDTEN_OFF // WDT: OFF ) /// Set Configuration Word 2 _CONFIG2 ( IESO_OFF & // 2 Speed Start Up: OFF FNOSC_FRCPLL & // 8MHz Internal RC oscillator, 4x PLL-> 8MHzx4=32MHz FCKSM_CSDCMD & // Change Clock Control: OFF Clock Monitor: OFF OSCIOFNC_ON & // OSCO/RA3 function: Used RA3 IOL1WAY_OFF & // RP Register Protection: Unlimited Writes To RP Registers I2C1SEL_PRI & // I2C1 pins Select: Use Primary I2C1 pins POSCMOD_NONE // Oscillator Selection: Primary disabled ) #define CLOCK 16 #define ResetPin LATAbits.LATA4 // '0'-'9', 'A'-'F' 7seg LED data unsigned char hex[16]= {0x77, 0x41, 0x3b, 0x6b, 0x4d, 0x6e, 0x7e, 0x43, 0x7f, 0x4f, 0x5f, 0x7c, 0x36, 0x79, 0x3e, 0x1e}; //----------------------------------------------------------------------------- /// プロトタイプ宣言 void led(unsigned char digit, unsigned char x); void led_hex(unsigned char digit, unsigned char x, unsigned char dp); void led_byte(unsigned char x); void delay_us(int usec); void delay_ms(int msec); //============================================================================= int main(void) { unsigned char i; // CPU Clock Pre Scalere 1:1 CLKDIV = 0; // Set AD1PCFG: ANx Port is All Digital Pin AD1PCFG = 0xFFFF; TRISA = 0x000F; // RA4(RST/) is Out, Other is Input /// オープンドレイン出力設定 ODCA= 0x0010; // RA4:RESET(74LV8153-RESETピンは、1kで+5Vにプルアップされている。) /// Set RX Input Port TRISBbits.TRISB3 = 1; // RB3 is RX input(未使用) /// UART1 Pin Mapping RPINR18bits.U1RXR = 3; // UART1 RX to RP3(未使用) RPOR1bits.RP2R = 3; // UART1 TX to RP2(Function No=3 -> U1TX) /// Initialize UART1: 19200bps, 8Bit, Non Parity, Non Control Flow U1BRG = 103; // 9600bps@Fcy=16MHz:Value of U1BRG= (16M/16x9600)-1 // U1BRG = 51; // 19200bps@Fcy=16MHz:Value of U1BRG= (16M/16x19200)-1 U1MODE = 0b1000100000000000; // UART1 Mode Set: UARTEN,RTSMD= '1' Other Bit= '0' U1STA = 0b0000010000000000; // UART1 Status Set:UTXEN= '1' Other Bit= '0' /// 74lv8153 riset ResetPin= 0; // SN74LV8153 reset delay_ms(1); ResetPin= 1; // SN74LV8153 release reset i= 0; /// MAIN LOOP while(1) { // forever loop i= (i+1) % 256; // count up led_byte(i); // display '00'-'FF'(変数:iの値を表示) delay_ms(500); // wait } } //============================================================================================== /****************************************************** * シリアル・データの送信 * * 引数digit:桁 *   x :データ * adrs :アドレス *******************************************************/ void led(unsigned char digit, unsigned char x) { unsigned char adrs; if (digit==0) { // if 1st digit adrs=1; } else { // 2nd digit adrs=3; } while(U1STAbits.UTXBF!=0); // wait until transmit finish U1TXREG=adrs+(x<<4); // send 1st frame data while(U1STAbits.UTXBF!=0); // wait until transmit finish U1TXREG=adrs+((x>>4)<<4); // send 2nd frame data } /********************************************************************************** * dpの有無によりデータ生成して16進データをシリアル送信 * * 引数digit:桁 * x :データ * dp :小数点有りの時、小数点ビットを16進表示データに付加してシリアル送信 *   小数点無しの時、そのまま16進表示データに付加してシリアル送信 ***********************************************************************************/ void led_hex(unsigned char digit, unsigned char x, unsigned char dp) { if (dp==0) { led(digit, hex[x]); } else { led(digit, hex[x]+0x80); } } /************************************************************** * 引数x(表示したい8bit変数)の内容を、7SEG LEDに表示 ***************************************************************/ void led_byte(unsigned char x) { // x=0-255 (0x00-0xFF) led_hex(0, x & 0x0f, 0); // 下位桁LED led_hex(1, x >> 4, 0); // 上位桁LED } /******************************* * usec単位ディレイ関数 ********************************/ void delay_us(int usec) { usec = (int)(CLOCK*usec)/ 10; while(usec) { asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); usec--; } } /********************************* * msec単位ディレイ関数 **********************************/ void delay_ms(int msec) { int i; for(i=0; i< msec; i++) delay_us(1000); }