/*____________________________________________________________________________*\
|| ||
|| SAMSHIEL_PIC"06 ||
|| 11/Septiembre/06 ||
|| ||
|| Programa: Facil_Primitiva ||
|| Version: 1.0 ||
|| ||
|| Dispositivo: PIC 16F648A Compilador: CCS vs3.249 ||
|| Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3 ||
|| ||
|| Notas: Proyecto para realizar mas facilmente la loteria primitiva ||
|| y que mi padre no se calienta mas la cabeza con los numeritos. ||
|| ||
|| ||
|| ||
|| ||
|| ||
||____________________________________________________________________________||
\*----------------------------------------------------------------------------*/
//--------------- DIRECTRICES DE DISPOSITIVOS Y LIBRERIAS --------------------\\
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#byte port_a = 5
#byte port_b = 6
//----------------------------- SUBPROGRAMAS ---------------------------------\\
int numero,unidades,decenas,cuenta[7],veces,rotar,a,i,y,x;// Variables globales.
unsigned int const disp[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
void Muestreo_7seg(int veces) // bucle en que muestro en los 7seg el numero.
{
for(x=0;x<veces;x++)
{
output_high(PIN_A1);
output_low(PIN_A0);
delay_ms(15);
output_b(disp[unidades]);
output_high(PIN_A0);
output_low(PIN_A1);
delay_ms(15);
output_b(disp[decenas]);
}
}
//----------------------------------------------------------------------------\\
void aleatorio() // Genero el numero semi-aleatorio
{
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
numero = get_rtcc() % 49;
numero +=1;
}
//----------------------------------------------------------------------------\\
void Comprobacion()
{
switch (numero) //comprobacion de que el numero no es "0".
{
case 0:
aleatorio();
break;
}
for(a=1;a<7;a++)
{
if (cuenta[a]==numero)
{
aleatorio();
}
}
}
//----------------------------------------------------------------------------\\
void animacion(int rotar) //animacion de comienzo y final
{
for(i=0;i<rotar;i++)
{
for(y=0;y<10;y++)
{
unidades=y;
decenas=y;
Muestreo_7seg(2);
}
}
}
//--------------------------- PROGRAMA PRINCIPAL -----------------------------\\
void main(VOID)
{
int e=1;
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
while(1)
{
animacion(5);
for(e=1;e<7;y++) // un bucle for para mostrar solo 6 numeros
{
if(input(PIN_A2)) //---------- BOTON PARA OBTENER Nº ALEATORIO------------
{
while(input(PIN_A2));
{
delay_ms(30);
animacion(2);
aleatorio(); // genero el numero aleatorio
Comprobacion(); // aqui comprobaria que el num no sea 0 y que no se repita
decenas = numero / 10; // desfragmento el numero para mostrarlo
unidades = numero - (decenas * 10); // en el 7seg
cuenta[e] = numero; // guardo el numero en cuenta
Muestreo_7seg(65); // y finalmente lo muestro en el 7seg
e++;
}
}
}
animacion(1);
reset_cpu(); // una vez mostrado los 6 numeros reseteo el PIC.
}
}