Anda di halaman 1dari 17

LCD mas Pic16f877

LCD: Manejo del LCD(16*2) DESCRIPCION: Este programa maneja un lcd de 16*2 con el pic16f877.El lcd se encuentra configurado en 8 bits, se utiliza todo el puerto C para enviar el dato y los 2 pines menos significativos del puerto B para el RS Y EL E. Nota: retrado calculado para un cristal de 20 Mhz MATERIALES: - PIC16F877A - Resistencias de 4.7K - Cristal de 20MHZ - Push Botton - Fuente de DC de 5 volts - Protoboard - LCD RUTINAS IMPORTANTES DEL PROGRAMA: ;-------------------------------------------------------------------CLRF PORTB ;LIMPIA EL PUERTO CLRF PORTC ;LIMPIA EL PUERTO call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD) call letrero ;ESCRIBE EL LETRERO call limpia ;LIMPIA EL LCD call linea2 ;SELECCIONA LA LINEA 2 call letrero ;ESCRIBE EL LETRERO ;-------------------------------------------------------------------;subrutina para inicializar el lcd inicialcd: movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD movwf PORTC call comando ; Se da de alta el comando movlw 0x0C ; Se selecciona la primera linea movwf PORTC call comando ; Se da de alta el comando movlw 0x3C ; Se configura el cursor movwf PORTC call comando ; Se da de alta el comando bsf PORTB, 1 ; Rs se pone en 1 para deshabilitar el uso de comandos

return ;------------------------------------------------------------------linea2: bcf PORTB, 1 ; rs en 0 movlw 0xc0 ; selecciona linea 2 pantalla en el LCD movwf PORTC call comando ; Se da de alta el comando return ;------------------------------------------------------------------limpia: bcf PORTB, 1 ; rs en 0 movlw 0x01 ; limpia lcd pantalla en el LCD movwf PORTC call comando ; Se da de alta el comando return ;-------------------------------------------------------------------DIAGRAMA DE CONECCIN:

Puede descargar el programa completo en la seccion de Desgargas de este blog.


El teclado 4*4 funciona de la siguiente manera contine 8 terminales (A,B,C,D,1,2,3,4) de los cuales (A,B,C,D) son de control, y (1,2,3,4) son de supervisin, es decir, con los de control tendras que hacer un barrido y con los de supervisin preguntar que tecla se a presionado. te mando un ejemplo pequeo en el esamblador movlw b'11111110' ; pregunto por el panel en c movwf portc btfss portd,4 goto unos ; pregunto por el puerto si esta voy a uno

Mensaje en lcd
#include <16F877A.h> #device adc=8 #FUSES NOWDT #FUSES HS 0mhz for PCD) #FUSES NOPUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP (PIC18) used for I/O #FUSES NOCPD #FUSES NOWRT #FUSES RESERVED #use delay(clock=20000000) #include <LCD.C> //No Watch Dog Timer //High speed Osc (> 4mhz for PCM/PCH) (>1 //No Power Up Timer //Code not protected from reading //No Debug mode for ICD //No brownout reset //No low voltage prgming, B3(PIC16) or B5 //No EE protection //Program memory not write protected //Used to set the reserved FUSE bits

void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); lcd_init(); while (1){ lcd_putc("\fMENSAJE\n"); delay_ms(1000); } }

Control lcd
List P=16f877A #include <P16F877A.INC>

