teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

dig1〜dig4を負論理に

2020/01/29 14:10

投稿

rubato6809
rubato6809

スコア1382

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 = 0; // いったん全桁消灯
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 = 1; break;
125
+ case 0: dig1 = 0; break;
126
- case 1: dig2 = 1; break;
126
+ case 1: dig2 = 0; break;
127
- case 2: dig3 = 1; break;
127
+ case 2: dig3 = 0; break;
128
- case 3: dig4 = 1; break;
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) // cs++, means "plus 10msec."
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

参考コードを追記

2020/01/29 14:10

投稿

rubato6809
rubato6809

スコア1382

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