// PIC16F819 Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin) #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) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include #define _XTAL_FREQ 1000000 // 1MHz #define TIMER_COUNT 99 #define CLK PORTAbits.RA2 #define DAT PORTAbits.RA3 #define WAIT_HIGH while(CLK == 0); #define WAIT_LOW while(CLK == 1); // LEDの点灯パターン int pattern[] = { 0b01000000, // 0 0b01111001, // 1 0b00100100, // 2 0b00110000, // 3 0b00011001, // 4 0b00010010, // 5 0b00000010, // 6 0b01011000, // 7 0b00000000, // 8 0b00010000, // 9 0b00001000, // A 0b00000011, // B 0b01000110, // C 0b00100001, // D 0b00000110, // E 0b00001110, // F 0b01111111 // 消灯 }; static volatile int ldigit = 0, rdigit = 0, select = 0; unsigned char num; // 割り込みエントリ void __interrupt() isr(void) { if (INTCONbits.TMR0IF) // TMR0 { if(select) { PORTAbits.RA1 = 1; // 7セグメント右オフ PORTB = pattern[ldigit]; PORTAbits.RA0 = 0; // 7セグメント左オン select = 0; } else { PORTAbits.RA0 = 1; // 7セグメント左オフ PORTB = pattern[rdigit]; PORTAbits.RA1 = 0; // 7セグメント右オン select = 1; } INTCONbits.TMR0IF = 0; // 割り込みフラグクリア TMR0 = TIMER_COUNT; // タイマ再設定 } } unsigned char getByte() { unsigned char val; val = 0; WAIT_HIGH for(int n = 0; n < 8; n++) { WAIT_LOW val |= DAT << n; WAIT_HIGH } return val; } void main(void) { OSCCON = 0b01000000; // 周波数1MHz CCP1CON = 0b00000000; // CCP1モジュール無効(リセット) ADCON0 = 0b00000000; // ADコンバータモジュールOFF ADCON1 = 0b00000110; // Vref使わない RA2/RA3はデジタルI/O SSPCON = 0b00000000; // SPI/I2C無効 対象ピンはデジタルI/O TRISA = 0b00001100; // RA0/RA1 トランジスタ2SC1815 RA2/RA3 通信 PORTA = 0b00000011; // トランジスタ電流カット TRISB = 0b00000000; // 全て出力 PORTB = 0b01111111; // 7セグメント消灯 // タイマー0設定 インターバル時間10msにする // クロック周期 1MHz×4 = 1μs×4 = 4μs // タイマーカウント数 = インターバル時間÷クロック周期 = 10000÷4 = 2500 // プリスケーラ16にする 2500÷16 = 156.25 ≒ 156カウント(TIMER_COUNT = 255-156) OPTION_REGbits.T0CS = 0; // TMR0クロックソースは内部クロック OPTION_REGbits.PSA = 0; // プリスケーラをTMR0へ割り当て OPTION_REGbits.PS = 0b011; // プリスケーラ16 TMR0 = TIMER_COUNT; INTCONbits.TMR0IE = 1; // TMR0割り込みを許可 INTCONbits.GIE = 1; // すべての割り込み許可 __delay_ms(100); // AVR起動時の信号ノイズを避ける while(1) { if(CLK == 0) //スタートビット { num = getByte(); ldigit = num / 10; rdigit = num % 10; } } return; }