__CONFIG _WDT_OFF & _PWRTE_OFF & _CP_OFF & _XT_OSC & _BODEN_OFF & _LVP_OFF ;****REGISTROS**** RDELAY EQU 0X21 CONTA0 EQU 0X22 CONTA1 EQU 0X23 CONTA2 EQU 0X24 LETRA EQU 0X25 FLINEA EQU 0X26 ;****CONSTANTES DE PROGRAMA**** LINEA1LCD EQU 0X80 LINEA2LCD EQU 0XC0 CLRLCD EQU 0X01 CASALCD EQU 0X02 INCLCD EQU 0X07 ;IZQUIERDA DECLCD EQU 0X05 ;DERECHA ONLCD EQU 0X0C OFFLCD EQU 0X08 ONCURSOR EQU 0X0E BLINKCURSOR EQU 0X0F IZQLCD EQU 0X18 DERLCD EQU 0X1C FUNCTIONLCD EQU 0X38 ;COMUNICACION 8 BITS RS EQU 0X06 RW EQU 0X05 E EQU 0X07 W EQU 0 ;REGISTRO W F EQU 1 ;REGISTRO F ORG GOTO ORG INICIO CALL CALL PRIMERAL MOVLW CALL MOVLW MOVWF CLRF RB1A MOVF CALL CALL ;;CALL INCF DECFSZ GOTO GOTO LETRA,W MENSAJE_L1 CARACTER_LCD DELAY LETRA,F FLINEA,F RB1A SEGUNDAL 0 INICIO 5 PORT_LCD INI_LCD LINEA1LCD COMANDO_LCD 0X0F FLINEA LETRA

SEGUNDAL MOVLW CALL MOVLW MOVWF CLRF RB2A MOVF CALL CALL ;;CALL INCF DECFSZ GOTO GOTO

LINEA2LCD COMANDO_LCD 0X0F FLINEA LETRA LETRA,W MENSAJE_L2 CARACTER_LCD DELAY LETRA,F FLINEA,F RB2A PRIMERAL

;****SUBRUTINAS**** PORT_LCD BSF STATUS,5 CLRF PORTB CLRF PORTD BCF STATUS,5 BCF PORTD,7 RETURN INI_LCD ;CALL MOVLW CALL ;CALL MOVLW CALL MOVLW CALL MOVFW CALL MOVLW CALL RETURN RETARDO FUNCTIONLCD COMANDO_LCD RETARDO ONLCD COMANDO_LCD CLRLCD COMANDO_LCD DECLCD COMANDO_LCD CASALCD COMANDO_LCD

COMANDO_LCD BCF PORTD,RS BSF PORTD,E MOVWF PORTB CALL HABILITA_LCD RETURN CARACTER_LCD BSF PORTD,RS BCF PORTD,E MOVWF PORTB CALL HABILITA_LCD RETURN HABILITA_LCD BSF PORTD,E

MOVLW MOVWF T1 DECFSZ GOTO BCF RETURN MENSAJE_L1 ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW MENSAJE_L2 ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END

0XFF RDELAY RDELAY,F T1 PORTD,E

PCL,1 A' ' A' ' A' ' A' ' A' ' A' ' A'H' A'o' A'l' A'a' A' ' A' ' A' ' A' ' A' ' A' ' PCL,1 A' ' A' ' A' ' A' ' A' ' A'M' A'u' A'n' A'd' A'o' A'!' A'!' A' ' A' ' A' ' A' '

sensor de temperatura lm35 Rango de temperatura de -55 a +150 C Factor de escala lineal +10.0 mV/C Funciona a partir de 4 Hasta 30 volts MODULO CONVERTIDOR ANALGICO/DIGITAL (A/D)

