SINAL BAIXO LIGA / ALTO DESLIGA//Funcao de controle do SHIFT REGISTER 74LS164 - Pinos(MSP) P2.0(ENTRADA A),P2.1(CLOCK),P2.2(RESET)//Estabelece a situacao ligado/desligado de cada LED da linha//O primeiro valor e definido para QA, no sinal de Clock esse valor e transferido para QB e assim por diante ate chegar em QH//Serao deslocados 8 valores e entao a linha sera energizada}//______________________________________________________________________________void apaga(void)//Funcao de clock do shift register{ P2OUT |= 0x01; //DATA = 1(DESLIGA) P2OUT |= 0x02; //CLOCK ALTO P2OUT &= ~0x02; //CLOCK BAIXO}//______________________________________________________________________________void desligalinhas(void){ //P1=1111b P1OUT |= 0x0F; //Para desligar todas as colunas basta apontar o DEMUX para a saida 15 nao conectada ao circuito//linhas//Funcao de controle do DEMUX 74154 - Pinos(MSP) P1.0(LSB),1,2,3(MSB)//Seleciona uma saida de 1 a 15 (usadas apenas as 8 primeiras saidas), a saida escolhida recebe sinal baixo, todas as demais sinal alto//Foram utilizados transistores PNP ja que a saida do DEMUX e sinal baixo//Usado para acionamento das linhas da Matriz 8x8}void linha1(void){ P1OUT &= 0xF0; //P1=0000b} void linha2(void){ P1OUT = ((P1OUT&0xF0)|0x01); //P1=0001b //P1OUT e zerado com o comando AND e depois setado com OR}void linha3(void){ P1OUT = ((P1OUT&0xF0)|0x02); //P1=0010b} void linha4(void){ P1OUT = ((P1OUT&0xF0)|0x03); //P1=0011b} void linha5(void){ P1OUT = ((P1OUT&0xF0)|0x04); //P1=0100b}void linha6(void){ P1OUT = ((P1OUT&0xF0)|0x05); //P1=0101b}void linha7(void){ P1OUT = ((P1OUT&0xF0)|0x06); //P1=0110b}void linha8(void){ P1OUT = ((P1OUT&0xF0)|0x07); //P1=0111b}void game_over(void){ desligalinhas(); for (i=0;i<4 br="" i=""> { P1OUT |= 0x20; //P1.5 Controla o pino BL no CI 4511, faz o display de LED de 7 segmentos piscar quando o jogo termina __delay_cycles(500000); P1OUT &= ~0x20; __delay_cycles(500000); }}//______________________________________________________________________________//FUNCAO UPvoid up(void){ if (headline==0){game_over();reinicia();return;} //se a cobra estiver na borda superior da gameover - a condicao de baixo nao entrou junto no if pois se a headline ja fosse zero ficaria matriz[-1] e daria erro else if (matriz[headline-1][headcol]==1 && snake[0]!=&matriz[headline-1][headcol]){game_over();reinicia();return;} //se o proximo destino colidir com corpo (menos a cauda) da cobra -> gameover else if (matriz[headline-1][headcol]==1 && snake[0]==&matriz[headline-1][headcol] && snake[0]==cresce[0] && cont>0){game_over();reinicia();return;} //caso particular em que a cobra ira crescer, assim ocorre colisao com a cauda -> gameover //else if (snake[size-2]==&matriz[headline-1][headcol]){} //se a cobra tentar retornar sobre si mesmo a jogada sera invalida - Se (proximo local = pescoco da cobra) -> jogada invalida else { headline--; //desloca uma linha para cima if (snake[0]==cresce[0] && cont>0) //QUANDO A COBRA DEVE CRESCER - quando a fruta engolida estiver no ultimo segmento da cobra e o contador de frutas engolidas for maior que 0 (caso contrario cresceria passando novamente pelo mesmo local mesmo que sem fruta) //snake[0]=rabo da cobra { size++; cont--; for (i=0;i { cresce[i]=cresce[i+1]; //desloca para a esquerda o vetor de crescimento - para o caso de mais de uma fruta engolida e nao digerida } } else //QUANDO A COBRA NAO PRECISA CRESCER { *snake[0] = 0; //apaga o ultimo ponto da cobra for (i=0;i { snake[i] = snake[i+1]; //movimenta a cobra *snake[i] = 1; } } snake[size-1] = &matriz[headline][headcol]; //snake[size-1] recebe o novo endereco da cabeca da cobra *snake[size-1] = 1; //escreve 1 no endereco if (snake[size-1]==zeros[lugar]) //SE A COBRA ENGOLIR UMA NOVA FRUTA - se o endereco da fruta e da cabeca da cobra forem o mesmo { if(cont==3) {score();score();} else { score(); cresce[cont]=zeros[lugar]; //vetor