回答編集履歴
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 
     | 
    
         
            +
            ```
         
     |