回答編集履歴

2

dig1〜dig4を負論理に

2020/01/29 14:10

投稿

rubato6809
rubato6809

スコア1380

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 = 0; // いったん全桁消灯
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 = 1; break;
249
+ case 0: dig1 = 0; break;
250
-
250
+
251
- case 1: dig2 = 1; break;
251
+ case 1: dig2 = 0; break;
252
-
252
+
253
- case 2: dig3 = 1; break;
253
+ case 2: dig3 = 0; break;
254
-
254
+
255
- case 3: dig4 = 1; break;
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++, means "plus 10msec."
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

参考コードを追記

2020/01/29 14:10

投稿

rubato6809
rubato6809

スコア1380

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
+ ```