#define true 1
sbit High at PORTC.B5;
sbit Middle at PORTC.B4;
sbit Low at PORTC.B3;
sbit SuperLow at PORTC.B6;
char mode=0;
void mode0();
void mode1();
void mode2();
void mode3();
void interrupt(){
if(++mode==4) mode = 0;
PORTA &= 0xf8;
switch(mode){
case 0: PORTA.B0 = 1; break;
case 1: PORTA.B1 = 1; break;
case 2: PORTA.B2 = 1; break;
case 3: PORTA.B0 = 1; PORTA.B2 = 1;break;
}
do{
Delay_ms(10);
} while(PORTA.B3==0);
Delay_ms(100);
PORTA &= 0xf8;
INTCON.RABIF = 0; // RA割り込みOK
}
void main() {
PORTC = 0xff;
TRISA = 0x00; // PORTAを出力にする
TRISB = 0xff; // PORTBを入力にする
TRISC = 0x00; // PORTCを出力にする
ANSEL = 0x00; // アナログ入力をOFF
ANSELH = 0x00; // アナログ入力をOFF
IOCA.B3=1;
INTCON.RABIF=0;
INTCON.RABIE=1;
INTCON.GIE=1;
PORTA = 1;
Delay_ms(100);
mode=0;
PORTA = 0;
while(true)
{
switch(mode){
case 0: mode0(); break;
case 1: mode1(); break;
case 2: mode2(); break;
case 3: mode3(); break;
}
}
}
void mode0()
{
int i;
while(true)
{
if(mode!=0) break;
for(i=0; i<8; i++)
{
High = 1;
Delay_us(12);
High = 0;
Delay_us(9);
}
for(i=0; i<4; i++)
{
Middle = 1;
Delay_us(12);
Middle = 0;
Delay_us(9);
}
for(i=0; i<4; i++)
{
Low = 1;
Delay_us(12);
Low = 0;
Delay_us(9);
}
for(i=0; i<4; i++)
{
SuperLow = 1;
Delay_us(12);
SuperLow = 0;
Delay_us(9);
}
Delay_us(346);
}
}
void mode1()
{
High = 1;
while(true) if(mode!=1) break;
}
void mode2()
{
int i;
while(true)
{
if(mode!=2) break;
for(i=0; i<33; i++)
{
High = 1;
Delay_us(12);
High = 0;
Delay_us(9);
}
Delay_us(833);
}
}
void mode3()
{
int i;
while(true)
{
if(mode!=3) break;
for(i=0; i<17; i++)
{
High = 1;
Delay_us(12);
High = 0;
Delay_us(9);
}
Delay_us(417);
}
}
|
1
2 Mode-Aの時の出力設定
3 振幅が100%の場合
4 振幅が25%の場合
5 振幅が6.25%の場合
6 振幅が1.54%の場合
7
8 モードのカウンタ
9 Mode-A
10 Mode-B
11 Mode-C
12 Mode-D
13
14 割り込みルーチン
15 タクトスイッチが押されると割り込まれる
16 カラーLED消灯
17 新しいモードによりカラーLEDを点灯させる
18 緑
19 青
20 赤
21 黄
22
23 チャタリング防止
24
25
26 LED点灯時間
27 カラーLED消灯
28
29
30
31
32
33
34
35
36
37
38
39 ポートAのbit3が変化したら割り込む設定
40 割り込みフラグクリア
41 ポートAからの割り込み許可
42 CPUへの割り込み許可
43 緑を点灯させる
44
45 モードを0(MODE-A)に設定する
46 LED消灯
47 タクトスイッチが押されてモードが終わったら
48 それに応じで作業内容を変える
49
50
51
52
53
54
55
56
57
58 MODE-Aの信号を作る
59 40kHz信号の周期の半分は12.5μsと半端であり、
60 実測してその通りにはなるわけがないので、
61 調整してこの値になっている。
62
63 タクトスイッチが押されてモードが変わったので終了する
64 振幅100%の部分
65
66
67
68
69
70
71 振幅が25%の部分
72
73
74
75
76
77
78 振幅が6.25%の部分
79
80
81
82
83
84
85 振幅が1.54%の部分
86
87
88
89
90
91
92
93
94
95
96 MODE-B
97
98 100%のみ定常発光
99 タクトスイッチが押されてモードが変わったので終了する
100
101
102 MODE-C
103
104
105
106
107 タクトスイッチが押されてモードが変わったので終了する
108 833μsの間振幅100%で40kHzを出力する
109
110
111
112
113
114
115 833μsの間出力停止
116
117
118
119
120 MODE-D
121
122
123
124 タクトスイッチが押されてモードが変わったので終了する
125 416μsの間振幅100%で40kHzを出力する
126
127
128
129
130
131
132 417μsの間出力停止
133
134
|