/*
uso por rtos multiproceso del pic 18f4550
*/
#include <18f4550.h>
//uso de teclado
#include <kbd.c>//libreria aun sin modificar
//intento de definir que se puede producir overflow en el pic
#if BUFFER_SIZE < 32
#warning Buffer Overflow may occur
#endif
//final del intento de dejar producir overflow
#fuses WDT,NOPROTECT,NOCPD,NOLVP,NOPBADEN,INTRC_IO,MCLR,BROWNOUT,BORV20,NOPUT
//overflow por clk interno???
//variables estatic mantiene las variables aunque el codigo este en otro punto
#use delay(clock=4000000)
#include <lcd.c>//LCD normal
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#define LCD_DATARXD PIN_D3 //intento de usar ese pin como el de salida
//LCD serial
#use rtos(timer=0,minor_cycle=7ms)
int retardo=100;
int ayuda=1;
// the function can be called anything that a standard function can be called
//subrutinas
void lol(void){
//codigo para evaluar el estado de al menos 2 posiciones del teclado
if(input(PIN_A1)==0||input(PIN_A0)==0){
Lcd_putc ("\f");
lcd_gotoxy(1,1); //posicion a escribir
printf(lcd_putc,"pressing a key0");
if(input(PIN_A0)==0){
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"Right Turn");//imprimir entero
//0xa,0x9,0x5,0x6//valores de paso a paso
output_B(0xa);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x6);
delay_ms( retardo);
}
if(input(PIN_A1)==0){
delay_ms(50);
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"Left Turn");//imprimir entero
output_B(0x6);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0xa);
delay_ms( retardo);
}
}
}
void teclado(void){
if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
output_B(0x10);lol();delay_ms(10);
output_B(0x20);lol();delay_ms(10);
output_B(0x40);lol();delay_ms(10);
output_B(0x80);lol();delay_ms(10);
}
}
void incremento(void){
if(input(PIN_C0)==0||input(PIN_C1)==0){
if(input(PIN_C2)==0&&input(PIN_C4)==1){
retardo = retardo+1;}
}
}
void decremento(void){
if(input(PIN_C0)==0||input(PIN_C1)==0){
if(input(PIN_C2)==1&&input(PIN_C4)==0){
retardo = retardo-1;}
}
}
void derecha(void){
if(input(PIN_C0)==0&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
lcd_gotoxy(1,1); //posicion a escribir
printf(lcd_putc,"Right Turn");//imprimir entero
delay_ms(50);
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"%u",retardo);//imprimir entero
lcd_gotoxy(5,2); //posicion a escribir
printf(lcd_putc,"(ms)");//imprimir entero
output_B(0xa);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x6);
delay_ms( retardo);
}
}
void izquierda(void){lcd_gotoxy(1,1); //posicion a escribir
if(input(PIN_C0)==1&&input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==1){
printf(lcd_putc,"Left Turn");//imprimir entero
output_B(0x6);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0xa);
delay_ms( retardo);
}
}
//fn subrutinas
void detenido(void){
if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
Lcd_putc ("\f");
delay_ms(10);
lcd_gotoxy(1,2); //Lcd_putc ("\f"); clarear LCD
printf(lcd_putc,"Future Engineers");//imprimir entero
delay_ms(1);
lcd_gotoxy(1,1); //primera posicion primera linea
printf(lcd_putc,"engine stopped");//imprimir entero
ayuda++;
}
}
//#task(rate=7ms,max=7ms)
void The_first_rtos_task ( )
{
if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
detenido();
}
}
#task(rate=7ms,max=7ms)
void The_second_rtos_task ( )
{
if(input(PIN_C0)==0&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
derecha();
rtos_yield ( );
}
teclado();
rtos_yield ( );
}
#task(rate=7ms,max=7ms)
void The_other_rtos_task ( )
{
if(input(PIN_C0)==1&&input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==1){
izquierda();
}
teclado();
rtos_yield ( );
}
#task(rate=7ms,max=7ms)
void The_other2_rtos_task ( ){
if(input(PIN_C0)==0||input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==0){
delay_ms(50);
decremento();
rtos_yield ( );
}
teclado();
rtos_yield ();
}
#task(rate=7ms,max=7ms)
void The_other3_rtos_task ( ){
if(input(PIN_C0)==0||input(PIN_C1)==0&&input(PIN_C2)==0&&input(PIN_C4)==1){
incremento();rtos_yield ( );
if(retardo==-1){retardo=0;}
}
teclado();
rtos_yield ( );
}
#task(rate=7ms,max=7ms)
void The_third_rtos_task ( )
{
if(input(PIN_C0)==0||input(PIN_C1)==0||input(PIN_C2)==0||input(PIN_C4)==0){
delay_ms(1);
Lcd_putc ("\f");
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"%u",retardo);//imprimir entero
lcd_gotoxy(5,2);
printf(lcd_putc,"(ms)");rtos_yield ( );
}
if(input(PIN_C0)==1||input(PIN_C1)==1||input(PIN_C2)==1||input(PIN_C4)==1){
delay_ms(100);
detenido();
}
teclado();
}
void main(void)
{
// Configura los pines del puerto A como entradas
//Inicio LCD
lcd_init();
rtos_run ( );
}