//----------------------------------------------------------------------------- // Note // 3桁の7セグメントの点灯 // PICの周波数を32Mhzに設定 //----------------------------------------------------------------------------- #include #include #include // コンフィグレーションBIT1 設定 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // コンフィグレーションBIT2 設定 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #define _XTAL_FREQ 32000000 // オシレータ周波数 32Mhzの場合 // 点灯IOの定義 #define SEG_LED_A RA2 #define SEG_LED_B RA0 #define SEG_LED_C RC3 #define SEG_LED_D RC7 #define SEG_LED_E RB7 #define SEG_LED_F RA1 #define SEG_LED_G RC4 #define SEG_LED_DP RC6 #define SEG_DEGI_1 RA5 #define SEG_DEGI_2 RA4 #define SEG_DEGI_3 RC5 // 点灯位置の設定 const unsigned char seg_led[18] = { {0b00111111}, // 0 {0b00000110}, // 1 {0b01011011}, // 2 {0b01001111}, // 3 {0b01100110}, // 4 {0b01101101}, // 5 {0b01111101}, // 6 {0b00100111}, // 7 {0b01111111}, // 8 {0b01101111}, // 9 {0b00000001}, // a {0b00000010}, // b {0b00000100}, // c {0b00001000}, // d {0b00010000}, // e {0b00100000}, // f {0b01000000}, // g {0b10000000} // dp }; const unsigned short out_num[12] = { 111, 222, 333, 444, 555, 666, 777, 888, 999, 123, 456, 789 }; void out_7seg(short,short); int main(int argc, char** argv) { short num = 10; short seg = 0; short digi = 999; short wait = 1000; short i; short work; short out[3]; OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00001000 ; // ピンは全て出力に割当てる(RA3は入力のみとなる) PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) ANSELB = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISB = 0b00000000 ; // ピンは全て出力に割当てる PORTB = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) ANSELC = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISC = 0b00000000 ; // ピンは全て出力に割当てる PORTC = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) // 初期出力 7セグメント OFF SEG_DEGI_1 = 1; SEG_DEGI_2 = 1; SEG_DEGI_3 = 1; for(;;) { for(;;) { seg = seg_led[num]; out_7seg(seg, digi); // 1桁の待ち時間設定 for(i=0; i17 ) { break; } } digi = 0; wait = 900; for(;;) { work = wait; out[2] = work % 10;// 1桁目 work /= 10; out[1] = work % 10;// 2桁目 work /= 10; out[0] = work;// 3桁目 num = out[digi]; seg = seg_led[num]; out_7seg(seg, digi); // 1桁の待ち時間設定 for(i=0; i2) { digi = 0; if( wait > 200) wait -= 50; else if( wait > 50 ) wait -= 5; else wait -= 1; if( wait < 5 ) wait = 5; } } } return (EXIT_SUCCESS); } void out_7seg(short seg, short digi) { // a点灯 if( (seg & 0x01) != 0 ) SEG_LED_A = 0; else SEG_LED_A = 1; // b点灯 if( (seg & 0x02) != 0 ) SEG_LED_B = 0; else SEG_LED_B = 1; // c点灯 if( (seg & 0x04) != 0 ) SEG_LED_C = 0; else SEG_LED_C = 1; // d点灯 if( (seg & 0x08) != 0 ) SEG_LED_D = 0; else SEG_LED_D = 1; // e点灯 if( (seg & 0x10) != 0 ) SEG_LED_E = 0; else SEG_LED_E = 1; // f点灯 if( (seg & 0x20) != 0 ) SEG_LED_F = 0; else SEG_LED_F = 1; // g点灯 if( (seg & 0x40) != 0 ) SEG_LED_G = 0; else SEG_LED_G = 1; // DP点灯 if( (seg & 0x80) != 0 ) SEG_LED_DP = 0; else SEG_LED_DP = 1; // 表示桁指定 if( (digi == 0) || (digi == 999) ) SEG_DEGI_1 = 0; else SEG_DEGI_1 = 1; if( (digi == 1) || (digi == 999) ) SEG_DEGI_2 = 0; else SEG_DEGI_2 = 1; if( (digi == 2) || (digi == 999) ) SEG_DEGI_3 = 0; else SEG_DEGI_3 = 1; }