#include #include #define MHz 000000 #define _XTAL_FREQ 8MHz __CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF ); __CONFIG( WRT_OFF & PLLEN_OFF & STVREN_ON & LVP_OFF & BORV_LO ); static void I2C_start(); //static void I2C_restart(); static void I2C_send(unsigned char); //static unsigned char I2C_ackchk(); //static void I2C_acksnd(); static void I2C_nacksnd(); static unsigned char I2C_rcv(); static void I2C_snd_char(unsigned char addr1 ,unsigned char send_data); static unsigned char I2C_rcv_char(unsigned char addr1); static void I2C_stop(); typedef union { struct { unsigned :2;//I2C SCL/SDA unsigned decode :4;//文字出力 }; } LATCled_t; extern volatile LATCled_t LEDdec @ 0x10E; typedef union { struct { unsigned digit :3;//桁出力 unsigned :3; }; } LATAled_t; extern volatile LATAled_t LEDdig @ 0x10C; typedef union { struct { unsigned :3; unsigned sw1 :3;//HC148使用switch入力 }; } PORTAsw_t; extern volatile PORTAsw_t Asw @ 0x00C; #define EE_dev_addr 0xd0 //I2Cデバイスのアドレス // ==================== I2C Start ============================= static void I2C_start() { SEN = 1; while (SEN) {} return; } // ==================== I2C Start Repeat ====================== /* static void I2C_restart() { SSP1IF = 0; RSEN = 1; while (RSEN) {} return; } */ // ==================== I2C Stop ============================== static void I2C_stop() { SSP1IF = 0; PEN = 1; while (PEN) {} SSP1IF = 0; return; } // ==================== I2C Send ============================== static void I2C_send(unsigned char send_data) { SSP1IF = 0; SSPBUF = send_data; while (!SSP1IF) {} return; } // ==================== I2C Recive ============================ static unsigned char I2C_rcv() { SSP1IF = 0; RCEN = 1; while (RCEN) {} return(SSPBUF); } // ==================== I2C Send char ========================== static void I2C_snd_char(unsigned char addr1 ,unsigned char send_data) { I2C_start(); I2C_send(EE_dev_addr); // スレーブアドレス & Write I2C_send(addr1); // 書き込みアドレス1 I2C_send(send_data); // 書き込み I2C_stop(); return; } // ==================== I2C Recive char ======================== static unsigned char I2C_rcv_char(unsigned char addr1) { unsigned char c; I2C_start(); I2C_send(EE_dev_addr); // スレーブアドレス & Write I2C_send(addr1); // 読み出しアドレス1 __delay_us(5); I2C_start(); I2C_send(EE_dev_addr | 0x01); // スレーブアドレス & Read c = I2C_rcv(); I2C_nacksnd(); I2C_stop(); return(c); } // ==================== I2C ACK check ========================= /* static unsigned char I2C_ackchk() { unsigned char i2c_data; if (ACKSTAT) { i2c_data = 0xFF; } else { i2c_data = 0x00; } return(i2c_data); } */ // ==================== I2C ACK send ========================== /* static void I2C_acksnd() { ACKDT = 0; ACKEN = 1; while (ACKEN) {} return; } */ // ==================== I2C NACK send ========================= static void I2C_nacksnd() { ACKDT = 1; ACKEN = 1; while (ACKEN) {} return; } char i=0; int led[6]={0,0,0,0,0,0}; static void interrupt intr(void) { T0IF = 0; // TMR0割り込みクリア LEDdec.decode=0x0f; LEDdig.digit=i; LEDdec.decode=led[i]; i++; if(i>5){i=0;} } void main(void){ char j,k,f=0,g=0,n,h,m,s,yt=0; unsigned char c,sec,min,hour; // Port initalize // 76543210 PORTA = 0b00000000; //Port Initalize PORTC = 0b00000000; //Port Initalize TRISA = 0b00111000; // TRISC = 0b00000011; //RC0/SCL:input, RC1/SDA:input 他output ANSELA = 0x00; //All port are use for digital port ANSELC = 0x00; //All port are use for digital port CM1CON0 = 0x07; //PORTA is all digital I/O // RXDTSEL = 0; //RA1 pin assignment as RXD OSCCON = 0b01110010; // PLL off,8MHz,IntOSC SSP1CON1 = 0x28; // SSP enable & I2C Master mode, clock = FOSC / (4 * (SSPADD+1)) SSP1ADD = 0x03; // 0x02だと動作しない //Init OPTION_REG = 0b00000011; // prescale 1/16 TMR0 = 0x00; T0IE = 1; // 1:TMR0タイマの割込み許可 GIE = 1; // 1:割り込み全体許可 sec = I2C_rcv_char(0x00); // read sec &= 0x7f; I2C_snd_char(0x00 ,sec); // write //LOOP while(1){ if(yt==0){ sec = I2C_rcv_char(0x00); // read min = I2C_rcv_char(0x01); // read hour = I2C_rcv_char(0x02); // read }else{ sec = I2C_rcv_char(0x04); // read min = I2C_rcv_char(0x05); // read hour = I2C_rcv_char(0x06); // read } led[0]=sec&0x0f; led[1]=sec>>4; led[2]=min&0x0f; led[3]=min>>4; led[4]=hour&0x0f; led[5]=hour>>4; n=7-Asw.sw1; if(n==0){ g=0; //キー処理終了 }else{ if(g==0 && f==n){ g=1;//キー処理開始 s=(sec&0x0f)+(sec>>4)*10; m=(min&0x0f)+(min>>4)*10; h=(hour&0x0f)+(hour>>4)*10; if(yt==0){ switch(n){ case 1: h++; if(h>23){h=0;} break; case 2: m++; if(m>59){m=0;} break; case 3: s++; if(s>59){s=0;} break; case 4: yt=1-yt; break; case 5: if(h==0){h=24;} h--; break; case 6: if(m==0){m=60;} m--; break; case 7: if(s==0){s=60;} s--; break; } if(n==3||n==7){ I2C_snd_char(0x00 ,(s/10)*0x10+(s%10)); } if(n==2||n==6){ I2C_snd_char(0x01 ,(m/10)*0x10+(m%10)); } if(n==1||n==5){ I2C_snd_char(0x02 ,(h/10)*0x10+(h%10)); } }else{ switch(n){ case 1: h++; if(h>99){h=0;} break; case 2: m++; if(m>12){m=1;} break; case 3: s++; if(s>31){s=1;} break; case 4: yt=1-yt; break; case 5: if(h==0){h=100;} h--; break; case 6: if(m==1){m=13;} m--; break; case 7: if(s==1){s=32;} s--; break; } if(n==3||n==7){ I2C_snd_char(0x04 ,(s/10)*0x10+(s%10)); } if(n==2||n==6){ I2C_snd_char(0x05 ,(m/10)*0x10+(m%10)); } if(n==1||n==5){ I2C_snd_char(0x06 ,(h/10)*0x10+(h%10)); } } } } f=n; __delay_ms(10); } }