
| 記号 | 品名 | 単価 | 個数 | 小計 | 購入先 |
| ファン | DC軸流ファン 60mm角15mm厚 DC12V (送料+¥600) | 210 | 10 | 2100 | アマゾン |
| 12V | 12V5A 汎用 ACアダプター | 1350 | 1 | 1350 | アマゾン |
| 3.3V | 低損失CMOS三端子レギュレータ 3.3V150mA XC6202P332TB 2個入 | 50 | 1 | 50 | 秋月電子通商 |
| PIC18F4553 | PICマイコンPIC18F4553−I/P | 430 | 1 | 430 | 秋月電子通商 |
| - | ICソケット (40P) (10個入) | 30 | 1 | 30 | 秋月電子通商 |
| 2SD1590 | ダーリントン・トランジスタ 2SD1590(150V8A) | 50 | 1 | 50 | 秋月電子通商 |
| M | DIPロータリー・スイッチ(8ステップ)青 | 50 | 2 | 100 | 秋月電子通商 |
| SW | タクトスイッチ(黒色) | 10 | 3 | 30 | 秋月電子通商 |
| LED | 赤色LED 3mm OSDR3133A 500mcd 30度100個入 | 3.5 | 9 | 31.5 | 秋月電子通商 |
| 20MHz | クリスタル(水晶発振子) 20MHz(10個入) | 40 | 1 | 40 | 秋月電子通商 |
| 15pF | 積層セラミックコンデンサー15pF100V±5% | 10 | 2 | 20 | 秋月電子通商 |
| 330Ω | カーボン抵抗(炭素皮膜抵抗) 1/4W330Ω (100本入) | 1 | 1 | 1 | 秋月電子通商 |
| 1kΩ | カーボン抵抗(炭素皮膜抵抗) 1/4W1kΩ (100本入) | 1 | 10 | 10 | 秋月電子通商 |
| 10kΩ | カーボン抵抗(炭素皮膜抵抗) 1/4W10kΩ (100本入) | 1 | 9 | 9 | 秋月電子通商 |
| - | 片面ガラス・ユニバーサル基板 Bタイプ めっき仕上げ (95x72mm) | 120 | 1 | 120 | 秋月電子通商 |
| - | アクリルケース SK−16 | 130 | 1 | 130 | 秋月電子通商 |

//Timer
#include <xc.h>
#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;
}
以下はソースプログラムのテキストファイルです。