//Timer #include #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input) #pragma config CPUDIV = OSC1_PLL2 //[Primary Oscillator Src: /1][96 MHz PLL Src: /2] #pragma config USBDIV = 2 // USB clock source comes from the 96 MHz PLL divided by 2 #pragma config FOSC = HSPLL_HS //HS oscillator, PLL enabled (HSPLL) #pragma config FCMEN = OFF //Fail-Safe Clock Monitor disabled #pragma config IESO = OFF //Fail-Safe Clock Monitor disabled #pragma config PWRT = OFF //PWRT disabled #pragma config BOR = ON //Brown-out Reset enabled in hardware only (SBOREN is disabled) #pragma config BORV = 3 //Minimum setting #pragma config VREGEN = ON //USB voltage regulator enabled #pragma config WDT = OFF //[Watchdog Timer Enable] disabled (control is placed on the SWDTEN bit) #pragma config WDTPS = 32768 //Watchdog Timer Postscale Select bits 1:32768 #pragma config MCLRE = ON //MCLR pin enabled; RE3 input pin disabled #pragma config LPT1OSC = OFF //Timer1 configured for higher power operation #pragma config PBADEN = OFF //PORTB<4:0> pins are configured as digital I/O on Reset //#pragma config CCP2MX = ON #pragma config STVREN = ON //Stack full/underflow will cause Reset #pragma config LVP = OFF //Single-Supply ICSP disabled //#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming #pragma config XINST = OFF // Extended Instruction Set #pragma config CP0 = OFF //Block 0 (000800-001FFFh) is not code-protected #pragma config CP1 = OFF //Block 1 (002000-003FFFh) is not code-protected //#pragma config CP2 = OFF //#pragma config CP3 = OFF #pragma config CPB = OFF //Boot block (000000-0007FFh) is not code-protected //#pragma config CPD = OFF #pragma config WRT0 = OFF //Block 0 (000800-001FFFh) is not write-protected #pragma config WRT1 = OFF //Block 1 (002000-003FFFh) is not write-protected //#pragma config WRT2 = OFF //#pragma config WRT3 = OFF #pragma config WRTB = OFF // Boot block (000000-0007FFh) is not write-protected #pragma config WRTC = OFF //Configuration registers (300000-3000FFh) are not write-protected //#pragma config WRTD = OFF #pragma config EBTR0 = OFF //Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks #pragma config EBTR1 = OFF //Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks //#pragma config EBTR2 = OFF //#pragma config EBTR3 = OFF #pragma config EBTRB = OFF //Boot block (000000-0007FFh) is not protected from table reads executed in other blocks #define _XTAL_FREQ 48000000 //48MHz設定__delay_ms #define SW1 PORTEbits.RE0 #define SW2 PORTEbits.RE1 #define LED PORTEbits.RE2 // プロトタイプ宣言 void InitInterCCP (void); void InitTimer1 (void); void init(void); void Mood0(void); void Mood1(void); void Mood2(void); void Mood3(void); void Mood4(void); void Mood5(void); //STime0=48MHz*0.025/(4*8)=37500=0x927C unsigned short STime0 = 0x927C; //0.025sサイクルタイム unsigned short STime1 = 2400; //60sサイクルタイム unsigned short STime1_S = 2400; //60sサイクルタイム2400=0x960 unsigned short STime1_T = 40; //短縮サイクルタイム(1日を短縮テスト用) unsigned short CTime0=0;//0.025sサイクルカウンタ unsigned short CTime1=0x021C;//60sサイクルカウンタ(9*60=540=0x021C=9:00スタート) unsigned short CyTime0=0X05A0;//サイクルカウンタ値の周期(1日=60*24=1440=0x5A0) unsigned short CyTime1=0x021C;//ONする時刻9:00=9*60=540=0x021C unsigned short CyTime2=0x04EC;//OFFする時刻21:00=21*60=1260=0x04EC unsigned short gDTN=50;//スイッチ操作のディレイ回数 unsigned char F_Auto=1;//自動タイマーモードフラグ void main(void) { init();//初期化 InitInterCCP();// CCP割込み設定関数の呼び出し InitTimer1();// タイマ1設定関数の呼び出し PEIE = 1;// 周辺機能割込みの許可 GIE = 1;// 全体の割込み許可 unsigned char MyMood0;//表示・修正モード while(1) { MyMood0=((~PORTA) >> 2) & 0b00000111;//表示・修正モード読込 //MyMood0=7;//TEST用 switch (MyMood0)//モードスイッチ { case 0: F_Auto=1; Mood0();//現在時刻カウンタ表示・修正 break; case 1: F_Auto=1; Mood1();//スイッチON時刻カウンタ表示・修正 break; case 2: F_Auto=1; Mood2(); break; case 3: F_Auto=1; Mood3(); break; case 4: F_Auto=1; Mood4(); break; case 5: F_Auto=1; Mood5(); break; case 6: PORTD=0xFF; F_Auto=0; PORTCbits.RC0 = 0;LED=0;//スイッチOFF break; case 7: PORTD=0xFF; F_Auto=0; PORTCbits.RC0 = 1;LED=1;//スイッチOFF break; default: break; } } } void Mood0(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; //MyMood1=0;//TEST用 switch (MyMood1) { case 0: Disp=CTime1; break; case 1: Disp=CTime1 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==1 && SW2==1){gDTN=20;} if(SW1==0) { CTime1++; gDTN--; if(gDTN<1){gDTN=1;} } if(SW2==0) { CTime1--; gDTN--; if(gDTN<1){gDTN=1;} } for ( int i = 0; i < gDTN; i++ ) __delay_ms( 10 ); } void Mood1(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; switch (MyMood1) { case 0: Disp=CyTime1; break; case 1: Disp=CyTime1 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==1 && SW2==1){gDTN=20;} if(SW1==0) { CyTime1++; gDTN--; if(gDTN<1){gDTN=1;} } if(SW2==0) { CyTime1--; gDTN--; if(gDTN<1){gDTN=1;} } for ( int i = 0; i < gDTN; i++ ) __delay_ms( 10 ); } void Mood2(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; switch (MyMood1) { case 0: Disp=CyTime2; break; case 1: Disp=CyTime2 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==1 && SW2==1){gDTN=20;} if(SW1==0) { CyTime2++; gDTN--; if(gDTN<1){gDTN=1;} } if(SW2==0) { CyTime2--; gDTN--; if(gDTN<1){gDTN=1;} } for ( int i = 0; i < gDTN; i++ ) __delay_ms( 10 ); } void Mood3(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; switch (MyMood1) { case 0: Disp=STime0; break; case 1: Disp=STime0 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==1 && SW2==1){gDTN=20;} if(SW1==0) { STime0++; gDTN--; if(gDTN<1){gDTN=1;} } if(SW2==0) { STime0--; gDTN--; if(gDTN<1){gDTN=1;} } for ( int i = 0; i < gDTN; i++ ) __delay_ms( 10 ); } void Mood4(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; switch (MyMood1) { case 0: Disp=CyTime0; break; case 1: Disp=CyTime0 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==1 && SW2==1){gDTN=20;} if(SW1==0) { CyTime0++; gDTN--; if(gDTN<1){gDTN=1;} } if(SW2==0) { CyTime0--; gDTN--; if(gDTN<1){gDTN=1;} } for ( int i = 0; i < gDTN; i++ ) __delay_ms( 10 ); } void Mood5(void) { unsigned char MyMood1; unsigned char Disp; MyMood1=((~PORTB) >> 2) & 0b00000111; switch (MyMood1) { case 0: Disp=STime1; break; case 1: Disp=STime1 >> 8; break; default: Disp=0; break; } PORTD = ~Disp; if(SW1==0) { STime1=STime1_S; } if(SW2==0) { STime1=STime1_T; } } void init(void) { ADCON1 = 0b00001111; //全チャンネルがデジタルに設定され、VDDとVSSが選択 TRISA = 0b00011100; //A0〜A4を入力に設定 TRISB = 0b00111100; //B0〜B7を入力に設定 TRISC = 0b00110000; //D-,D+(USB用)RC4とRC5を入力に設定 TRISD = 0b00000000; //D0〜D7を出力に設定 TRISE = 0b00000011; //SW1,2=INPUT LED=OUTPUT LATA = 0b00000000; LATB = 0b00000000; LATC = 0b00000000; LATD = 0b00000000; LATE = 0b00000000; //PORTD=0xFF;//ポートD全ビットON PORTCbits.RC0 = 1;LED=1;//スイッチON } // 割込みサービスルーチン void interrupt SYS_InterruptHigh(void) { if(CCP1IF==1)// CCP割込みの場合 { if(CTime0 > STime1) { if(CTime1 == CyTime1 && F_Auto==1){PORTCbits.RC0 = 1;LED=1;}//スイッチON if(CTime1 == CyTime2 && F_Auto==1){PORTCbits.RC0 = 0;LED=0;}//スイッチOFF if(CTime1 > CyTime0){CTime1 = 0;} CTime0=0; CTime1++; } CTime0++; // CCP割込みフラグをクリア CCP1IF = 0; } if(USBIF==1){;}//USB割込みの場合 } // CCP割込み設定関数 void InitInterCCP (void) { // CCPのモードをコンペアモード(CCP割込み + TMR1クリア)に設定 CCP1CON = 0b00001011; // CCPRレジスタの設定(周期0.1秒) CCPR1H = STime0 >> 8; CCPR1L = STime0; // CCP割込みフラグをクリア CCP1IF = 0; // CCP割込みの許可 CCP1IE = 1; } // タイマ1設定関数 void InitTimer1 (void) { // クロック源を内部クロックに設定 TMR1CS = 0; // プリスケーラ値を1/8に設定 T1CKPS1 = 1; T1CKPS0 = 1; // TMRレジスタをクリア TMR1H = 0; TMR1L = 0; // タイマ1起動 TMR1ON = 1; }