}
//-----------------------------------//
/************************************/
//-----------------------------------//
3.5 Introducir los datos por el teclado y visualizarlos en el LCD. Cuando se pul
sa la tecla "*" borrar el LCD
//-----------------------------------//
#include <16f876.h>
#fuses HXT,NOWDT,NOPROTECT ,NOLVP
#use delay(clock =4000000)
#include <lcd.c>
#include <kbd.c>
void main() {
char k;
int x;
lcd_init ();
kbd_init();
port_b_pullups (TRUE);
lcd_putc("\fListo...\n");
while (TRUE) {
k=kbd_getc();
x=k-48;
if(k!=0) {
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
delay_ms(500);
printf(lcd_putc, "\f Car=%c", k);
delay_ms(500);
printf(lcd_putc,"\f Car=%u",k)
delay_ms(500);
printf(lcd_putc,"\f Num=%u",x);
delay_ms(500);
lcd_putc("\fLiso...\n);
}
}
}
//-----------------------------------//
/************************************/
//-----------------------------------//
3.7 Introducir los datos, a travez de un teclado, de velocidad de un motor y gen
erar una senal modulada en ancho de pulso proporcional al dato de la velocidad
//-----------------------------------//
#INCLUDE <16F876.h>
#fuses XT,NOWDT, NOPROTECT,NOLVP
#use delay (clock=4000000)
#INCLUDE <kbd.c>
#USE STANDAR_IO (a)
void main()
{
char k, kant='0';
char PWMH=0, PWML=0;
kbd_init();
PORT_B_PULLUPS(TRUE);
WHILE (1) {
k=kbd_getc();
if (k=='\0') k=kant;
if (k=='*')||(k=='#') k='0';
kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
for (PWMH;PWMH>0;PWM--){
OUTPUT_HIGH (PIN_A0);}
for (PWML;PWML>0;PWML--){
OUTPUT_LOW(PIN_A0);}
}
}
//-----------------------------------//
/************************************/
//-----------------------------------//
4.1 Encender y apagar, consecutivamente, un LED en la patita RB7 cuando se produ
zca un cambio de nivel en la patita RB0
//-----------------------------------//
#include <16F876.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_pullpups(TRUE);
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
while (1){
}
}
//-----------------------------------//
/************************************/
//-----------------------------------//
4.2 GENERAR UNA SENAL CUADRADA DE 1KHz usando TIMER0
//-----------------------------------//
#INCLUDE <16F876.h>
#use delay (clock=4000000)
#fuses XT,NOWDT
#use standard_io(B)
#int_TIMER0
void TIMER0_isr(void) {
output_toggle(PIN_B0);
set_timer0 (0x1B);}
//se recarga el timer0
void main(){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
//Configuracion timer0
set_timer0 (0x1B);
//Carga del timer0
enable_interrupts(INT_TIMER0);
//Habilita interrupcion timer0
enable_interrupts(global);
//Habilita interrupcion general
while(1);
//Bucle infinito
//-----------------------------------//
/************************************/
//-----------------------------------//
5.1 Lectura de una tension analogica por el canal AN0
//-----------------------------------//
#include <16f876.h>
#device adc=10
#fuses XT,NOWDT
#fuses
#use delay (clock=4000000)
#include <lcd.c>
void maiin () {
int16 q;
float p;
setup_adc_ports(AN0); //Canal 0 analogico
setup_adc (ADC_CLOCK_INTERNAL);
lcd_init ();
for (;;) {
set_adc_channel (0);
delay_us (20);
q=read_adc();
p=5.1.*q / 1024.0;
printf(lcd_putc, "\fADC=%41d", q);
printf(lcd_putc, "\nVoltage=%01.2V", p);
delay_ms(100);
}
}
//-----------------------------------//
/************************************/
//-----------------------------------//
5.2 Termometro con una NTC CTSA0WB203
Lectura de la temperatura AN0
//-----------------------------------//
#include <16f876.h>
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <math.h>
//Necesaria para los calcuos matematicos
#include <lcd.c>
void main () {
float tv,tr,temp,y;
//variables de la ecuacion
int16 value;
lcd_init();
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_us(10);
do {
value=Read_ADC();
tv=5.0*value/1024.0;
tr=tv*10000.0/(5.0-tv);
y=log(tr/20000.0);
y=(1.0/298.15)+(y*(1.0/4050.0));
temp=1.0/y;
temp=temp-273.15;
printf(lcd_putc,"\nT=%04.2fC",temp);
}while(TRUE);
}
//-----------------------------------//
/************************************//
//-----------------------------------//
5.4 Simulacion de adquisicion de tensiones negativas
//-----------------------------------//
#include <16F876.h>
#device adc=10
#fuses XT,NOWDT
#FUSES
#use delay (clock=4000000)
#include <LCD.C>
void main(){
int16 q;
float p;
setup_adc_ports(AN0_VREF_VREF);
setup_adc_ports(ANc_CLOCK_INTERNAL);
icd_init();
for (;;) {
set_adc_channel(0);
delay_us(20);
q=read_adc();
p=(-2.0) + (4*q/1024.0);
printf(lcd_putc, "\fADC=%41d", q);
printf(lcd_putc, "\nVoltaje=%01.2fV", p);
delay_ms(100);
}
}
//-----------------------------------//
/************************************//
//-----------------------------------//
6.1 Medir el ancho de un pulso mediante el modulo CCP
//-----------------------------------//
(include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIRl=0x0C
intl nuevopulso=0;
int16 TFB=0,TFS=0,TF=0;
?oat AP=0.0;
int1 cambio=0;
#int_ccpl
void ccp1_int(){
if(cambio==0){
TFS=CCR_1;
setup_ccp1(CCP_CAPTURE_FE);
cambio=1;
}else
TFB=CCP_1;
setup_ccp1 (CCP_CAPTURE_RE);
cambio=0;
if(nuevopulso==0){
nuevopulso=1;
}
}
}
void main(){
lcd_init();
setup_timeer_1(T1_INTERNAL);
setup_ccp1(CCP_CAPTURE_RE);
cambio=0;
enable_interrupts(int_ccp1);
enable_interrupts(global);
do{
if(nuevopulso==1){
TF=(TFB-TFS);
AP=TF*1.0;
printf(lcd_putc,"\nPulso=%6.1fus", AP);
nuevopulso=0;
}
} while(TRUE);
}
//-----------------------------------//
/************************************//
//-----------------------------------//
6.2 Generar una senal cuadrada de 2Kz mediante el modulo CCP
//-----------------------------------//
#include <16f876.h>
#fuses XT, NOWDT
int1 cambio=0;
#int_ccp2
void ccp2_int(){
setup_ccp2 (CCP_COMPARE_CLR_ON_MATCH);
}else{
setup_ccp2 (CCP_COMPARE_SET_ON_MATCH);
}
set_timer1(0);
CCP_2=199;
}
void main() {
disable_interrupts(global);
setup_timer_1(T1_INTERNAL |T1_DIV_BY_1);
setup_ccp2(CCP_COMPARE_SET_ON_MATCH);
CCP_2=199;
enable_interruts(int_ccp2);
enable_interruts(global);
do {
} while (TRUE);
}
//-----------------------------------//
/************************************//
//-----------------------------------//
6.4 Mediante la configuracion del modulo CCP lanzar una conversion AD automatica
. Con el valor obtenido representar la tension de entrada en un display grafico
//-----------------------------------//
#include <16f877.h>
#device adc=10
#use delay(clock=20000000)
#fuses HS,NOWDT
#include <HDM64GS12.C>
#include <graphics.c>
int16 valor;
float tension;
#int_ad
void ad_int(){
valor=read_adc(ADC_READ_ONLY);
ccp_2=1000;
}
void main(){
int8 xa=128,ya=0;
glcd_init (ON);
disable_interrupts(global);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_ccp2(CCP_COMPARE_RESET_TIMER);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0);
ccp_2=1000;
enable_interrupts(INT_AD);
enable_interrupts(global);
glcd_fillscreen(0);
glcd_line(1,64,1,1,1);
glcd_line(1,31,128,31,1);
do{
tension=(valor*5.0)/1024.0;
ya=1.0+12.6*tension;
glcd_pixel(xa,ya,1);
xa--;
if(xa<2)
{xa=128;
glcd_fillscreen(0);
glcd_line(1,64,1,1,1);
glcd_line(1,31,128,31,1);
}
} while (TRUE);
}
//-----------------------------------//
//***********************************//
//-----------------------------------//
6.6 Problemas en la simulacion del modulo CCP en modo PWM con el ISIS
//-----------------------------------//
#include <16f876.h>
#fuses XT, NOWDT
#use delay (clock=4000000)
int16 i;
void main() {
setup_timer_2(T2_DIV_BY_1,224,1);
setup_ccp1(CCP_PWM);
for (i=0;i<1024;i++){
set_pwm1_duty(i);
delay_ms(15);
}
}
//-----------------------------------//
//***********************************//
//-----------------------------------//
7.4 Guardar y leer datos en las 10 primeras posiciones de memoria de una EE-PROM
I^2C. Representar los valores escritos y leidos en un display LCD
//-----------------------------------//
#include<16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_c4,scl=PIN_C3)
#include <lcd.c>