El mdulo de conversin Analgico/Digital dispone de cinco entradas para los dispositivos de 28 pines y ocho para dispositivos de 40 pines. A travs de la entrada analgica se aplica la seal analgica a un condensador de captura y retencin (sample and hold) que despus se introduce en el convertidor. El convertidor de aproximaciones sucesivas da como resultado una palabra de 10 bits. El convertidor A/D puede seleccionar como tensin de referencia la alimentacin interna VDD y masa o bien una externa que se introduzca entre VREF+ y VREF. Cuando se selecciona la tensin de referencia externa, hay que tener en cuenta que existen algunas limitaciones; el mximo voltaje aplicado a la patilla VREF+ ser VDD+0,3V y el mnimo VDD-2,5V. En cuanto a la tensin VREF- la mnima tensin ser VSS-0,3V y la mxima VREF+ 2V, as por ejemplo, si la tensin de alimentacin es de 5V, la tensin VREF+ no podr exceder de 5V. Por lo que el mximo voltaje en VREF- ser de 3V. Siempre se ha de cumplir que VREF+ VREF <= 2V. En el caso de los micros de la serie 16 y 18 de microchip el modulo ADC de el Pic es de 10 bits de resolucin el microcontrolado me aumentara 1 bit cada (VRF+ - VRF-)/2^10 en el caso que tengamos un voltaje VREF = Vss; y VREF+ =3V el voltaje por bit seria de 3V/1024 = 0,002929688V/bit = 2. 929688 mV/bit Lo que quiere decir que el registro del ADC me aumentara en 1 por cada 2. 929688 mV/bit. Acomodando las escalas si el sensor lm35 me entrega 10.0 mV/C y el ADC me aumenta en 2. 932551mV por bit y necesito que me quede uno a uno la escala puedo buscar un factor que me haga esto y seria 10.0 mV/C / 2. 929688 mV/bit = 3,41333 o sea que si divido el valor de la conversin A/D por este valor 3,41333 me dar el valor de la temperatura en grados centgrados Para realizar una conversin A/D deben seguirse los siguientes pasos: 1. Configurar el mdulo conversor A/D Configurar los pines que actan como entradas analgicas, las seales que harn de tensin de referencia la que trabajarn como E/S digitales (ADDCON1). Seleccionar el canal de entrada. A/D (ADCON0). Seleccionar la fuente de la seal de reloj para la conversin A/D (ADON0). Hacer la seleccin del formato de justificacin Activar el mdulo de conversin A/D (ADCON0) 2. Activar si, se desea, la interrupcin del mdulo conversor A/D 3. Esperar el tiempo requerido para la adquisicin 4. Inicio de la conversin 5. Tiempo de espera para terminar la conversin A/D que puede detectarse 6. Leer el par de registros ARDESH:ADRESL donde se encuentran los 10 bits que resultan de la conversin y poner a cero el flag ADIF. 7. Para una nueva conversin volver a los pasos 1 y 2, El tiempo de conversin por bit est definido por TAD, se exige un mnimo de 2*TAD para realizar una nueva conversin. te anexo un ejemplo realizado en Pic c de CCS y la simulacin en Proteus.

Control temp #include "16f877A.h" #device adc=10 #fuses XT, NOWDT #use delay (clock=4000000) #include <math.h> //Necesaria para los clculos matemticos #include <lcd.c> #use standard_IO(B) void main() { int16 ADC; float conv; lcd_init(); setup_port_a(AN0); setup_adc (ADC_CLOCK_INTERNAL); set_adc_channel(0); delay_ms(200); do{ ADC=Read_ADC(); conv= (float)ADC; conv=conv/3.413333333; if(conv>=23) output_high(PIN_B0); else output_low(PIN_B0); //printf(lcd_putc, "\nT=%04.2fC", temp); printf(lcd_putc, "\nT=%04.2fC",conv); }while(TRUE);

Convercion ad
list p=16f877 processor "16f877.inc" ;***Comienzo a definir variables*** estado trisA trisB portA portB adresh adresl adcon0 adcon1 equ equ equ equ equ equ equ equ equ 0x03 0x85 0x86 0x05 0x06 0x1e 0x9e 0x1f 0x9f

;***Configuracin del mdulo A/D ;y puertos de entrada y salida*** Inicio movlw movwf movlw movwf movlw movwf movlw adcon1 movwf analgicas. Principal bcf movlw movwf A/D. bcf de PIR1. bsf bsf INTCON. bsf bsf registro PIE1. bcf call bsf Conversin btfsc adcon0,2 goto Conversin call delay_2Tad goto Principal Espera estado,5 Espera adcon0,2 ;Acceso al banco0. estado,5 8ch,6 ;Acceso al banco1. ;Activo el bit ADIE del 0bh,7 0bh,6 ;Activo los bit GIE ;y PEIE del registro 0ch,6 ;Pongo a cero el bit ADIF estado,5 ;Acceso al banco0. b'01000001' ;Selecciono el canal de entrada adcon0 ;y el clk de conversin para el adcon1 ;para configurar las entradas b'00100000' estado 0x03 trisA 0xff trisB b'10000100' ;Cargo W=b'00011' ;y lo paso a trisA. ;Cargo W=b'11111111' ;y lo paso a trisB. ;Cargo W=b'0100' y lo paso a

