Você está na página 1de 8

//-----------------------------------//

3.4 Visualizar en un LCD el estado de las entradas del PUERTOA


//-----------------------------------//
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT ,NOLVP
#use delay(clock =4000000,RESTART_WDT)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(A)
void main()
{
CHAR A5[]="A5";
CHAR A4[]="A4";
CHAR A3[]="A3";
CHAR A2[]="A2";
CHAR A1[]="A1";
CHAR A0[]="A0";
CHAR IN[]="PUERTO A";
glcd_init(ON);
glcd_text57(33,30,A5,1,1);
glcd_text57(49,30,A4,1,1);
glcd_text57(65,30,A3,1,1);
glcd_text57(81,30,A2,1,1);
glcd_text57(97,30,A1,1,1);
glcd_text57(113,30,A0,1,1);
glcd_text57(30,5,IN,2,1);
while(1)
{
if(input_state(PIN_A5)==0)
glcd_rect(32,40,46,60,1,1);
else
glcd_rect(32,40,46,60,1,0);
glcd_rect(32,40,46,60,0,1);
if(input_state(PIN_A4)==0)
glcd_rect(48,40,62,60,1,1);
else
glcd_rect(48,40,62,60,1,0);
glcd_rect(48,40,62,60,0,1);
if(input_state(PIN_A3)==0)
glcd_rect(64,40,78,60,1,1);
else
glcd_rect(64,40,78,60,1,0);
glcd_rect(64,40,78,60,0,1);
if(input_state(PIN_A2)==0)
glcd_rect(80,40,94,60,1,1);
else
glcd_rect(80,40,94,60,1,0);
glcd_rect(80,40,94,60,0,1);
if(input_state(PIN_A1)==0)
glcd_rect(96,40,110,60,1,1);
else
glcd_rect(96,40,110,60,1,0);
glcd_rect(96,40,110,60,0,1);
if(input_state(PIN_A0)==0)
glcd_rect(112,40,126,60,1,1);
else
glcd_rect(112,40,126,60,1,0);
glcd_rect(112,40,126,60,0,1);
delay_ms(400);
}

}
//-----------------------------------//
/************************************/
//-----------------------------------//
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>

#define EEPROM_ADDRESS long int


void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xA0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_staart();
status=i2c_write(0xa0);
}
}
BYTE read_ext_eeprom(long int address)
{
BYTE data;
i2c_start();
i2c_write(0xA0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
void main(){
int8 valor=0,dato;
EEPROM_ADDRESS address;;
lcd_init();
for (address=0;address<=9;address++){
WRITE_EXT_EEPROM(address, valor);
lcd_gotoxy(1,1);
printf(lcd_putc,"enviando=%1D",valor);
delay_ms(500);
valor++;
}
for (address=0;address<=9;address++){
dato=READ_EXT_EEPROM( address);
lcd_gotoxy(1,2);
printf(lcd_putc,"recibiendo=%1D",dato);
delay_ms(500);
}
}
//-----------------------------------//

Você também pode gostar