0

基本的なサイコロ シミュレータ プログラムのコードを書こうとしています。スイッチを押すと、2 つの 7 セグメント表示が 1 ~ 6 の間で急速に変化します。ボタンを離すと、2 つの 7 セグメント ディスプレイに乱数が表示されます。

このコードは ISIS の pic16F877 に接続され、C プログラミングに MPLAB を使用しています。

私はこのプログラミングに本当に慣れていないので、頭を悩ませるのは難しいです。

#include <pic.h>
const char patterns[]={0X3F, 0X06, 0X5B, 0x4F, 0X66, 0X6D, 0X7D}
char rand_num1=0;
char rand_num2=0;

void main(void)

{
     TRISB=0x00;
     TRISC=0x01;
     TRISD=0x00;

     for(;;)
            {
                if(RCO==0)
                {
                         rand_num1=rand()%6+1;
                         rand_num2=rand()%6+1;
                }

                if (RC0==1)
                  {
                         const char patterns[];
                  }
            }
}
4

2 に答える 2

0

上記のコメントを少し明確にしましょう。

まず、電話する必要はありませんrand()。ユーザーは、一定の間隔でボタンを押します (10 または 20 ナノ秒の精度で、マイクロコントローラーの妥当なクロックです)。この間隔は、精度を考えると、おそらく を呼び出すよりもランダムになりrand()ます。したがって、単一のカウンター (つまり、最大 256) を使用して、このカウンターから 2 つの乱数を取得できます。コードでは、これは次のようになります。

int counter = 0;
int lo_chunk, hi_chunk;
if(RCO == 0) { // assuming that RCO == 0 means the button is pressed
    counter = (counter + 1) % 256; // keep one byte out of the int
                                   // we'll use that byte two get 2 4-bit
                                   // chunks that we'll use as our randoms
    lo_chunk = (counter & 0xF) % 6; // keep 4 LSBits and mod them by 6
    hi_chunk = ((counter >> 4) & 0xF) % 6; // shift to get next 4 bits and mod them by 6
    // Now this part is tricky.
    // since you want to display the numbers in the 7seg display, I am assuming 
    // that you will need to write the respective patterns "somewhere"
    // (either a memory address or output pins). You'll need to check the
    // documentation of your board on this. I'll just outline them as 
    // "existing functions"
    write_first_7segment(patterns[lo_chunk]);
    write_second_7segment(patterns[hi_chunk]);

 } else if(RCO == 1) { // assuming that this means "key released" 
     rand_num1 = lo_chunk;
     rand_num2 = hi_chunk;
     // probably you'll also need to display the numbers.
 }

上記のコメントに書いたことが、今ではもっと理にかなっていることを願っています。

ボードの正確な詳細がわからないため、実際に 7 セグ ディスプレイにパターンを書き込む方法はわかりませんが、何らかの機能があると思います。

于 2013-01-10T14:56:04.827 に答える
0

これを細かく分解することから始めて、個別に対処しましょう。とにかくこれは良い習慣であり、個別に解決するのが簡単な多くの小さな問題が発生するはずです.

メインループの疑似コードから始めることができます:

for ever {
    while button is pushed {
        roll the dice
        update the displays
    }
    /* this ^ loop ends when the button is released
        and is never entered until the button is pushed
    */
}

これは次のように変換されます。

int main(void)
{
    /* somewhere to keep the current value of each die,
       initialized to zero */
    char dice[2] = {0,0};
    for (;;) {
        while (button_pushed()) {
            roll(dice);
            display(dice);
        }
    }
}

したがって、次のように書く必要がありますbutton_pushed

/* return true (non-zero) if RC0 is zero/one (delete as appropriate) */
int button_pushed(void)
{
    return RC0 == 0;
}

...そしてroll、そしてdisplay。それで始められますか?

于 2013-01-10T15:17:49.023 に答える