movlw movwf loop return delay_2Tad movlw movwf loop1 return end

0x1f 20h decfsz 20h,1 goto loop

0x15 20h decfsz 20h,1 goto loop1

Bueno, sucede que quera hacer un programa que me hiciera la conversin de analgico a digital del pin RA0 del 16f877; en fin, lo hice siguiendo los pasos de la hoja de datos, pero no veo ningn resultado en ADRESH:ADRESL, los dos siempre estn en cero. Bueno, tal vez estoy haciendo mal la simulacin en MPLAB, porque no s como hacer una simulacin de una entrada analgica. Sin embargo, el MPLAB no me da ningn mensaje de error. Pero hay algo que no est funcionando bien con el programa que hice. En dicho programa tengo una rutina llamada conversin, la cual e: Conversin btfsc adcon0,2 goto Conversin call delay_2Tad goto Principal Sucede que el bit 2 del registro adcon0 se pone en cero cuando estoy en la linea 'goto Conversin' y presiono F7 para el step into, pero aqu el programa no funciona a como debera. Al presionar F7 no se me ejecuta la instruccin 'goto Conversin', sino que el programa hace un salto a la linea numero 5 de la rutina Principal, y de ah vuelve a comenzar el programa. Bueno, ese salto lo hace despus de algunas evaluaciones de la instruccin btfsc, a como debera. La lgica de la secuencia es que al estar en la linea de 'goto Conversin' y al presionar F7, el programa debera hacer otra evaluacin del bit 2 del registro adcon0 y luego saltar a la linea call delay_2Tad, pero no lo hace. Realmente no s lo que est mal. Aqu pongo todo el programa para que lo chequeen, y si hay algn comentario o sugerencia, se los agradecer. Control temp
'**************************************************************** '* Name : SENSOR DE TEMPERATURA *

