// 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 BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include #define _XTAL_FREQ 20000000 // 20MHz #define CLK PORTAbits.RA0 #define DAT PORTAbits.RA1 #define WAIT 20 void sendChar(char); void sendStr(char*); unsigned char OP[5] = {0b11110100, 0b11101100, 0b11011100, 0b10111100, 0b01111100}; const char keyMap[5][5] = { { 0, 1, 2, 3, 4}, { 5, 6, 7, 8, 9}, {10, 11, 12, 13, 14}, {15, 99, 16, 17, 18}, {19, 99, 20, 21, 22} }; const char keyName[][4] = { "1", "ROT", "2", "3", "0", "4", ".", "5", "6", "MRC", "M+", "+/-", "/", "*", "=", "M-", "CE", "+", "%", "8", "9", "-", "7" }; unsigned char keyStat[5][5]; unsigned char keyStatExt; // "ON/C" unsigned char keyin; static int count = 0; void main(void) { ADCON0 = 0b00000000; // ADコンバータOFF ADCON1 = 0b00000110; // 全てデジタル RA2 RA3 Vref使わない CMCON = 0b00000111; // コンパレータOFF CCP1CON = 0b00000000; // CCP1オフ 設定しなくても問題ないかも CCP2CON = 0b00000000; // CCP2オフ 動作に関係ないけど念の為 TRISA = 0b00000000; // 全て出力 TRISB = 0b00011111; TRISC = 0b11111100; PORTA = 0b00000001; PORTB = 0b00011111; PORTC = 0b00000000; OPTION_REGbits.nRBPU = 0; // PORTBを内部プルアップ //キー状態初期化 for(int i=0; i<5; i++) for(int j=0; j<5; j++) keyStat[i][j] = 1; keyStatExt = 1; __delay_ms(300); while(1) { for(int i=0; i<5; i++) { TRISC = OP[i]; __delay_ms(1); // 回路の安定を待つ for(int j=0; j<5; j++) { keyin = PORTB; keyin = (keyin >> j) & 1; if(keyin != keyStat[i][j]) { if(keyin) { sendStr("~"); sendStr(keyName[keyMap[i][j]]); } else sendStr(keyName[keyMap[i][j]]); keyStat[i][j] = keyin; } } } TRISC = 0b11111000; __delay_ms(1); // 回路の安定を待つ keyin = PORTB; keyin = (keyin >> 3) & 1; if(keyin != keyStatExt) { if(keyin) { sendStr("~"); sendStr("ON/C"); } else sendStr("ON/C"); keyStatExt = keyin; } } } void sendChar(char chr) { for(int n = 0; n < 8; n++) { DAT = (chr >> n) & 1; __delay_ms(WAIT); CLK = 0; __delay_ms(WAIT); CLK = 1; } } void sendStr(char* str) { char* p; p = str; while(*p != 0) { sendChar(*(p++)); if(++count > 15) { sendChar(0x80); //カーソルを先頭へ count = 0; } } }