// 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 MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3/PGM pin has digital I/O function, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off) #pragma config CCPMX = RB2 // CCP1 Pin Selection bit (CCP1 function on RB2) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off #include #define _XTAL_FREQ 20000000 // 20MHz #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); // 7 セグメント 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.TMR0IF) // TMR0 { if(sel) { RA1 = 0; PORTB = pattern[rseg]; RA0 = 1; } else { RA1 = 1; PORTB = pattern[lseg]; RA0 = 0; } sel = sel ? 0 : 1; INTCONbits.TMR0IF = 0; // 割り込みフラグクリア TMR0 = TIMER_COUNT; // タイマ設定 } } void main(void) { OPTION_REGbits.nRBPU = 0; // PORTBを内部プルアップ ADCON0 = 0b00000000; // ADコンバータOFF ADCON1 = 0b00000110; // RA2 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.TMR0IE = 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; }