回答編集履歴
2
dig1〜dig4を負論理に
test
CHANGED
@@ -214,7 +214,7 @@
|
|
214
214
|
|
215
215
|
- スイッチのチャタリング対策、というか、押しっぱなしに見えないように、delayカウンタ値が少ない期間はスイッチを見ないようにする(要調整)
|
216
216
|
|
217
|
-
- 各ポートは正論理なのだろう
|
217
|
+
- --各ポートは正論理なのだろう~~dig1〜dig4は負論理だった!
|
218
218
|
|
219
219
|
|
220
220
|
|
@@ -226,7 +226,7 @@
|
|
226
226
|
|
227
227
|
{
|
228
228
|
|
229
|
-
dig1 = dig2 = dig3 = dig4 =
|
229
|
+
dig1 = dig2 = dig3 = dig4 = 1; // いったん全桁消灯(負論理)
|
230
230
|
|
231
231
|
|
232
232
|
|
@@ -244,15 +244,15 @@
|
|
244
244
|
|
245
245
|
|
246
246
|
|
247
|
-
switch (digit) { // どの桁を点灯するか
|
247
|
+
switch (digit) { // どの桁を点灯するか(負論理)
|
248
|
-
|
248
|
+
|
249
|
-
case 0: dig1 =
|
249
|
+
case 0: dig1 = 0; break;
|
250
|
-
|
250
|
+
|
251
|
-
case 1: dig2 =
|
251
|
+
case 1: dig2 = 0; break;
|
252
|
-
|
252
|
+
|
253
|
-
case 2: dig3 =
|
253
|
+
case 2: dig3 = 0; break;
|
254
|
-
|
254
|
+
|
255
|
-
case 3: dig4 =
|
255
|
+
case 3: dig4 = 0; break;
|
256
256
|
|
257
257
|
}
|
258
258
|
|
@@ -266,12 +266,14 @@
|
|
266
266
|
|
267
267
|
{
|
268
268
|
|
269
|
-
if (++time[3] < 10) // cs
|
269
|
+
if (++time[3] < 10) // ++cs, means "plus 10msec."
|
270
270
|
|
271
271
|
return;
|
272
272
|
|
273
273
|
time[3] = 0; // cs = 0(桁上がり)
|
274
274
|
|
275
|
+
if (++time[2] < 10) // ++ds, means "plus 100msec."
|
276
|
+
|
275
277
|
// (以下省略)
|
276
278
|
|
277
279
|
}
|
1
参考コードを追記
test
CHANGED
@@ -193,3 +193,181 @@
|
|
193
193
|
ことになります。何かすると一発でストップウォッチが動く、なんてことはありませんから。
|
194
194
|
|
195
195
|
Enjoy!
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
----
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
長々書いたけど、マイコンの一般論ということで orz
|
204
|
+
|
205
|
+
罪滅ぼしに、次のような前提で、即席のストップウォッチを書いてみました。何の検証もしていませんが、ご参考まで。
|
206
|
+
|
207
|
+
- wait(0.005); で 5msec.時間待ちする
|
208
|
+
|
209
|
+
- dig1 = 1; のように、表示桁を指定できる
|
210
|
+
|
211
|
+
- if (mysw == 1) でスイッチが押されたか判定できる
|
212
|
+
|
213
|
+
- スイッチは1個、押すたび カウントアップ→停止(表示)→リセット・・・状態を繰り返す
|
214
|
+
|
215
|
+
- スイッチのチャタリング対策、というか、押しっぱなしに見えないように、delayカウンタ値が少ない期間はスイッチを見ないようにする(要調整)
|
216
|
+
|
217
|
+
- 各ポートは正論理なのだろう
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
```C
|
222
|
+
|
223
|
+
// ダイナミック点灯。ひと桁表示を更新
|
224
|
+
|
225
|
+
void out7segled(int num, int digit)
|
226
|
+
|
227
|
+
{
|
228
|
+
|
229
|
+
dig1 = dig2 = dig3 = dig4 = 0; // いったん全桁消灯
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
switch (num) { // 数字パターンを出力
|
234
|
+
|
235
|
+
case 0: a=1; b=1; c=1; d=1; e=1; f=1; g=0; break;
|
236
|
+
|
237
|
+
case 1: a=0; b=1; c=1; d=0; e=0; f=0; g=0; break;
|
238
|
+
|
239
|
+
case 2: a=1; b=1; c=0; d=1; e=1; f=0; g=1; break;
|
240
|
+
|
241
|
+
// (途中省略)
|
242
|
+
|
243
|
+
}
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
switch (digit) { // どの桁を点灯するか
|
248
|
+
|
249
|
+
case 0: dig1 = 1; break;
|
250
|
+
|
251
|
+
case 1: dig2 = 1; break;
|
252
|
+
|
253
|
+
case 2: dig3 = 1; break;
|
254
|
+
|
255
|
+
case 3: dig4 = 1; break;
|
256
|
+
|
257
|
+
}
|
258
|
+
|
259
|
+
}
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
// 10msec毎に呼ばれ、タイマを10msec加算、
|
264
|
+
|
265
|
+
void countup(int time[])
|
266
|
+
|
267
|
+
{
|
268
|
+
|
269
|
+
if (++time[3] < 10) // cs++, means "plus 10msec."
|
270
|
+
|
271
|
+
return;
|
272
|
+
|
273
|
+
time[3] = 0; // cs = 0(桁上がり)
|
274
|
+
|
275
|
+
// (以下省略)
|
276
|
+
|
277
|
+
}
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
int main()
|
282
|
+
|
283
|
+
{
|
284
|
+
|
285
|
+
int time[4]; // = { m, s, ds, cs }
|
286
|
+
|
287
|
+
int status = 0; // 0: reset, 1: count up, 2: stop
|
288
|
+
|
289
|
+
int digit = 0; // time[] の添字
|
290
|
+
|
291
|
+
int toggle = 0; // 2回に一回 時計を 10msec.進める
|
292
|
+
|
293
|
+
int delay = 0; // 遅延カウンタ、スイッチを押した直後はスイッチを見ない
|
294
|
+
|
295
|
+
#define NDELAY 10 // スイッチを見ない期間(チャタリング対策みたいな)要調整
|
296
|
+
|
297
|
+
while (1) {
|
298
|
+
|
299
|
+
wait (0.005); // 5msec.周期で繰り返す
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
// 今は reset, count up, stop の、どの状態?
|
304
|
+
|
305
|
+
switch (status) {
|
306
|
+
|
307
|
+
case 0: // リセット状態
|
308
|
+
|
309
|
+
time[0] = time[1] = time[2] = time[3] = 0;
|
310
|
+
|
311
|
+
if (++delay > NDELAY && mysw == 1) {
|
312
|
+
|
313
|
+
toggle = 0; // 5msecカウンタをクリアして
|
314
|
+
|
315
|
+
status = 1; // カウントアップ動作へ
|
316
|
+
|
317
|
+
delay = 0; // スイッチ見ない期間開始
|
318
|
+
|
319
|
+
}
|
320
|
+
|
321
|
+
break;
|
322
|
+
|
323
|
+
|
324
|
+
|
325
|
+
case 1: // カウントアップ状態
|
326
|
+
|
327
|
+
if (toggle == 1)
|
328
|
+
|
329
|
+
countup(time); // time += 10msec. (2回に1回)
|
330
|
+
|
331
|
+
toggle ^= 1; // 0, 1, 0, 1, 0 ...
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
if (++delay > NDELAY && mysw == 1) { // スイッチが押されたら
|
336
|
+
|
337
|
+
status = 2; // 停止へ。時間を表示したまま
|
338
|
+
|
339
|
+
delay = 0; // 再びスイッチ見ない期間開始
|
340
|
+
|
341
|
+
}
|
342
|
+
|
343
|
+
break;
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
case 2: // 停止。時間を表示したまま
|
348
|
+
|
349
|
+
if (++delay > NDELAY && mysw == 1) {
|
350
|
+
|
351
|
+
status = 0; // リセットへ戻る
|
352
|
+
|
353
|
+
delay = 0; // みたびスイッチ見ない期間開始
|
354
|
+
|
355
|
+
}
|
356
|
+
|
357
|
+
break;
|
358
|
+
|
359
|
+
}
|
360
|
+
|
361
|
+
|
362
|
+
|
363
|
+
// 5msec.毎に必ず次の桁を表示する、ダイナミック点灯
|
364
|
+
|
365
|
+
out7segled(time[digit], digit);
|
366
|
+
|
367
|
+
digit = (digit + 1) & 3; // 0, 1, 2, 3, 0 ...
|
368
|
+
|
369
|
+
}
|
370
|
+
|
371
|
+
}
|
372
|
+
|
373
|
+
```
|