2013-01-10 2 views
0

기본 주사위 시뮬레이터 프로그램 용 코드를 작성하려고합니다. 스위치를 누르면 두 개의 7 세그먼트 디스플레이가 1-6 사이에서 빠르게 변경됩니다. 버튼을 놓으면 두 개의 7 세그먼트 디스플레이에 난수가 표시됩니다.C 프로그래밍이 포함 된 주사위 시뮬레이터

이 코드는 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

무엇이 당신의 질문입니까? – hmatar

+0

@HassanTM은 for (;;)가 작동합니까? 또는 (for 1;) **? ** –

+0

예 ((;;)를 써야합니다. 그것은 어쨌든 ISIS MPLAB입니다. – user1966947

답변

0

나를 조금 이상 내 의견을 명확히하자

첫째, 당신은 rand()를 호출 할 필요가 없습니다. 사용자는 일정한 간격 (10 또는 20 나노초의 정밀도로 버튼을 누르면 마이크로 컨트롤러의 적절한 시계)입니다. 이 간격과 정확도는 rand()을 호출하는 것보다 더 무작위 일 것입니다. 따라서 하나의 카운터 (최대 256 개)를 보유하고이 카운터에서 두 개의 임의의 숫자를 가져올 수 있습니다.

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 세그먼트 디스플레이로 패턴을 작성하는 방법을 말할 수

은 명심하십시오, 그러나 나는 어떤 종류의 함수가있을 것이라고 생각 .

+0

16 개의 요소에 대해 모듈로 6을 사용하고 있기 때문에 생성 된 난수의 편차에 대한 몇 가지 인수가있을 수 있습니다. 즉, 한주기 동안 결과 숫자 중 일부가 다른 숫자보다 자주 표시되지만, 이것이 난수의 품질에 영향을 주는지 확실하지 않습니다. – nvlass

+0

rand()의 구현이 시간 기반 비트 바이올린을 사용하지 않는다는 것을 어떻게 알 수 있습니까? 또는 다른 '더'무작위 알고리즘. – Adrian

+0

@Adrian 당신이 옳을 수도 있고, 실제로 stdlib 구현을 보지 않고도 알 수는 없습니다. "추진력"에서 LCG 정도를 추측했습니다. 실제로, [여기] (http://ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf)를보고 올바른 MPLAB을 가지고 있다고 가정하면 Pseudo-RNG가 언급됩니다 (이것은 또한 디버깅 중에 반복 가능한 결과를 허용하기 때문에 stdlib 구현). – nvlass

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; 
} 

합니다. .. 및 rolldisplay. 그게 시작 됐어?