Programacion en C Con Hi Tech PDF
Programacion en C Con Hi Tech PDF
Programacion en C Con Hi Tech PDF
Video Tutorial Programar en PIC-C Compiler No. 3 - Mostrar Mensaje Mediante Virtual
Terminal
http://www.youtube.com/watch?v=C04NG3toNsM
Video tutorial como programar en pic C Compiler simulado en proteus y quemado en PicKit2
http://www.youtube.com/watch?v=jFSq0-eQD54
http://www.forosdeelectronica.com/f24/programas-hechos-mplab-20784/
Ejemplo 1
Este es un simple parpadeo de un led...
Nota: Los programas fueron hechos por m no es un copy/paste de otros sitios)
Cdigo:
/////////////////////////////////////////////////////////////////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#byte TRISB=0x86
#byte PORTB=0x06
void main(void){
TRISB=0x00;
PORTB=0x00;
do{
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
}while(TRUE);
Puse abajo un practica hecha en proteus 7.4 para que puedas bajarlo y compilador en mplab.
Ejemplo 2
Este es un simple contador de 0 a 9; donde solo se utiliza un display de ctodo comn en el puerto b del
pic
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTADOR 0 A 9
//DATE:23/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
//VARIBALES///////////////////////////
int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000,
0b10011001,0b10010010,0b10000011,0b11111000,
0b10000000,0b00011000};
int contador;
//CONFIGURACION E/S///////////////
set_tris_b(0x00);
do{
for(contador=0;contador<=9;++contador){
output_b(mostrar[contador]);
delay_ms(1000);
}
}while(TRUE);
}
Ejemplo 3
Este programa hace un scroll de un led ...en el puerto b del pic... de un solo lado va estar corriendo el
led...mientras no sea pulsado el push botton que esta en el pin0 del pic.. del puerto a y si es pulsado
el led el scroll se dirigir al lado contrario al que estaba
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;FUNCIONES DEL CCS C COMPLIER
//DATE:27/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
retorna(int c);
void main(void){
int a;
set_tris_b(0x00);
set_tris_a(0x21);
a=1;
do{
output_b(a);
if(a==128)
a=1;
else
a=a<<1;
delay_ms(100);
if(input(PIN_A0))
a=retorna(a);
}while(TRUE);
}
retorna(int c){
do{
if(c==1)
c=128;
else
c=c>>1;
output_b(c);
delay_ms(100);
}while(input(PIN_A0));
return(c);
}
Ejemplo 4
Este programa es un simple decodificador de 0 a 7, donde se usa tres pulsadores en el puerto a...se le
introduce un numero binario de 000 a 111 para que en el display de nodo comn aparezca el 0 a 7,...
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;DECODIFICADOR
//DATE:23/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000,
0b10011001,0b10010010,0b10000011,0b11111000};
int numero;
set_tris_b(0x00);
set_tris_a(0xff);
setup_comparator(NC_NC_NC_NC);
do{
numero=input_a();
output_b(mostrar[numero]);
output_b(mostrar[numero]);
}while(TRUE);
Ejemplo 5
Simple programa que controla un lcd....
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTADOR 0 A 9
//DATE:23/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<LCD.C>
int x[]={"hola"};
int y[]={"JORGE"};
int i;
void main(){
lcd_init();
for(i=0;i<=3;i++){
lcd_putc(x[i]);
delay_ms(1000);
}
lcd_putc("\n");
lcd_putc("# es; ");
for(i=0;i<=4;i++){
lcd_putc(y[i]);
delay_ms(1000);
}
lcd_putc("\f otra vez?");
}
Ejemplo 6
Este programa hace una comunicacin serial con la campo y el pic... si quieres verlo que funcione entra a
youtube...y busquen "godness006" ah estn algunos proyectos que he hecho
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;TERMINAL VIRTUAL
//DATE:24/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7)
void main(void){
int VALOR;
set_tris_b(0x80);
do{
for(VALOR=0;VALOR<=10;VALOR++){
printf("EL VALOR ES: %u\r",VALOR);
delay_ms(1000);
}
}while(TRUE);
Archivos Adjuntos
hercules_3_2_1_950.7z (417,1 KB (Kilobytes), 827 visitas)
Ejemplo 7
Este programa lo que hace...por medio de la computadora vas a ingresar a un numero del teclado de la
computadora, al display.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;DECODIFICADOR_RS232
//DATE:03/MAYO/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7)
void config(void){
set_tris_a(0x20);
set_tris_b(0x80);
setup_comparator(NC_NC_NC_NC);
}
void main(void){
int mostrar[]={0b10000000,0b11011001,0b01000100,0b01010000,0b00011001,
0b00010010,0b00000011,0b11011000,0b00000000,0b00011000};
int x;
config();
output_a(0b10000000);
do{
x=getc();
switch(x){
case 48: output_a(mostrar[0]); break;
case 49: output_a(mostrar[1]); break;
case 50: output_a(mostrar[2]); break;
case 51: output_a(mostrar[3]); break;
case 52: output_a(mostrar[4]); break;
case 53: output_a(mostrar[5]); break;
case 54: output_a(mostrar[6]); break;
case 55: output_a(mostrar[7]); break;
case 56: output_a(mostrar[8]); break;
case 57: output_a(mostrar[9]); break;
}
}while(TRUE);
}
Ejemplo 8
Cdigo:
//------------------------------------
//TITULO: SENSOR DE TEMPERATURA Y ENVIADO A LA PC
//AUTOR: JORGE ARTURO RODRIGUEZ HERNANDEZ
//FECHA: 12\JUNIO\'09
//------------------------------------
#include <12f675.h>
#fuses XT,NOWDT,NOCPD,NOPROTECT,MCLR,NOPUT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A1)
void config(void){
set_tris_a(0x3b);
setup_comparator(NC_NC_NC_NC);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
}
void main(void){
int x,y;
config();
do{
x=read_adc();
delay_ms(500);
y=2*x;
printf("LA TEMP= %u",y);
printf("C\r\n");
}while(TRUE);
}
Archivos Adjuntos
temperatura_589.7z (7,5 KB (Kilobytes), 719 visitas)
Ejemplo 9
Simple circuito con un pic16f887, que se trata de un teclado anlogo, escribimos la contrasea o la
podemos cambiar.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTRASENA
//DATE:18/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f887.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT
#use delay(clock=8000000)
#include<LCD.C>
int LEER_TECLADO;
int TECLADO[]={"0123456789#*"};
int UNO,DOS,TRES,CUATRO;
int UNO_P,DOS_P,TRES_P,CUATRO_P;
int GOA,i;
void config(void){
write_eeprom(0x04,1);
write_eeprom(0x05,2);
write_eeprom(0x06,3);
write_eeprom(0x07,4);
set_tris_a(0x01);
set_tris_c(0x00);
setup_comparator(NC_NC_NC_NC);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
output_low(PIN_C0);
lcd_putc("\fCOMPILED ON\n");
lcd_putc(__DATE__);
delay_ms(2000);
}
ADC(int VALOR_ADC){
NO_PULSADO:
delay_ms(10);
VALOR_ADC=read_adc();
if(VALOR_ADC>140){
goto NO_PULSADO;
}
else if(VALOR_ADC<24){
VALOR_ADC=1;
}
else if(VALOR_ADC<43){
VALOR_ADC=2;
}
else if(VALOR_ADC<60){
VALOR_ADC=3;
}
else if(VALOR_ADC<74){
VALOR_ADC=4;
}
else if(VALOR_ADC<88){
VALOR_ADC=5;
}
else if(VALOR_ADC<98){
VALOR_ADC=6;
}
else if(VALOR_ADC<108){
VALOR_ADC=7;
}
else if(VALOR_ADC<114){
VALOR_ADC=8;
}
else if(VALOR_ADC<122){
VALOR_ADC=9;
}
else if(VALOR_ADC<128){
VALOR_ADC=0;
}
else if(VALOR_ADC<137){
VALOR_ADC=10;
}
else if(VALOR_ADC<140){
VALOR_ADC=11;
}
return(VALOR_ADC);
}
void ESCRIBIR_PASSWORD(void){
for(i=0;i<=3;i++){
delay_ms(500);
LEER_TECLADO=ADC(LEER_TECLADO);
write_eeprom(i,LEER_TECLADO);
lcd_putc(TECLADO[LEER_TECLADO]);
}
delay_ms(500);
}
void CAMBIAR(void){
lcd_putc("\fESCRIBE AHORA\n");
ESCRIBIR_PASSWORD();
UNO=read_eeprom(0x00);
DOS=read_eeprom(0x01);
TRES=read_eeprom(0x02);
CUATRO=read_eeprom(0x03);
write_eeprom(0x04,UNO);
write_eeprom(0x05,DOS);
write_eeprom(0x06,TRES);
write_eeprom(0x07,CUATRO);
lcd_putc("\fCAMBIADO");
delay_ms(1000);
}
void CHEKAR(void){
UNO=read_eeprom(0x00);
DOS=read_eeprom(0x01);
TRES=read_eeprom(0x02);
CUATRO=read_eeprom(0x03);
UNO_P=read_eeprom(0x04);
DOS_P=read_eeprom(0x05);
TRES_P=read_eeprom(0x06);
CUATRO_P=read_eeprom(0x07);
}
void main(void){
lcd_init();
config();
AGAIN:
do{
lcd_putc("\fCHANGE->(*)\n");
lcd_putc("ENTER-->(#)");
GOA=ADC(GOA);
switch (GOA){
case 10:
lcd_putc("\fPASSWORD:\n");
ESCRIBIR_PASSWORD();
goto CHEK;
case 11:
lcd_putc("\fESCRIBE EL\n");
lcd_putc("PASSWORD 1ERO");
delay_ms(800);
lcd_putc("\fTYPE NOW\n");
ESCRIBIR_PASSWORD();
CHEKAR();
if(UNO==UNO_P && DOS==DOS_P &&
TRES==TRES_P && CUATRO==CUATRO_P){
lcd_putc("\fCORRECTO");
delay_ms(1000);
CAMBIAR();
}
else
lcd_putc("\fINCORRECTO");
delay_ms(1000);
break;
}
}while(TRUE);
CHEK: CHEKAR();
}
Archivos Adjuntos
contrasena_614.7z (19,1 KB (Kilobytes), 504 visitas)
Ejemplo 10
Este circuito lo que haces es por medio de la computadora tenemos un programa llamado hrcules que
hace la comunicacin serial con el pic, bueno por medio de este programa introducimos un password en
este caso es "hola", si es as prendera un led indicando que se activ algo, y si ponemos otra palabra que
no sea "hola" prendera otro led indicando que esta mal el password.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;PASSWORD
//DATE:25/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#include <STRING.H>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_B6,rcv=PIN_B7)
void main(void){
char password[6];
char numero[]="hola";
set_tris_b(0x80);
setup_comparator(NC_NC_NC_NC);
Bueno tengo un programa llamado configure virtual serial port es bueno para simular puertos seriales
y ya podrs conectarlo con proteus con el compim que se encuentra en las libreras.
Ejemplo 11
Estos dos programas uno es el transmisor y el otro el receptor, lo puse a 1200 baudios porque me
funciono correctamente le aumentaba los baudios y no lo captaba muy bien el receptor. El transmisor es
TWS434 y el recepyor es el RWS434 los dos trabajan a 434 MHz.
Cuando el switch que se encuentra en el PIN_A0 sea presionado aviar por el PIN_B4 una 'S' 10 veces
con un retardo cada uno de 10 ms mientras el receptor esperara hasta que capte la 'S' y prendera un led
en el PIN_B1
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;TX_RF
//DATE:21/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=1200,xmit=PIN_B4)
void main(void){
int i;
set_tris_b(0x00);
setup_comparator(NC_NC_NC_NC);
do{
if(input(PIN_A0)){
for(i=0;i<=10;i++){
printf("S");
delay_ms(10);
}
delay_ms(500);
}
}while(TRUE);
}
Ejemplo 12
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;RX_RF
//DATE:21/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#include <STRING.H>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=1200,rcv=PIN_B0)
void main(void){
char x;
set_tris_b(0x01);
setup_comparator(NC_NC_NC_NC);
do{
output_low(PIN_B1);
do{
x=getch();
}while(x!='S');
output_high(PIN_B1);
delay_ms(2000);
}while(TRUE);
}
Ejemplo 13
Hola amigos tengo un problema con el pic16f628a mi caso al utilizar el RB4 como forma de parpadeo no
da ningn resultado el los otros RBX si, no utilizo comunicacin, y los simulo en proteus 7.4 y cdigo CCS
C. Bueno les dejo 2 cdigos y ningunos me han funcionado.. Espero sus ayudas....
Cdigo:
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#byte TRISB=0x86
#byte PORTB=0x06
void main(void){
TRISB=0x00;
PORTB=0x00;
do{
output_high(PIN_B4);
delay_ms(1000);
output_low(PIN_B4);
delay_ms(1000);
}while(TRUE);
}
Cdigo:
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#byte port_b=6
void main() {
int contador;
set_tris_b(0); //// declaramos el puerto B como salidas
port_b=0;
while (true) { //// bucle infinito
contador=200; //// retraso, 200 ciclos de 1000 microsegundos, o
sea, 2 milisengundos
while(--contador!=0)
delay_us(1000);
port_b=0xff; //// activa todos los pins del puerto B
contador=200;
while(--contador!=0) //// retraso, 200 ciclos de 1000 microsegundos, o
sea, 2 milisengundos
delay_us(1000);
port_b=0x00;}; //// apaga todos los pins del puerto B
Ejemplo 14
Control de un servo y comunicacin con la pc, este circuito lo que hace es esperar una seal de la
computadora, para poder girar 45 grados, 90 grados, 135 grados o 180 grados, al girar a cualquier
grados elegido esperara un cierto tiempo en esa posicin al termino de 3 segundos! regresara a su
posicin original o sea a 0 grados.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;SERVO SIMPLE
//DATE:23/ABRIL/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16f628a.h>
#include <STRING.H>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=2400,xmit=PIN_A1,rcv=PIN_A0)
void config(void);
void main(void){
long i,a;
char POSICION;
config();
INICIO:
output_b(0x00);
printf("POSICIONANDO EL MOTOR\r\n");
for(i=a;i>=500;i=i-10){
output_high(PIN_B0);
delay_us(i);
output_low(PIN_B0);
delay_ms(10);
}
printf("\f");
printf("POSICION --> 0 GRADOS\r\n");
printf("ESCRIBA LA POSICION QUE QUIERE:\r\n");
printf("45 GRADOS -->(Q)\r\n");
printf("90 GRADOS -->(W)\r\n");
printf("135 GRADOS -->(E)\r\n");
printf("180 GRADOS -->(R)\r\n");
do{
POSICION=getch();
}while(POSICION!='Q' && POSICION!='W' && POSICION!='E' && POSICION!='R');
if (POSICION=='Q'){
a=1000;
}
else if (POSICION=='W'){
a=1500;
}
else if (POSICION=='E'){
a=2000;
}
else if (POSICION=='R'){
a=2500;
}
output_high(PIN_B0);
delay_us(a);
output_low(PIN_B0);
delay_ms(5000);
goto INICIO;
void config(void){
set_tris_a(0x21);
set_tris_b(0x00);
setup_comparator(NC_NC_NC_NC);
}
Archivos Adjuntos
servo_121.7z (13,6 KB (Kilobytes), 345 visitas)
************************************************************************
http://www.forosdeelectronica.com/f24/compilador-hi-tech-pic18f26j50-problema-37399/
Ejemplo 15
Tal parece que no todo iba bien se me genero un pequeo problema; cuando compilo este pequeo
cdigo que hice:
Cdigo:
#include <htc.h>
#include "delay.h"
__CONFIG(WDTE=0);
__CONFIG((FOSC0 && FOSC1)=01);
__CONFIG(PWRTE=1);
__CONFIG(CP=1);
__CONFIG(MCLR_OFF);
__CONFIG(XT=4000000);
void main(void)
{
TRISB=0;
TRISA=1;
while(1)
{
if(PORTA==1)
{
PORTB=18;
__delay_ms(5000);
PORTB=0;
__delay_ms(5000);
}
else
PORTB=128;
Me aparece un error como si el compilador esta mal instalado, cosa que no pasa cuando no trabajo con
retardos; hay algo que tenga mal configurado?? Gracias por su ayuda!!
__CONFIG(XT & WDTDIS & PWRTDIS & BOREN & LVPDIS & WRTEN & DEBUGDIS & DUNPROT &
UNPROTECT);
Ten en cuenta que el C-Wiz ayuda mucho pero en cosa de tiempos como los "delay" no sirve de nada
poner XT=4000000, ya que aparte de generar error el compilador no le interesa la velocidad del cristal
que vas a usar a menos que la librera que ests usando requiera de ese valor para calcular una
constante de tiempo como usan las libreras de los "delay" y para eso la declaracin seria #define
_XTAL_FREQ 4000000 antes del #include "delay,h". Pero te aviso que el delay como librera no lo tiene el
hitech (revisar manual), entonces para eso hay que crear una librera y luego llamarla desde el programa
o le puedes dar uso a los ejemplos de esta web que tambin trae las libreras para los delay
http://www.microchipc.com/sourcecode/#delay16x
Por ltimo para poder usar todas las libreras que dispone el hi-tech se debe incluir el Patch o ruta de
las libreras al proyecto para que pueden ser llamadas desde la lnea de cdigo con mayor facilidad ya
que un simple "#include" a sus libreras te va a dar dolores de cabeza; para eso te vas a "Project" ->
"Properties", luego en el rbol buscas "C/C++ Build" -> Seleccionas "Settings", es ah en "Include Patch"
donde agregas la ruta de la librera(s). Con eso ya puedes usar el #include a las libreras respectivas.
Cdigo:
Con lo que tu me has indicado y me funciona bien, pero al momento de ponerle un retardo mayor este no
lo reconoce y lo hace mas pequeo, y al hacer el programa solo para que la pata 1 del Puerto A se
apague y se encienda con retardo no lo hace bien y hace los retardos muy cortos... espero que me
puedas ayudar en este problemn que se me a armado al aprender sobre este compilador; otra cosa: yo
cuando programo en MikroC para manejar individualmente las patas del PIC pongo por
ejemplo: PORTB.F2=1; para que la pata 2 del Puerto B se encienda, ahora como hago eso en el
HI-TECH C para manejar individualmente las patas sin poner o escribir en todo el puerto
(PORTB=0b0000001)??
Hola iDan:
Te recuerdo que la mayor parte esta en los manuales que estn en la carpeta del Hi-tech y del
compilador PIC correspondiente. Para el manejo de bit's debes de ver el archivo que corresponde al PIC
que est usando, que lo encuentras en "C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include"
para los PIC16F, te puse un ejemplo adjunto donde explico la manera.
Pero bsicamente seria as: RB0 = 1; // A "1" el pin 0 del PORTB, tal y como dice en el archivo,
para eso debes revisarlo ya que ah estn todas las declaraciones. Igual revisa el ejemplo adjunto y me
avisas que tal te fue.
PD: En el ejemplo estoy usando la misma librera que baj de la pgina, solamente le he cambiado el
nombre.
Archivos Adjuntos
HiTechDelay1.rar (987,4 KB (Kilobytes), 237 visitas)
HiTechDelay2.rar (1,08 MB (Megabytes), 93 visitas)
Tengo el mismo problema lo peor es q yo si soy novato el cdigo que estoy usando es pequesimo y de
aprendizaje lo peor es que al profe le sale pero en mi compu no funciona. Cuando agrego el delay sin el
delay todo normal probaje con las libreras gracias
#include <htc.h>
#define _XTAL_FREQ 4000000
void main(void)
{
TRISB=0X00;// 1 representa Entrada y 0 representa salida
for(;;;)
{
PORTB^=1;
__delay_ms(1000);
}
}
*****************************************************************************
Hola de nuevo estuve revisando mis cdigos mi problema fue QUE dentro de los recursos de archivo *h
haba
Fue la confusin y no por el programa y bueno otra duda fue para k sirve? Este cdigo FUSES LVP en k
forma me sirve .....
Lo que yo sepa...por ah entra la informacin para programar el pic.....pero pss yo tengo un programador
de pic's en usb y pss no necesito usar eso de LVP.
Este programa es muy simple lo hice en c#, es un control de 8 led's, en pocas palabras manipulas 1 byte
(8bit) y lo mandas al pic...
Archivos Adjuntos
Este programa es hecho en C# y controla un servo, aqu les dejo el programa hecho en mplab para poder
recibir los datos del programa y as mismo controlar el servo.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTROL DE SERVO
//DATE:26/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#include<math.h>
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)
void config(void){
set_tris_a(0x22);
set_tris_b(0x00);
setup_comparator(NC_NC_NC_NC);
}
void main(void){
int x;
float y;
long z;
config();
output_b(0x00);
do{
x=getch();
y=(x*6.666e-6)+0.9e-3;
z=y*1000000;
output_high(PIN_B0);
delay_us(z);
output_low(PIN_B0);
delay_us(20000-z);
}while(TRUE);
}
Archivos Adjuntos
control_de_servo_104.7z (27,9 KB (Kilobytes), 284 visitas)
george.manson.69
En un par de semanas subir la construccin de un robot controlado por la compu, y controlado va
RF...paso a paso para los que les interese puedan hacer uno...COMING SOON
Bueno como haba dicho antes vamos a empezar con el proyecto prometido, el robot controlado por la
lap, y via RF, bueno para empezar ah les dejo la imagen como deber de ir el proyecto. Primero el
transmisor.
Como vemos usamos un USB/SERIAL para hacer la comunicacin, pero otros pueden usar otro pic,
que tenga para manejo de USB. Pero bueno yo no he familiarizado aun con esos, por ahora con el
adaptador, sigue el max 232, y luego el pic16f628a, y el transmisor rws434.
El programa aun no lo voy a subir porque hay que explicar por detalle la construccin del circuito, y
luego del software.
Receptor Rx
Bueno ya vimos el transmisor ahora sigue el receptor, el receptor costa de un rws434 y un pic16f628a,
un LCD Y un driver H 1 amp y luego los motores. lo que trato de hacer es que al recibir una seal de la
computadora, el LCD visualice lo que esta haciendo el robot, por ejemplo mando una seal que de una
vuelta a la derecha, y el LCD me diga que esta dando vuelta ala derecha as sucesivamente.
Bueno para ponerlo mucho mejor el circuito, pongmosle un password que al recibir la contrasea pueda
activarse el robot y a si puedas controlarlo. Por ahora aqu esta el diagrama como va hacer el circuito.
(Nota; este robot solo podr recibir seal hasta los 60 mts y de ah ya no har nada)
En el mensaje de ms arriba el transmisor es tws, no rws. Capaz que este un poco ansioso
pero...con que vas a hacer los programas de la computadora, con visual basic? linda "pinta"
nueva.
Saludos
Si lo voy hacer en visual basic.... ya lo tengo pero le estoy agregando ms cosas como, mas
COM porque las laptop empiezan desde COM4 y de ah para delante. Y pss puede pasar que
alguien quiera usar una computadora de escritorio y tenga COM1 y 2 y pss tengo que adaptar
el programa que use esos puertos...y otras cosas le estoy agregando...pero por ahora voy a
explicar la circuitera...ya tengo todo hecho pinta bien todo el robot y se mueve donde yo lo
digo.
george:
hola le algo de la transmisin y me pareci muy interesante gracias por
compartir. Te consulto si lo has probado realmente y si hay que tener cuidado con
las adaptaciones de impedancias de las antenas o no. En la realidad tienen tan
buen alcance y funcionamiento como lo promocionan segn tus experiencias
gracias y te saludo muy atentamente. Hugo
Hola Hugo. Mira no tuve problemas para nada, al hacer los dos circuitos (transmisor y receptor) ando
ahorita de vacaciones y deje mis trabajos en la casa, y por eso no he subido los programas que falta para
terminar el proyecto. Solo tengo Internet aqu, pero funciona muy bien, voy a subir imgenes y un video de
su funcionamiento..."ver para creer".
Saludos!
Programa control de un robot (control of a robot)
Bueno aqu esta lo prometido...jeje...este pequeo programa est en forma de control.
Se dar un archivo para word, donde viene explicado el programa. y se dar el programa.
Archivos Adjuntos
explicacion_del_programa_481.doc (66,0 KB (Kilobytes), 338 visitas)
control_de_robot_movil_351.rar (8,1 KB (Kilobytes), 332 visitas)
Aqu le dejo como debe ser el programa para cada pic, tanto como el transmisor y receptor. Puede
que me salir del tema que tenia que era programas hechos en ccs c. pero si se fijan bien los
programas anteriores fuera referencia para hacer estos y para saber tambin que podemos hacer
con estos...y pues logramos hacer un robot simple.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;TRANSMISOR
//DATE:28/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#include <STRING.H>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)
void config(void){
set_tris_a(0x22);
set_tris_b(0x00);
setup_comparator(NC_NC_NC_NC);
}
void accion(void){
int x,y;
do{
x=getch();
#use rs232(baud=1200,xmit=PIN_A2)
switch(x){
case'U':
for(y=0;y<=15;y++){
printf("U");
delay_ms(5);
}
output_b(0x01);
break;
case'L':
for(y=0;y<=15;y++){
printf("L");
delay_ms(5);
}
output_b(0x02);
break;
case'R':
for(y=0;y<=15;y++){
printf("R");
delay_ms(5);
}
output_b(0x04);
break;
case'D':
for(y=0;y<=15;y++){
printf("D");
delay_ms(5);
}
output_b(0x08);
break;
case'O':
for(y=0;y<=15;y++){
printf("O");
delay_ms(5);
}
output_b(0x00);
break;
}
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)
}while(x!='O');
}
void main(void){
char password[]="YES";
char word[];
int z;
config();
output_b(0x00);
do{
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)
gets(word);
if(strcmp(word,password)){
output_b(0x0f);
#use rs232(baud=1200,xmit=PIN_A2)
for(z=0;z<=30;z++){
printf("A");
delay_ms(5);
}
#use rs232(baud=2400,xmit=PIN_A0,rcv=PIN_A1)
accion();
}
else{
output_b(0x00);
}
}while(TRUE);
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;RECEPTOR
//DATE:28/JUNIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#include <STRING.H>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<LCD.C>
#use rs232(baud=1200,rcv=PIN_A4)
#define EN1_2 PIN_A6
#define EN3_4 PIN_A7
#define A_1 PIN_A0
#define A_2 PIN_A1
#define A_3 PIN_A2
#define A_4 PIN_A3
int SALIR,c;
void config(void){
set_tris_a(0x30);
setup_comparator(NC_NC_NC_NC);
output_low(EN1_2);
output_low(EN3_4);
output_low(A_1);
output_low(A_2);
output_low(A_3);
output_low(A_4);
}
void main(void){
config();
lcd_init();
MAIN:
lcd_putc("\fPASSWORD");
output_low(EN1_2);
output_low(EN3_4);
do{
c=getch();
switch (c){
case 'A':
lcd_putc("\fCORRECTO");
delay_ms(1000);
SALIR=1;
break;
}
}while(SALIR!=1);
SALIR=0;
lcd_putc("\fESPERANDO\n");
lcd_putc("A SER CONTROLADO");
output_high(EN1_2);
output_high(EN3_4);
output_low(A_1);
output_low(A_3);
do{
c=getch();
switch (c){
case 'O':
goto MAIN;
break;
case 'U':
lcd_putc("\fADELANTE");
output_high(A_1);
output_low(A_2);
output_high(A_4);
output_low(A_3);
break;
case 'D':
lcd_putc("\fRETROCEDER");
output_low(A_1);
output_high(A_2);
output_low(A_4);
output_high(A_3);
break;
case 'L':
lcd_putc("\fIZQUIERDA");
output_low(A_1);
output_high(A_2);
output_high(A_4);
output_low(A_3);
break;
case 'R':
output_high(A_1);
output_low(A_2);
output_low(A_4);
output_high(A_3);
lcd_putc("\fDERECHA");
break;
}
}while(TRUE);
}
Fotos del proyecto
Aqu les dejo las imgenes del proyecto. (Carpeta de Hi tech)
Videos del proyecto
YouTube - V*deo0007
YouTube - V*deo0006
YouTube - V*deo0008
YouTube - V*deo0010
Cdigo:
//-------------------------------------
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;MATRIX
//DATE:20/JULIO/'09
//-------------------------------------
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#define DATA PIN_A0
#define CLK PIN_A1
#define RESET PIN_A2
void config(void){
set_tris_b(0x00);
set_tris_a(0x20);
setup_comparator(NC_NC_NC_NC);
}
void SEND_DATA0(void){
output_low(DATA);
delay_us(2);
output_low(CLK);
delay_us(2);
output_high(CLK);
}
void SEND_DATA1(void){
output_high(DATA);
delay_us(2);
output_low(CLK);
delay_us(2);
output_high(CLK);
}
void main(void){
int
H[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b0100001
0,0b01000010};//"H"
int
O[]={0b00111100,0b01000010,0b01000010,0b01000010,0b01000010,0b01000010,0b0100001
0,0b00111100};//"O"
int
L[]={0b01111110,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b0100000
0,0b01000000};//"L"
int
A[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b0010010
0,0b00011000};//"A"
int i;
long j;
config();
output_bit(RESET,1); // "ON"
output_bit(CLK,0);
output_bit(DATA,0);
while(TRUE){
for(j=0;j<=25;j++){
for(i=0;i<=7;i++){
output_b(H[i]); //H
delay_ms(5);
SEND_DATA1();
}
SEND_DATA0();
}
for(j=0;j<=25;j++){
for(i=0;i<=7;i++){
output_b(O[i]); //O
delay_ms(5);
SEND_DATA1();
}
SEND_DATA0();
}
for(j=0;j<=25;j++){
for(i=0;i<=7;i++){
output_b(L[i]); //L
delay_ms(5);
SEND_DATA1();
}
SEND_DATA0();
}
for(j=0;j<=25;j++){
for(i=0;i<=7;i++){
output_b(A[i]); //A
delay_ms(5);
SEND_DATA1();
}
SEND_DATA0();
}
for(j=0;j<=25;j++){
for(i=0;i<=7;i++){
output_b(0X00); //" "
delay_ms(5);
SEND_DATA1();
}
SEND_DATA0();
}
}
}
Conteo
Bueno aqu les dejo un programa que te pide el valor a cada display, para empezar un conteo
desde el nmero elegido. Aqu se pone en prueba las interrupciones en este caso el timer0.
Por ejemplo si queremos un conteo de 60 segundos hay que poner en los display un 6 y un 0 y
presionar S y listo.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTADOR_RS232
//DATE:06/MAYO/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A3)
int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000,
0b10011001,0b10010010,0b10000011,0b11111000,0b00000000,0b00011000};
int x,i,KEY;
int N1;
int N2;
//CONFIGURACION/////////////
void config(void){
set_tris_a(0x28);
set_tris_b(0x00);
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT);
set_timer0(0);
}
#INT_TIMER0
void MUESTRA(){
output_low(ENABLE_1);
output_high(ENABLE_2);
output_b(mostrar[N2]);
delay_ms(5);
output_low(ENABLE_2);
output_b(mostrar[N1]);
output_high(ENABLE_1);
}
NUMERO(){
loop: x=getch();
switch(x){
case 48: KEY=0; break;
case 49: KEY=1; break;
case 50: KEY=2; break;
case 51: KEY=3; break;
case 52: KEY=4; break;
case 53: KEY=5; break;
case 54: KEY=6; break;
case 55: KEY=7; break;
case 56: KEY=8; break;
case 57: KEY=9; break;
default: printf("NO ES UN NUMERO, INTENTE
OTRA VEZ \r\n"); goto loop;
}
return(KEY);
}
void main(void){
disable_interrupts(INT_TIMER0);
disable_interrupts(GLOBAL);
config();
do{
printf(">>ESCRIBA EL 1er VALOR; \r\n");
N1=NUMERO();
output_b(mostrar[N1]);
output_high(ENABLE_1);
output_low(ENABLE_2);
delay_ms(1000);
output_low(ENABLE_1);
N2=NUMERO();
output_b(mostrar[N2]);
output_low(ENABLE_1);
output_high(ENABLE_2);
delay_ms(1000);
output_low(ENABLE_2);
if(N1==0){
N2--;
N1=9;
}else{
N1--;
}
}while(N1!=0 || N2!=0);
disable_interrupts(INT_TIMER0);
disable_interrupts(GLOBAL);
output_low(ENABLE_1);
output_low(ENABLE_2);
printf("HA TERMINADO EL CONTEO; \r\n");
delay_ms(1000);
}while(TRUE);
}
Reloj con LCD y Teclado con LCD
Bueno aqu les dejo dos practicas, un programa es para poner el reloj en el lcd, y otro programa es
para probar el teclado 4x4.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;LCD TIEMPO
//DATE:22/JULIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F887.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#include<LCD.C>
//DEFINICIONES
#define HORA PIN_A0
#define MINUTO PIN_A1
//VARIABLES
int OVERFLOW,MINUTE,HOUR,SECOND;
//CONFIGURACION
void config(void){
set_tris_a(0x03);
set_tris_d(0x00);
setup_adc(ADC_OFF);
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT); //overflow
cada 16.384mS
set_timer0(0);
}
//INTERRUPCION
#INT_TIMER0
void TIMER0(void){
OVERFLOW++;
if(OVERFLOW>61){
OVERFLOW=0;
SECOND++;
if(SECOND==60){
SECOND=0;
MINUTE++;
if(MINUTE==60){
MINUTE=0;
HOUR++;
if(HOUR==24){
HOUR=0;
}
}
}
}
}
void TIEMPO(void){
int i;
for(i=0;i<=200;i++){
delay_ms(1);
}
}
SECOND=0;
MINUTE=0;
HOUR=0;
lcd_putc(" R E L O J");
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while(TRUE){
if(input(MINUTO)){
MINUTE++;
if(MINUTE==60){
MINUTE=0;
}
TIEMPO();
}
if(input(HORA)){
HOUR++;
if(HOUR==24){
HOUR=0;
}
TIEMPO();
}
lcd_gotoxy(6,2);
printf(lcd_putc,"%u:%u:%u ",HOUR,MINUTE,SECOND);
}
}
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;KEYBOARD Y LCD
//DATE:23/JULIO/'09
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F887.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=8000000)
#use fast_io(b)
#include<kbd_lib.c>
#include<LCD.C>
void config(void){
set_tris_b(0xF0);
port_b_pullups(0xF0);
setup_adc(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
disable_interrupts(GLOBAL);
}
void main(void){
char KEY=0;
int N=1;
config();
kbd_init();
lcd_init();
while(TRUE){
lcd_putc("NUMERO");
do{
KEY=kbd_getc();
if(KEY!=0){
lcd_gotoxy(N,2);
lcd_putc(KEY);
N++;
}
}while(N<=17);
lcd_putc("\f");
N=1;
}
}
Hola soy nuevo en esto de programar C y aun no entiendo la distincin entre #DEFINE y #BIT los dos hacen
lo mismo? como hago por ejemplo si quiero una parte de la ram para guardar algn dato yo en asm pona
por ejemplo
ejemplo_1 equ 0x24
Con define se puede hacer esto pero tambin se puede darle un "nombre" a un conjunto de instrucciones:
#define M_D_AVANZA OUTPUT_HIGH(PIN_B6); OUTPUT_LOW(PIN_B7); //parte de un programa
mio para mi primer robot microcontrolado que todava est en construccin, lo que hace pone en alto b6 y
en bajo b7 para que el motor gire (M_D_AVANZA = motor derecho avanza)
Para guardar un dato es lo de mas arriba con las variables
Espero te sirva
saludos
Vegetal_Digital
Que hace exactamente tu robot porque yo tengo uno hecho con un 16f84 y ahora lo voy a mejorar con un
16f877 pero el mo tiene bumpers nomas ya que no encuentro en ninguna casa de electrnica nadie que
venda esos sensores SHARP o los IS471F y no se como esquive por infrarrojo vos pudiste solucionar esto?
(esta argentina no vende nada )
Vegetal Digital
Mi robot es igual al tuyo, le puse dos contactos en el frente, pero se me quemo la parte de potencia de los
motores que la hice con un l293, tengo que esperar hasta el viernes que llegue, y el lunes empiezan de
nuevo las clases as que voy a estar con poco tiempo. Los sensores que decs no s qu son, si quieres
experimentar con infrarrojos he ledo que el CNY70 anda bien. Para mi ese es un paso que dar mas
adelante.
Que le quieres mejorar que tienes que usar un 16f877? Yo estoy usando el 16f84 por una cuestin de
espacio.
Decremento de tiempo
Este simple programa lo que hace al introducir el tiempo (MM:SS) empezara a decrementar hasta
llegar a cero. Esto pone a prueba el timer0,y timer1.
Cdigo:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;CONTROL DE 4 DISPLAY
//DATE:31/JULIO/2009
///////////////////////////////////////
//CONFIGURACION///////////////////
#include<16F628A.h>
#fuses HS,NOWDT,NOLVP,NOMCLR,NOPROTECT
#use delay(clock=20000000)
int mostrar[]={0b01000000,0b01111001,0b00100100,0b00110000,0b00011001,
0b00010010,0b00000011,0b01111000,0b00000000,0b00011000};
//funcion: que establece los puertos como I/O establece el timer0 con 6.5536mS
void config(void){
set_tris_a(0x30);
set_tris_b(0x80);
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_BIT);//overflow
6.5536mS
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);//overflow 13.1072mS
set_timer0(0);
}
#INT_TIMER0
void TIMER0(void){
OVERFLOW++;
if(OVERFLOW>152){
OVERFLOW=0;
SEN4--;
if(SEN4<0){
SEN4=9;
SEN3--;
if(SEN3<0){
SEN3=5;
MEN2--;
if(MEN2<0){
MEN2=9;
MEN1--;
if(MEN1<0){
MEN1=0;
}
}
}
}
}
#INT_TIMER1
void TIMER1(void){
output_bit(EN1,0);
output_bit(EN2,0);
output_bit(EN3,0);
output_b(mostrar[SEN4]);
output_bit(EN4,1);
delay_ms(6);
output_bit(EN1,0);
output_bit(EN2,0);
output_bit(EN4,0);
output_b(mostrar[SEN3]);
output_bit(EN3,1);
delay_ms(6);
output_bit(EN1,0);
output_bit(EN3,0);
output_bit(EN4,0);
output_b(mostrar[MEN2]);
output_bit(EN2,1);
delay_ms(6);
output_bit(EN3,0);
output_bit(EN2,0);
output_bit(EN4,0);
output_b(mostrar[MEN1]);
output_bit(EN1,1);
}
void main(void){
config();
MAIN:
disable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
do{
if(~input(PUSH)){
TIEMPO();
SEN4++;
if(SEN4>=10){
SEN4=0;
SEN3++;
if(SEN3>=6){
SEN3=0;
MEN2++;
if(MEN2>=10){
MEN2=0;
MEN1++;
if(MEN1>=6){
MEN1=0;
}
}
}
}
}
}while(input(PUSH2));
disable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER0);
Temperatura en Matlab
http://www.forosdeelectronica.com/f24/programas-hechos-mplab-20784/index4.html
Este programa fue hecho en Matlab para adquirir la temperatura de un sensor usando un
pic12f675. Primero que nada mostramos el programa que contiene el pic12f675
Cdigo:
#include <12f675.h>
#fuses XT,NOWDT,NOCPD,NOPROTECT,MCLR,NOPUT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A1)
void main(void){
config();
do{
ENTER=getc();
if(ENTER=='E'){
READ=read_adc();
TEMP=2*READ;
printf("%d",TEMP);
}
}while(TRUE);
}
Estimados, quisiera ver si alguien me pudiese responder una duda. Realic un programa, para aprender a
utilizar el pic, que realiza un "blinkeo" de dos leds alternadamente (RB1 y RB2). Leyendo manuales result
con el siguiente cdigo:
#include <htc.h>
__CONFIG(HS);
#define _XTAL_FREQ 20000000
#2 sbjcm 23/08/2010 Respuesta: Duda bsica HI-TECH C con PIC 16F877A --> __delay_ms(x)
Esas son las limitaciones que tiene esa funcin delay. Acepta solo delays pequeos.
Mejor crate una funcin como la que estabas esbozando. Algo as.
void delay_ms(unsigned int t)
{
while(t--)
__delay_ms(1);
}