Vous êtes sur la page 1sur 6

PROGRAMAS EN C

1. Se ingresa un bit por el puerto RB0 (entrada con resistencia pull-up) y por el bit RB1 debe mostrarse el mismo valor. #include <16F877.h> #fuses XT, NOWDT #use delay(clock=4000000) #BYTE TRISB=0x86 #BYTE PORTB=0x06 #BYTE OPTION_REG=0x81 void main() { bit_clear(OPTION_REG,7) bit_set(TRISB,0); bit_clear(TRISB,1); bit_clear(PORTB,1); while(1) { If (bit_test(PORTB,0)==1) // si RB0 es 1 bit_clear(PORTB,1); else bit_set(PORTB,1); } } // enciende el LED //apaga el LED //Habilitacion del pull-up //RB0 entrada //RB1 salida //Apaga LED

2. Se ingresa un bit por el puerto RB0 (entrada con resistencia pull-up) y por el bit RB1 debe mostrarse el mismo valor. (Usando FAST_IO) #include <16F877.h> #fuses XT, NOWDT #use delay(clock=4000000) #use fast_io(B) void main() { port_b_pullups (TRUE); set_tris_B(0x01); output_low(PIN_B1); while(1) { If (input(PIN_B0)==1) output_low(PIN_B1); else output_high(PIN_B1); } } // si RB0 es 1

3. Se ingresa un bit por el puerto RB0 (entrada con resistencia pull-up) y por el bit RB1 debe mostrarse el mismo valor. (Usando STANDARD_IO) #include <16F877.h> #fuses XT, NOWDT #use delay(clock=4000000)

#use standard_io(B) void main() { port_b_pullups (TRUE); output_low(PIN_B1); while(1) { If (input(PIN_B0)==1) output_low(PIN_B1); else output_high(PIN_B1); } } // si RB0 es 1

4. Hacer un programa en C, que ingrese un dato por el puerto B y saca por el puerto C el numero multiplicado por 5. 5. Hacer un programa en C, para que el puerto B, la mitad inferior sea de salida y la mitad superior de entrada. Ingresado un numero de 4 bits por el puerto B , saque por la salida el mismo numero divido por 4.

INTERRUPCIONES Y TEMPORIZADORES. 6. Enciende y apaga consecutivamente un LED en la patilla RB7 cuando se produzca un cambio de nivel en la patilla RB0 #include <16F877.h> #fuses XT, NOWDT, PUT, NOWRT #use delay(clock=4000000) #use fast_io(B) Int1 cambio=0; #INT_EXT ext_isr() { output_toggle(pin_B7); } Void main() { set_tris_B(0x01); output_low(PIN_B7); port_b_pullups(TRUE); //B0 entrada todo el resto salida //Apaga LED //Pull-up para RB0 //Interrupcion por cambio de RB0 //function de interrupcion

enable_interrupts(int_ext); //Habilita int. RB0 ext_int_edge(L_TO_H); // flanco de subida

enable_interrupts(GLOBAL); //Habilita interrupcion general. While(1) { }

7. GENERAR UNA SEAL CUADRADA DE 1KHZ UTILIZANDO LA INTERRUPCCION DEL TIMER0. Para generar una seal de 1Khz requiero un perior de 1mseg y un semiperiodeo de 500useg. T=TCM*Prescaler*(256-Carga TMR0) 500useg=(4/4000000)*2*(256-x) X=6 Es en ASM al trabajar en C se aumenta lneas de cdigo que aumentan el tiempo de ejecucin por tanto hay que ajustar el valor final. En este caso se carga con 0x1D (29).

#include <16F877.h> #fuses XT, NOWDT #use delay(clock=4000000) #use standard_io(B) #int_TIMER0 Void TIMER0_isr(void) { output_toggle(PIN_B0); set_timer0(0x1B); } void main() { setup_timer_0(RTCC_INTERNAL\RTCC_DIV_2); // configura timer0

set_timer0(0x1B); enable_interrupts(INT_TIMER0); enable_interrupts(global); While(1) { } } //Habilita int. timer 0 //Habilita interrupcion general.

Vous aimerez peut-être aussi