'* Author : [Ing. Ivn Alejandro Rodrguez Ambrz] * '* Notice : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 17/07/2008 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** DEFINE ADC_BITS 8 'Activa el ADC de 8 bits TRISA = 255 ' Fija todos los pines del puerto A como entradas ADCON1 = %00001110 ' Config. PORTA. 6bits de menor peso y AN0 entrada analgica, 'el resto son entradas digitales ADCON0= %10000001 'Fosc/32,ch0 y ADC en marcha MUL VAR BYTE define osc 4 DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 0 if 4-bit bus DEFINE LCD_RSREG PORTD DEFINE LCD_RSBIT 7 DEFINE LCD_EREG PORTD DEFINE LCD_EBIT 6 DEFINE LCD_BITS 8 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 ANALOGICO var BYTE LCDOUT PAUSE $FE,1 200 ' LCD Data port ' starting Data bit (0 or 4) ' LCD Register Select port ' LCD Register Select bit ' LCD Enable port ' LCD Enable bit ' LCD bus size (4 or 8 bits ' Number of lines on LCD

LCDOUT "IVAN AMBRIZ CO" LCDOUT $FE,$C0,"PIC 16F877A" PAUSE 300 INICIO: ADCIN 0, analogico 'Lee el CH0 y lo asigna a analogico MUL=ANALOGICO*2 'Deduje la multiplicacin a prueba y error, pero no se porque 'la conversion directa me da la mitad del valor real LCDOUT $FE,1,"TEMPERATURA:", DEC MUL

LCDOUT $FE,$C0,"'C: " pause 100 goto inicio

'**********************************************************************

Luego de encender el conversor a/d debes hacer un retardo de unos 20 uS recomendablemente. Aunque tu programa parece hacerlo ya que hay muchas instrucciones luego del encendido del adc, pero aqui te paso la rutina que siempre utilizo con el lm35 para que compares. La he utilizado en 3 ocasiones, llevadas a campo y ha resultado. Ahora te doy detalles de como lo hice. Primero trabajo con justificacion a la izquierda (utilizando el adresh), ya que asi no tengo problemas con los desbordes del adresl. ademas de eso, la referencia esta a 5 voltios por lo que dividi el resultado de la conversion entre 2 con un rrf por la sensibilidad del lm35. confi bsf status,5 movlw b'10000101' movwf adcon1 bcf status,5 conv_temp movlw b'11000001' ; Canal RA0, Oscilador interno, ADC Encendido movwf adcon0 movlw .35 ; Espera de aprox. 20uSeg movwf adc_cont decfsz adc_cont,1 goto $-1 bsf adcon0,2 ; Inicio de conversion btfss pir1,adif goto $-1 bcf pir1,adif movf adresh,0 ; Final de conversion movwf adresh_r ; Guarda los valores en centena,decena y unidad rrf adresh_r,w movwf portc return

yo programo en CCS y la simulacion la hago en Proteus 7.5 sP3 el codigo es el siguiente, // EINNER CRUZ // // QUETAME, COLOMBIA//

#include <16F877.h> #device *=16 #device adc=10 #fuses NOWDT,XT, NOPUT, PROTECT, NODEBUG, BROWNOUT, LVP, CPD, NOWRT #use delay(clock=4000000) #include <lcd.c> #define hard_inc !input(PIN_B1) #define harw_decr !input(PIN_B2) #define enter !input(PIN_B3) INT N1, N2, VAR1, VAR2, VAR3, VAR4, TEMP, entrar=0;

void harwd(void) { lcd_putc("\f CONFIG \n TEMP ESTABLE"); delay_ms(500); lcd_putc("\f VMIN VMAX "); while(enter) {if(hard_inc) VAR1++; if(harw_decr) VAR1--; printf(lcd_putc,"\n %d C_ %d C ",VAR1,VAR2); delay_ms(150); } delay_ms(150); while(enter) {if(hard_inc) VAR2++; if(harw_decr) VAR2--; printf(lcd_putc,"\n %d C %d C_ ",VAR1,VAR2); delay_ms(150); } delay_ms(150); lcd_putc("\f AL_VMIN AL_VMAX "); printf(lcd_putc,"\n %d C %d C ",VAR3,VAR4); while(enter) {if(hard_inc) VAR3++; if(harw_decr) VAR3--; printf(lcd_putc,"\n %d C_ %d C ",VAR3,VAR4);

delay_ms(150); } delay_ms(150); while(enter) {if(hard_inc) VAR4++; if(harw_decr) VAR4--; printf(lcd_putc,"\n %d C %d C_ ",VAR3,VAR4); delay_ms(150); } delay_ms(150); lcd_putc("\f FIN CONFIG \n TEMP ESTABLE"); delay_ms(2000); } void main(void) {setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); setup_counters(RTCC_INTERNAL,RTCC_DIV_1); set_adc_channel(0); lcd_init();

VAR1=20; VAR2=30; VAR3=15; VAR4=35; output_low(PIN_C0); output_low(PIN_C1); output_low(PIN_C2);

while(1) { printf(lcd_putc,"\f TEMP AMBIENTE "); TEMP=(int)read_adc()/2; if (TEMP>25) TEMP--; if (TEMP>65) TEMP--; printf(lcd_putc,"\n %d C ",TEMP);

delay_ms(300); if(VAR1<TEMP<VAR2) {output_low(PIN_C0); output_low(PIN_C1); output_low(PIN_C2);} if(TEMP<VAR1) {output_high(PIN_C1);} if(TEMP<VAR3) {output_high(PIN_C2); delay_ms(400);} if(TEMP>VAR2) {output_high(PIN_C0);} if(harw_decr) harwd(); } }

el programa realiza el muestreo de la temperatura y lo muestra en una lcd de 2x16, y a ciertas temperaturas que estan definidas por defecto al inicio del programa prende o apaga calefactores o ventiladores segun sea lo necesario, ademas tiene la opcion de modificar esos rangos de temperatura con pulsadores, con el pin harw_decr(rb2) se ingresa al menu de configuracion y alli se puede realizar el cambio. cualquier duda o aporte es bien recibida espero que con el aporte de todos los interesados logremos adquirir muchos mas conocimientos sobre el tema. por ultimo, queria plantearles una duda, como ven ya he trabajado con el ADC del pic pero la verdad no se cual es el tiempo de conversion de este, si alguien sabe se lo agradesco proy169rar tacmetro.. necesitas hacer un encoder, que no es mas que una rueda con un agujero o varios, de acuerdo a la resolucin que quieras tener, la velocidad a la que quieras que se actualice el sistema y la velocidad maxima a la que gire el mismo. Ejemplo (pon tus numeros aqui), un motor que gira a maximo 3600 RPM, tiene que actualizar el display cada .5 segundos y tiene que tener una resolucion de 1/2 RPM:

