回答編集履歴
2
dig1〜dig4を負論理に
answer
CHANGED
@@ -106,13 +106,13 @@
|
|
106
106
|
- if (mysw == 1) でスイッチが押されたか判定できる
|
107
107
|
- スイッチは1個、押すたび カウントアップ→停止(表示)→リセット・・・状態を繰り返す
|
108
108
|
- スイッチのチャタリング対策、というか、押しっぱなしに見えないように、delayカウンタ値が少ない期間はスイッチを見ないようにする(要調整)
|
109
|
-
- 各ポートは正論理なのだろう
|
109
|
+
- --各ポートは正論理なのだろう~~dig1〜dig4は負論理だった!
|
110
110
|
|
111
111
|
```C
|
112
112
|
// ダイナミック点灯。ひと桁表示を更新
|
113
113
|
void out7segled(int num, int digit)
|
114
114
|
{
|
115
|
-
dig1 = dig2 = dig3 = dig4 =
|
115
|
+
dig1 = dig2 = dig3 = dig4 = 1; // いったん全桁消灯(負論理)
|
116
116
|
|
117
117
|
switch (num) { // 数字パターンを出力
|
118
118
|
case 0: a=1; b=1; c=1; d=1; e=1; f=1; g=0; break;
|
@@ -121,20 +121,21 @@
|
|
121
121
|
// (途中省略)
|
122
122
|
}
|
123
123
|
|
124
|
-
switch (digit) { // どの桁を点灯するか
|
124
|
+
switch (digit) { // どの桁を点灯するか(負論理)
|
125
|
-
case 0: dig1 =
|
125
|
+
case 0: dig1 = 0; break;
|
126
|
-
case 1: dig2 =
|
126
|
+
case 1: dig2 = 0; break;
|
127
|
-
case 2: dig3 =
|
127
|
+
case 2: dig3 = 0; break;
|
128
|
-
case 3: dig4 =
|
128
|
+
case 3: dig4 = 0; break;
|
129
129
|
}
|
130
130
|
}
|
131
131
|
|
132
132
|
// 10msec毎に呼ばれ、タイマを10msec加算、
|
133
133
|
void countup(int time[])
|
134
134
|
{
|
135
|
-
if (++time[3] < 10) //
|
135
|
+
if (++time[3] < 10) // ++cs, means "plus 10msec."
|
136
136
|
return;
|
137
137
|
time[3] = 0; // cs = 0(桁上がり)
|
138
|
+
if (++time[2] < 10) // ++ds, means "plus 100msec."
|
138
139
|
// (以下省略)
|
139
140
|
}
|
140
141
|
|
1
参考コードを追記
answer
CHANGED
@@ -95,4 +95,93 @@
|
|
95
95
|
- 最後にストップウォッチ全体として完成させる
|
96
96
|
|
97
97
|
ことになります。何かすると一発でストップウォッチが動く、なんてことはありませんから。
|
98
|
-
Enjoy!
|
98
|
+
Enjoy!
|
99
|
+
|
100
|
+
----
|
101
|
+
|
102
|
+
長々書いたけど、マイコンの一般論ということで orz
|
103
|
+
罪滅ぼしに、次のような前提で、即席のストップウォッチを書いてみました。何の検証もしていませんが、ご参考まで。
|
104
|
+
- wait(0.005); で 5msec.時間待ちする
|
105
|
+
- dig1 = 1; のように、表示桁を指定できる
|
106
|
+
- if (mysw == 1) でスイッチが押されたか判定できる
|
107
|
+
- スイッチは1個、押すたび カウントアップ→停止(表示)→リセット・・・状態を繰り返す
|
108
|
+
- スイッチのチャタリング対策、というか、押しっぱなしに見えないように、delayカウンタ値が少ない期間はスイッチを見ないようにする(要調整)
|
109
|
+
- 各ポートは正論理なのだろう
|
110
|
+
|
111
|
+
```C
|
112
|
+
// ダイナミック点灯。ひと桁表示を更新
|
113
|
+
void out7segled(int num, int digit)
|
114
|
+
{
|
115
|
+
dig1 = dig2 = dig3 = dig4 = 0; // いったん全桁消灯
|
116
|
+
|
117
|
+
switch (num) { // 数字パターンを出力
|
118
|
+
case 0: a=1; b=1; c=1; d=1; e=1; f=1; g=0; break;
|
119
|
+
case 1: a=0; b=1; c=1; d=0; e=0; f=0; g=0; break;
|
120
|
+
case 2: a=1; b=1; c=0; d=1; e=1; f=0; g=1; break;
|
121
|
+
// (途中省略)
|
122
|
+
}
|
123
|
+
|
124
|
+
switch (digit) { // どの桁を点灯するか
|
125
|
+
case 0: dig1 = 1; break;
|
126
|
+
case 1: dig2 = 1; break;
|
127
|
+
case 2: dig3 = 1; break;
|
128
|
+
case 3: dig4 = 1; break;
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
// 10msec毎に呼ばれ、タイマを10msec加算、
|
133
|
+
void countup(int time[])
|
134
|
+
{
|
135
|
+
if (++time[3] < 10) // cs++, means "plus 10msec."
|
136
|
+
return;
|
137
|
+
time[3] = 0; // cs = 0(桁上がり)
|
138
|
+
// (以下省略)
|
139
|
+
}
|
140
|
+
|
141
|
+
int main()
|
142
|
+
{
|
143
|
+
int time[4]; // = { m, s, ds, cs }
|
144
|
+
int status = 0; // 0: reset, 1: count up, 2: stop
|
145
|
+
int digit = 0; // time[] の添字
|
146
|
+
int toggle = 0; // 2回に一回 時計を 10msec.進める
|
147
|
+
int delay = 0; // 遅延カウンタ、スイッチを押した直後はスイッチを見ない
|
148
|
+
#define NDELAY 10 // スイッチを見ない期間(チャタリング対策みたいな)要調整
|
149
|
+
while (1) {
|
150
|
+
wait (0.005); // 5msec.周期で繰り返す
|
151
|
+
|
152
|
+
// 今は reset, count up, stop の、どの状態?
|
153
|
+
switch (status) {
|
154
|
+
case 0: // リセット状態
|
155
|
+
time[0] = time[1] = time[2] = time[3] = 0;
|
156
|
+
if (++delay > NDELAY && mysw == 1) {
|
157
|
+
toggle = 0; // 5msecカウンタをクリアして
|
158
|
+
status = 1; // カウントアップ動作へ
|
159
|
+
delay = 0; // スイッチ見ない期間開始
|
160
|
+
}
|
161
|
+
break;
|
162
|
+
|
163
|
+
case 1: // カウントアップ状態
|
164
|
+
if (toggle == 1)
|
165
|
+
countup(time); // time += 10msec. (2回に1回)
|
166
|
+
toggle ^= 1; // 0, 1, 0, 1, 0 ...
|
167
|
+
|
168
|
+
if (++delay > NDELAY && mysw == 1) { // スイッチが押されたら
|
169
|
+
status = 2; // 停止へ。時間を表示したまま
|
170
|
+
delay = 0; // 再びスイッチ見ない期間開始
|
171
|
+
}
|
172
|
+
break;
|
173
|
+
|
174
|
+
case 2: // 停止。時間を表示したまま
|
175
|
+
if (++delay > NDELAY && mysw == 1) {
|
176
|
+
status = 0; // リセットへ戻る
|
177
|
+
delay = 0; // みたびスイッチ見ない期間開始
|
178
|
+
}
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
|
182
|
+
// 5msec.毎に必ず次の桁を表示する、ダイナミック点灯
|
183
|
+
out7segled(time[digit], digit);
|
184
|
+
digit = (digit + 1) & 3; // 0, 1, 2, 3, 0 ...
|
185
|
+
}
|
186
|
+
}
|
187
|
+
```
|