Anda di halaman 1dari 4

#include <18F4550.

h>

#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN
#use delay(clock=8000000)
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE FALSE //// *deshabilitamos el uso de las directivas HID ///
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //// *turn on EP1(EndPoint1) for IN bulk/interrupt transfers ///
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //// *turn on EP1(EndPoint1) for OUT bulk/interrupt transfers ///
#define USB_EP1_TX_SIZE 8 //// *Tamaño del buffer del TX EndPoint1. (Cambiado de 32 a 8). ///
#define USB_EP1_RX_SIZE 8 //// *Tamaño del buffer del RX EndPoint1. (Cambiado de 32 a 8). ///
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#include <pic18_usb.h> //// *Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver ///
#include <PicUSB.h> //// *Configuración del USB y los descriptores para este dispositivo//
#include <usb.c> //// *handles usb setup tokens and get descriptor reports ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#byte port_a=0xF80 //// -Direccion del puerto A ////
#byte port_b=0xF81 //// -Direccion del puerto B ////
#byte port_c=0xF82 //// -Direccion del puerto C ////
#byte port_d=0xF83 //// -Direccion del puerto D ////
#byte port_e=0xF84 //// -Direccion del puerto E ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
int16 x=0; y;
char a,b;

void main(void){

setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//// PIN_A0 "31744" Led Verde ////
//// PIN_A1 "31745" Led Rojo ////
////////////////////////////////////////////////////////////////////
for(x=0;x<3;x++){ //// ////
Output_High(31744); //// Encendido y apagado de led conectados a RA0 y RA1 ////
delay_ms(300); //// para verificar que el .HEX ha sido cargado correctamente ////
Output_High(31745); //// y que el integrado recibe corriente del puerto USB ////
delay_ms(300); //// ////
Output_Low(31744); //// En este bucle encendera el led verde y despues el rojo, ////
delay_ms(300); //// apagando posteriormente el verde y despues el rojo. Esto ////
Output_Low(31745); //// se repetira tres veces ////
delay_ms(300); ////////////////////////////////////////////////////////////////////
} ////////////////////////////////////////////////////////////////////
for(x=0;x<3;x++){ //// ////
Output_High(31744); //// ////
Output_High(31745); //// ////
delay_ms(300); //// En este otro bucle encendera y apagara los dos diodos ////
Output_Low(31744); //// Led al mismo tiempo, haciendolo tres veces ////
Output_Low(31745); //// ////
delay_ms(300); //// ////
} ////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
usb_init(); //// *Inicialización del módulo USB del microcontrolador. ////
usb_attach(); //// ////
usb_task(); //// *Testa la conexión USB con el PC y obliga a que la active ////
delay_ms(999); //// si está desactivada ////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
while(!usb_enumerated()){ //// ////
Output_High(31744); //// *Bucle para en el cual encendera alternadamente los led ////
Output_Low(31745); //// hasta que la diana sea detectada correctamente ////
delay_ms(600); //// por el PC y con los driver instalados. Mientras tanto ////
Output_High(31745); //// los led permaneceran oscilando alternativamente. ////
Output_Low(31744); //// ////
delay_ms(600); ////////////////////////////////////////////////////////////////////
} ////////////////////////////////////////////////////////////////////
delay_ms(100); ////////////////////////////////////////////////////////////////////
} //// *Este primer "do{ }while(1);" pertenece al blucle ////
do{ //// principal del programa. ////
do{ ////////////////////////////////////////////////////////////////////
y=0; //// *El segundo "do{ while(1);" es el correspondiente al ////
b=0; //// barrido del teclado, del cual solo saldra por medio de ////
a=0; //// una etiqueta "detectado" que es llevado fuera del ////
//// "do{}while(1);" y mandar los datos. ////
////////////////////////////////////////////////////////////////////
Output_High(31744); //// *Encenderemos el Led siempre que estemos testeando tirada ////
////////////////////////////////////////////////////////////////////
////----BARRIDO DE PINES DE PIC PARA LA DETECCION DE DARDOS---- ///
Output_High(31768); //// *Aplicamos nivel alto al "PIN_D0 31768" ///
for(y= 31753; y<=31759;y++){ //// *Un "FOR"que nos recorrera los numeros pertenecientes a los ///
if(Input(y)==1){ //// pines desde "RB1 31753" hasta "RB7 31759" en busca de un ///
a=40; //// cambion de nivel, el cual se detecta con el "IF", testeando///
Output_Low(31768); //// que el valor del pin "INPUT" indicado por la variabe "y" ///
goto detectado; //// sea nivel alto. ///
} //// En caso de cumplir la condición, a la variable "a" se le ///
} //// asigna el valor "40". Ponemos a nivel bajo el "PIN_D0 31768"/
//// y despues acudimos a la llamada de de la etiqueta "detectado"/
//// *En caso de no cumplir la condicion del "IF", pondremos a ///
Output_Low(31768); //// nivel bajo dicho"PIN_D0 31768" y podremos a alto el ///
Output_High(31769); //// siguiente pin "PIN_D1 31769" realizando las mismas acciones//
for(y= 31753; y<=31759;y++){ //// que las descritas anteriormente, cambiando el valor de "a" //
if(Input(y)==1){ //// *Realizaremos todas esta acciones en los pines de "RD0","RD1"/
a=41; //// "RD2","RD3","RD4","RD5","RD6","RD7","RE0" y "RE1". ///
Output_Low(31769); //// ///
goto detectado; ////////////////////////////////////////////////////////////////////
}
}
Output_Low(31769);
Output_High(31770);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=42;
Output_Low(31770);
goto detectado;
}
}
Output_Low(31770);
Output_High(31771);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=43;
Output_Low(31771);
goto detectado;
}
}
Output_Low(31771);
Output_High(31772);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=44;
Output_Low(31772);
goto detectado;
}
}
Output_Low(31772);
Output_High(31773);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=45;
Output_Low(31773);
goto detectado;
}
}
Output_Low(31773);
Output_High(31774);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=46;
Output_Low(31774);
goto detectado;
}
}
Output_Low(31774);
Output_High(31775);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=47;
Output_Low(31775);
goto detectado;
}
}
Output_Low(31775);
Output_High(31776);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=48;
Output_Low(31776);
goto detectado;
}
}
Output_Low(31776);
Output_High(31777);
for(y= 31753; y<=31759;y++){
if(Input(y)==1){
a=49;
Output_Low(31777);
goto detectado;
}
}
Output_Low(31777);
}while(1);

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//// ////
detectado: //// *Aquitenemos la etiqueta detectado, donde acudira en caso ////
Output_High(31745); //// de haber detectado un cambio de nivel en algun pin del ////
delay_ms(500); //// puerto B. ////
Output_Low(31744); //// *Acontinuacion encendemos el Led Rojo y apagamos el Verde ////
switch(y){ //// De este modo sabremos por el estado de los Led si la diana////
case 31753:{ //// a detectado el dardo. ////
b=58; //// ////
}break; //// *Una vez acudida a la llamada de la etiqueta, la ////
case 31754:{ //// variable "Y" se ha quedado con el valor del Pin del cual ////
b=57; //// ha cambiado el estado e interrumpiendo el bucle "FOR". ////
}break; //// *Ahora asignaremos a la variable "B" un valor, dependiendo ////
case 31755:{ //// del valor de "y" y con "switch" le asignaremos dicho valor.///
b=56; //// ////
}break; ////////////////////////////////////////////////////////////////////
case 31756:{ ////////////////////////////////////////////////////////////////////
b=55; ////////////////////////////////////////////////////////////////////
}break; ////////////////////////////////////////////////////////////////////
case 31757:{ ////////////////////////////////////////////////////////////////////
b=54; ////////////////////////////////////////////////////////////////////
}break; ////////////////////////////////////////////////////////////////////
case 31758:{ ////////////////////////////////////////////////////////////////////
b=53; ////////////////////////////////////////////////////////////////////
}break; ////////////////////////////////////////////////////////////////////
case 31759:{ ////////////////////////////////////////////////////////////////////
b=52; ////////////////////////////////////////////////////////////////////
}break; ////////////////////////////////////////////////////////////////////
} //// ////
//// *Usamos la funcion "usb_puts()" para mandar los datos por ////
usb_puts(1,&a,8,100); //// "a" y "b". ////
usb_puts(1,&b,8,100); //// ////
Output_High(31744); //// *Encendemos el Led Verde para indicar que ya se puede ////
Output_Low(31745); //// lanzar el dardo y apagamos el Led Rojo. ////
}while(1); //// *Ahora bien todo terminado solo queda volver a repetir todo////
} //// y para ello el bucle infinito "DO{... }WHILE(1)". ////
//// ////
////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////

Anda mungkin juga menyukai