primero, vemos que tanta resolucin se necesita: velocidad maxima 3600 rpm/60seg/minuto= 60 rev por segundo, de ahi 30 rev cada 1/2 segundo, a esta velocidad 1/2 RPM se vuelven 1/240avo de revolucion, tu encoder necesita tener una resolucin de 240 marcas por vuelta. Segundo, ya tenemos nuestra rueda y sensor optico, ahora viene lo "fcil", ponemos el micro a monitorear la rueda un tiempo determinado, por ejemplo, contar el tiempo que necesitas para medir cien marcas, esto te da un valor en microsegundos, por ejemplo (regresando a nuestro ejemplo, a maxima velocidad te da 7000 microsegundos aprox (1/60avo de segundo para dar una vuelta, entre 240 vueltas por marca, por cien marcas), luego, lo comparas con una tabla que puedes calcular. ejemplo de la tabla: tiempo microsegundos RPM 7000 3600 8000 3125 etcetera la otra opcion es medir la frecuencia del sistema (el intervalo entre marca y marca), pero la historia es mas o menos la misma, tienes un tiempo determinado entre marca y marca (en nuestro ejemplo 69 microsegundos), si mides un intervalo de un milisegundo por ejemplo serian 14.4 marcas a maxima velocidad, y tienes que hacer tu tabla con base en estos tiempos (tu limite es la velocidad del micro, tienes que tomar un tiempo suficiente para que puedas detectar la diferencia que necesites, aquirir sela analgica La adecuacin de la seal la puedes hacer utilizando amplificador operacionales o un transistor 2n2222 en configuracin colector comn con ganancia de 0.5. Lo ms sencillo sera que utilizaras amplificador operacionales, aunque para tener un ganancia de 0.5 (necesario para adecuar 10V a 5V) necesitaras utilizar dos operacionales en configuracin inversora, uno con ganancia de 0.5 con resistencia de entrada Ri = 10K y resistencia de retro Rf = 20K, y otro con ganancia unitari (Ri = Rf = 10K). Una vez que tengas adecuada tu seal esa debe entrar por algun pin del convertidor ADC, revisa l hoja de datos del pic, ah esta muy bien explicado como funciona el ADC.

Ummm! esto es con el ADC del pic. Mira tengo un programa que hice pero lo hice con voltimetro!, es decir, al medir 1V en realidad eran 10V y viceversa, lo hice con resolucin de 10bits! y bueno basicamente es el mismo funcionamiento, slo que debes cambiar los valores que a nivel de software. Aqui te lo dejo! Archivos Adjuntos voltimetro_con_pwm_105.txt

Control motor paso a paso


;***************************************************************** ;AUTOR: CARLOS ALBERTO YACO ;CONTROL DE GIRO DE UN MOTOR PASO A PASO UNIPOLAR ;ELECTRONICA BASICA ;***************************************************************** list p=16F84A include<P16F84.inc> cblock 0x0C endc bsf STATUS,RP0 clrf PORTB movlw b'00001111' movwf PORTA bcf STATUS,RP0 principal btfss PORTA,0 call giro_horario call giro_antihorario giro_horario movlw d'3' movwf PORTB call RETARDO_200MS movlw d'6' movwf PORTB call RETARDO_200MS movlw d'12' movwf PORTB call RETARDO_200MS movlw d'9' movwf PORTB call RETARDO_200MS goto principal giro_antihorario movlw d'9' movwf PORTB call RETARDO_200MS movlw d'12' movwf PORTB call RETARDO_200MS movlw d'6' movwf PORTB call RETARDO_200MS movlw d'3' movwf PORTB call RETARDO_200MS goto principal include<RETARDOS.inc> end

Anda mungkin juga menyukai