// CONFIG #pragma config FOSC = HS // Oscillator selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config CP = OFF // Code Protection bits (Code protection off) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include #define _XTAL_FREQ 20000000 #define TIMER_COUNT 55 // 255-200 #define CLK RB0 #define DAT RA2 #define WAIT_HIGH while(CLK == 0); #define WAIT_LOW while(CLK == 1); char getByte(void); // LEDの点灯パターン int pattern[] = { 0b10000000, // 0 0b11110010, // 1 0b01001000, // 2 0b01100000, // 3 0b00110010, // 4 0b00100100, // 5 0b00000100, // 6 0b10110000, // 7 0b00000000, // 8 0b00100000, // 9 0b00010000, // A 0b00000110, // B 0b10001100, // C 0b01000010, // D 0b00001100, // E 0b00011100, // F }; static int no; static volatile int lseg = 0, rseg = 0, sel = 0; unsigned char byte; // 割り込みエントリ void __interrupt() isr(void) { if (INTCONbits.T0IF) // TMR0 { if(sel) { RA1 = 0; PORTB = pattern[rseg]; RA0 = 1; } else { RA1 = 1; PORTB = pattern[lseg]; RA0 = 0; } sel = sel ? 0 : 1; INTCONbits.T0IF = 0; // 割り込みフラグクリア TMR0 = TIMER_COUNT; // タイマ設定 } } void main(void) { OPTION_REGbits.nRBPU = 0; // PORTBを内部プルアップ ADCON0 = 0b00000000; // ADコンバータOFF ADCON1 = 0b00000110; // RA3 Vref使わない TRISA = 0b00000100; // RA2 入力 TRISB = 0b00000001; // RB0 入力 PORTA = 0b00000000; // 全てLOWにする PORTB = 0b00000000; // 全てLOWにする OPTION_REGbits.T0CS = 0; // TMR0クロックソースは内部クロック OPTION_REGbits.PSA = 0; // プリスケーラをTMR0へ割り当て OPTION_REGbits.PS = 0b111; // プリスケーラ256 // 20MHz->0.2μs×256×200(TIMER_COUNT)=10.24ms no = 0; TMR0 = TIMER_COUNT; INTCONbits.T0IE = 1; // TMR0割り込みを許可 INTCONbits.GIE = 1; // すべての割り込み許可 __delay_ms(100); while (1) { if(CLK == 0) //スタートビット { byte = getByte(); //10進数表示 /* lseg = byte / 10; rseg = byte % 10; */ //16進数表示 lseg = byte >> 4; rseg = byte & 0xf; } } return; } char getByte() { unsigned char val, bi; val = 0; WAIT_HIGH for(int n = 0; n < 8; n++) { WAIT_LOW bi = DAT; val |= bi << n; WAIT_HIGH } return val; }