), pues el siguiente ejemplito va dedicado a las luces del coche fantastico, ese movimiento de un lateral a otro y viceversa:
a la izquierda 7 veces, por ejemplo con un for, y luego a la derecha otras 7 (>>
y todo dentro de un buque (while(1)). Creo que así es mas sencillo y eficaz que ir encendiendo/apagando led a led con "output_bit".






Grande vszener
la verdad es que realmete eres muy bueno...

tal vez si lo tumbamos ... :P



si alguien genera alguna libreria para el mismo se agadece de antemano que la compartiera en este mismo
" y en la segunda linea "VsZeNeR"05". Tener
-)uno al lado del otro y borra pantalla y vuelta a empezar:
Codigo:
7seg CC
|
|
->|
|----------porta(pin de seleccion display: RA0,RA1.....)
GND--|
),tb decir que para pasar del PROTEUS a la vida real simplemente habra que poner el cristal con sus respectivos condensadores,poner el reset externo(aunque esto lo tengo para algun que otro ejemplo con lcd) y poquita cosa mas, decir tb que pasa lo mismo con los programas de lcd, le falta poner el potenciometro del contraste...pero mi intencion es simplemente ver si funcionan los ejemplos aunque si hay que hacerlos completos pues se hace!!!!jeje
Codigo:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 22/Agosto/05
//
// Programa: Contador 0-9 display BDC & Boton
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
// Notas: Contador 0 al 9 cada vez que pulsemos el boton y vuelta a empezar. Tener
// en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida. Cuando agregamos un boton a nuestro circuito hay que tener en cuenta
// que este dispositivo genera "rebotes" que hay que ser eliminados para
// una correcta visualizacion en el display del digito seleccionado. Esta vez
// la eliminacion de "los rebotes" se ha realizado mediante software.
// Cuando por el pin A0 del porta se introduce un "0" logico(low), se
// incrementa un digito en el display BCD.
//
// Conexiones: A0 -> boton
// B0 -> a
// B1 -> b
// B2 -> c
// B3 -> d
// BCD:
// d c b a NUM
// 0 0 0 0 0
// 0 0 0 1 1
// 0 0 1 0 2
// 0 0 1 1 3
// 0 1 0 0 4
// 0 1 0 1 5
// 0 1 1 0 6
// 0 1 1 1 7
// 1 0 0 0 8
// 1 0 0 1 9
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3)
#use standard_io(A)
///PROGRAMA
void main(void)
{
char i=0; //contador para tabla BCD
int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001}; //BCD 0-9
set_tris_a(0xFF); //porta como entrada
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
output_b(tabBCD); //inicializa displayBCD digito 0
for(;{ //bucle...
if(!input(PIN_A0)) //¿se ha pulsado el boton?
{
delay_ms(151); //SI -> retardo para evitar los rebotes
i++; //incremento contador indice tabBCD
if(i>9) //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_b(tabBCD); //muestra por portb digito 7 segmentos
}
} //...infinito
}
Codigo:
for(;{ //bucle...
if(!input(PIN_A0)) //¿se ha pulsado el boton?
{
delay_ms(151); //SI -> retardo para evitar los rebotes
i++; //incremento contador indice tabBCD
if(i>9) //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_b(tabBCD); //muestra por portb digito 7 segmentos
}
while(!input(PIN_A0));
delay_ms(151);
} //...infinito
}

que paranoya, algo nuevo que aprendo 


Escrito originalmente por nocturno66
¿No creeis que se podría generar una semilla aleatoria realmente aleatoria si formamos un byte con 8 lecturas consecutivas sobre un pin que esté configurado como entrada "al aire"?
!!!
" y en la segunda linea "VsZeNeR"05". Se muestra el
Siempre estoy pendiente de los consejos y simulaciones que colocas. Aunque por los momentos no puedo ocuparme de experimentar por motivos de trabajo, por lo menos con tú muy nutrida información y con los otros hilos de esta GRAN Comunidad me pongo al día.....



Codigo:
------ 1ºFILA
--- | |----
|________________| 2ºFILA
Codigo:
%c --> El dato a mostrar es tipo caracter (letras, ASCII,...)
%d --> El dato a mostrar es tipo entero (numeros enteros)
%f --> El dato a mostrar es tipo float (numeros decimales)
%x --> El dato a mostrar es tipo hexadecimal
Si se le pone una l delante:
%ld --> El dato a mostrar es tipo double
:
; //...inicial
{ //bucle...

;
Escrito originalmente por monopic
hola amigo vs.zener estuve mirando la bateria cargandose y la entendi a la perfeccion. hice esto miralo en proteus como quedo, y una nueva pregunta la cgram solo tiene 8 pocisiones como podria hacer para hacer una animacion para cada una de las 32 posiciones de la lcd todavia tengo la idea metida en la cabeza poder manejar cada cuadricula de forma de mostrar una imagen en toda la lcd no se si sirva multiplezar las memorias o algo asi, un dia vi que en una cabina telefonica una lcd de 2x16 con el nombre de SISCO pero utilizaban toda la lcd se veia super y desde ahi se me ocurrio .. ya sabes... gracias por responderme y ademas esto le servira a todos en el foro nuevamente gracias:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 30/Septiembre/05
//
// Programa: Bateria
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) la animacion de carga de
// una bateria, para ello se han diseñado nuevos caracteres y almacenados
// en la memoria GCRAM de la lcd, solo se ha usado una posicion de memoria
// de dicha GCRAM. Tener en cuenta que hay que poner la directiva NOLVP para
// que el pin B4 sea de salida.
//
// Conexiones: B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE
#include <lcd.c> //libreria manejo de la lcd
///DECLARACION DE FUNCIONES
void recarga(void); //funcion que crea el nuevo caracter
void cara(void);//carita creada por monopic
///DECLARACION DE VARIABLES GLOBALES
char cont=0; //contador que apunta al nuevo caracter diseñado
int8 bat0[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b000010001,0b00010001,0b00011111},
bat20[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b00010001,0b00011111,0b00011111},
bat40[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b00011111,0b00011111,0b00011111},
bat60[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00011111,0b00011111,0b00011111,0b00011111},
bat80[]={0b00001110,0b00001010,0b00010001,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111},
bat100[]={0b00001110,0b00001010,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111};
int8 feliz[]={0b11011,0b00000,0b11011,0b11011,0b00000,0b10001,0b01110};
int8 triste[]={0b11011,0b00000,0b11011,0b11011,0b00000,0b01110,0b10001};
//mios monopic
///PROGRAMA
void main(void)
{
lcd_init(); //inicializa lcd
recarga(); //crea 1 animacion
lcd_gotoxy(5,1); //presentacion...
lcd_putc("Cargando
VsZeNeR"05" //...inicial
for(;{ //bucle...
lcd_gotoxy(2,1); //donde se va a mostrar la animacion de la bateria
lcd_send_byte(1,0); //muestra animacion
recarga(); //crea animacion
delay_ms(500);
lcd_gotoxy(3,1);
lcd_send_byte(1,1); // muestra animacion por monopic
cara();
cont++; //apunta a siguiente animacion
} //...infinito
}
///FUNCION ENCARGADA DE CREAR ANIMACION
void recarga(void){
char i; //indice para for
lcd_send_byte(0,0x40); // se escribe en la GCRAM posicion 0x40
switch(cont){ //selecciona animacion
case 0: for(i=0;i<8;i++) //bateria al 0%
lcd_send_byte(1,bat0);
break;
case 1: for(i=0;i<8;i++) //bateria al 20%
lcd_send_byte(1,bat20);
break;
case 2: for(i=0;i<8;i++) //bateria al 40%
lcd_send_byte(1,bat40);
break;
case 3: for(i=0;i<8;i++) //bateria al 60%
lcd_send_byte(1,bat60);
break;
case 4: for(i=0;i<8;i++) //bateria al 80%
lcd_send_byte(1,bat80);
break;
case 5: for(i=0;i<8;i++) //bateria al 100%
lcd_send_byte(1,bat100);
cont=0; //restaura indice de crear animacion
}
}
void cara(void){
char i;
lcd_send_byte(0,0x48);
switch(cont){ //selecciona animacion
case 0: for(i=0;i<8;i++) //bateria al 0%
lcd_send_byte(1,triste);
break;
case 3: for(i=0;i<8;i++) //bateria al 0%
lcd_send_byte(1,feliz);
break;
cont=cont; }
}


; //...inicial
{ //bucle...

;
;
;
;
;
;
;
;
;
;
;
;
;
;
Codigo:
case 3:
while(fin==0)
{
if(cont12<3) //Se deja el primer paso del contador por seguridad
output_low(PIN_A4); //2 bits a 0
else
if(cont12=3)
ouput_high(PIN_A4); //3º bit a 1
else
......

La librería lcd.c usa comunicación de 4bit con la LCD.
Codigo:
% [flag] [anchura] . [precision] [h/l] tipo
Codigo:
flag: Signo que se añade para digamos, ajustar el dato a representar
·Sin flag -> Se ajusta a la derecha
·Con flag -> Se ajusta a la izquierda
·+ o - -> Escribe el signo
anchura: Numero entero que indica el ancho minimo del campo utilizado para
representar el valor. Si este valor es menor que el campo se completa
éste con espacios en blanco por la izquierda y si es mayor se ignora
el tamaño del campo.
precision: Indica el numero de digitos que se utilizaran para representar la parte
fraccionaria.
Codigo:
printf("Channel 0: %2.1f", valor);
Escrito originalmente por vszener
Ke tal piclutor!!!jeje gracias por lo de MASTER....haber primero hay que tener claro para que sirven poner delante del tipo de datos esos numeros, el formato ante un printf por lo general en C es el siguiente:Codigo:
% [flag] [anchura] . [precision] [h/l] tipo
donde:Codigo:
flag: Signo que se añade para digamos, ajustar el dato a representar
·Sin flag -> Se ajusta a la derecha
·Con flag -> Se ajusta a la izquierda
·+ o - -> Escribe el signo
anchura: Numero entero que indica el ancho minimo del campo utilizado para
representar el valor. Si este valor es menor que el campo se completa
éste con espacios en blanco por la izquierda y si es mayor se ignora
el tamaño del campo.
precision: Indica el numero de digitos que se utilizaran para representar la parte
fraccionaria.
Con las definiciones por delante, si tu quieres representar el numero valor=1,2 deberas configurar el printf de esta manera:Codigo:
printf("Channel 0: %2.1f", valor);
En la anchura pones 2 ya que el numero entero de caracteres a representar son dos(1,2 son dos numeros, el 1 y el 2) y en la precision pones 1 ya tu numero solo contiene una cifra decimal.
En la anchura pon siempre como minimo 2, tu en tu pregunta y tu programa has puesto como anchura 1, ¿eso que significa a nivel de representacion del dato? pues segun las definiciones anteriores, tu dato por pantalla mostrado solo podra tener un numero, en teoria te deberia salir el 1 simplemente(ya que valor=1,2) pero parece ser que el compilador no deja y muestra en totalidad el numero float.
Decir que es logico ya que la configuracion 1.2 no se puede realizar tal cual ya que tu mismo en la anchura=1 estas obligando a que no haya decimales por lo tanto la precision=2 sobra, deberia, como las otras versiones del CCS que tu has provado, mostrar el numero tal cual, ya que la definicion dice que si la anchura no corresponde con la del dato se ignora el campo configurado(en la version 2.236 parece que para anchuras de 1 no lo ignora....)..asi que en resumen!jeje, decir que tienes mal definida la anchura, debes poner minimo 2! prueba con la configuracion que te he puesto y ya me cuentas!en PROTEUS funciona bien!
Suerte!!!
Codigo:
...ya que la definicion dice que si la anchura no corresponde con la del dato se ignora el campo configurado(en la version 2.236 parece que para anchuras de 1 no lo ignora....)..


¡¡que buen trabajo!!
Escrito originalmente por vszener
Buenasss jeje!!!bien, aqui otro ejmeplito mas con el periferico 7seg...ya sabemos contar desde 0 a 9, desde 9 a 0 e incluso de 0 a 9 y viceversa!!!!!vamos a seguir contando jeje esta vez aqui un ejemplito de un contador desde 00 a 99 y vuelta a empezar...aqui el programita:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 18/Agosto/05
//
// Programa: Contador del 00 al 99
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
// Notas: Contador del 00 al 99 cada 1s y vuelta a empezar. Tener en cuenta
// que hay que poner la directiva NOLVP para que el pin B4 sea de salida.
// Se utiliza variables locales:
// * i -> indice tabla 7seg para mostrar digito por 1º 7seg
// * j -> indice tabla 7seg para mostrar digito por 2º 7seg
// * flag -> variable que cuenta 1s
// * var -> ajuste fino para que desborde cada segundo
// Utilizamos la funcion de interrupcion para actualizar indices de la
// tabla de 7seg para mostrar el digito correspondiente en el respectivo
// 7seg, para ello el TMR0 se desborda cada 1s, para ello debe ser cargado
// con 61(equivale a un desbordamiento cada 50ms mas o menos), para obtener
// un desbordamiento de 1s utilizamos una variable(flag) que no entra en
// la actualizacion de indices hasta transcurrido 1s.
// Conexiones:
// · RA0 -> Display 1º 7seg
// · RA1 -> Display 2º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(B)
#use fixed_io(a_outputs=PIN_A0,PIN_A1) //A0,A1 como salidas en porta
char i=0,j=0,flag=0,var=20; //variables globales
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(i>8){ //¿se ha mostrado por 1º 7seg digito 9?
i=0; //SI -> i=0 (muestra digito 0) (*)
j++; //incremento indice j
if(j>9){ //¿se ha mostrado por 2º 7seg digito 9?
j=0;} //SI -> j=0 (muestra digito 0)
}
else{ //(*) NO -> incrementa i
i++;}
}
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
///PROGRAMA
void main(void)
{
int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9
set_tris_b(0x00); //portb como salida
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(61); //carga TMR0
enable_interrupts(GLOBAL); //activadas interrupciones
do{ //bucle...
output_high(PIN_A1); //2º 7seg off
output_low(PIN_A0); //1º 7seg on
delay_ms(15);
output_b(tab7seg[ i ]); //muestra por portb digito 7 segmentos
output_low(PIN_A1); //2º 7seg on
output_high(PIN_A0); //1º 7seg off
delay_ms(15);
output_b(tab7seg[ j ]); //muestra por portb digito 7 segmentos
}while(TRUE); //...infinito
}
Decir que este ejemplito es bastante curioso aparte por manejar display"s de 7 segmentos multiplexados, por utilizar el TIMER0...es decir la cuenta de 1 segundo se hace atraves del desbordamiento del TMR0.....asi ya sabeis como programar interrupciones.....
tengo dudas respecto a este ejemplo, básicamente en la interrupción por TMR0 donde mencionas el ajuste fino... se que la interrupción se genera cada 50ms y que con el contador FLAG te aseguras de controlar que sea 1s. Mi pregunta es en que te basas para lo del ajuste fino



;
;
;
;

ya que el chip de la lcd no lo tiene incluido, aunque el amigo nocturno en un post escribio esto:Codigo:
Si es una LCD compatible con Hitachi HD44780 tendrás que enviarle el ASCII 224 (decimal) para que muestre ese símbolo
Escrito originalmente por vszener
Buenas!!! al final me he puesto manos a la obra y he realizado la animacion de carga de una bateria....jeje, para ello se diseña los caracteres de la bateria(al 0%, al 20%, al 40%, al 60%, al 80% y al 100%), decir que solamente he utilizado una posicion de memoria de la GCRAM(aunque cada animacion ocupa 8 posiciones), he ido machacando valores.......aqui el codigo:
Codigo:
Vref - Vagnd
Vaout = Vagnd + ------------------ [ D0 · 2^0 + D1·2^1 +...+D7 · 2^7]
256
Codigo:
write_dac_value(dato); //salida analogica AOUT
Codigo:
2.56- 0
Vaout = 0 + ------------------ [ 75] = 750mV = 0.75V
256

No sé si este es el sitio adecuado para esto, pero ahí la va pregunta maestro Vszener.

Buenas!!!!bien, el programa de hoy se basa en las interrupciones producidas al cambio de estado por uno de los pines del portb dedicados a dicha tarea, los pines que generan interrupcion son <4:7>. El programa en si realiza la secuencia de luces del coche fantastico con 4 led"s hasta que uno de los pines <4:7> cambia de estado del port b, entonces genera una interrupcion y realiza una secuencia de iluminacion de los led"s distinta, [color=red]aparte cada vez que estemos en una interrupcion se iluminara el led conectado al pin b0[/color]....bueno aqui el codigo!:
Por lo tanto que el pin B0 entre en juego en este programa es simplemente para mostrar al que lo simula o lo monte, que cuando cambie algun estado de los pines 4 al 7 del puerto b, se iluminara el pin B0 para decir al usuario que estamos dentro de la interrupcion y en el momento de haber realizada dicha interrupcion se apagara dicho pin B0 para decir al usuario que ya no estamos en la interrupcion, sino en el programa principal. Por eso mismo la instruccion output_low(PIN_B0); aparece en el programa porque al entrar en la interrupcion esta la instruccion output_high(PIN_B0);. Y no esta para nada mas que para eso, para indicar que estamos dentro o fuera de la interrupcion.setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Ya me habian hablado de esto pero no logro entenderlo muy y pues por eso creo q abra q modificarlo o algo no ¿? :? Tambien para el DS1302 uso un cristal de 455KH y se que en el datashet dicen q tiene q ser de 37,64KH si mal no recuerdo, por eso quiero saber cual usas tu y si este q uso alteraria algo. Y bien, el lcd y todo funciona pero al salir del menu d configuracion los segundos no avanzan o avanzan muy muy lentos y aveces toman valores en hexadecimal o almenos asi parece; ese es el problema q tengo, porsiacaso te dejo el proyecto q no e modificado nada solo pines y nada, todo lo entiendo... como aces esto y el otro :) :////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'05
// 09/Septiembre/05
// vszener@gmail.com
// Programa: Reloj-Calendario DS1302
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) la FECHA y hora obtenida mediante la
// lectura del DS1302. Pudiendose modificar mediante los botones CONF/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302
// ·mth -> mes ds1302
// ·year -> año ds1302
// ·hour -> hora ds1302
// ·min -> minutos ds1302
// ·sec-> segundos ds1302
// ·menu -> variable que muestra opcion del menu CONFigurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser CONFigurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'CONF/Ok' el encargado de CONFigurar el reloj(cuando estemos en modo ver
// hora y FECHA) o el encargado de salir de la CONFiguracion de las opciones(cuando
// estemos en formato de CONFigurar FECHA y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: A0 -> RST DS1302
// A1 -> SCLK DS1302
// A2 -> I/O DS1302
// C7 -> Boton 'up'
// A5 -> Boton 'CONF/Ok'
// B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
// B3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////
#include <18F2550.h> //pic a utilizar
#use delay(CLOCK=4000000) //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMCLR //comandos para el programador
#use standard_io(c)
//#use standard_io(b)
//#define use_portb_lcd TRUE //utilizar el port b para lcd
#define RTC_SCLK PIN_C1 //A definimos pin's...
#define RTC_IO PIN_C2
#define RTC_RST PIN_C0 //...de conexion de la rtc ds1302
#include <ds1302.c> //libreria de rtc ds1302
#include <lcd_F2550.c> //libreria de lcd
///VARIABLES GLOBALES
byte day,mth,year,dow,hour,min,sec; //variabes para ds1302
byte menu=0,flag=0,var=2; //variables para menu CONFigurar
///DEFINICION DE FUNCIONES
void CONFigurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
void beep(void);
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 130ms aprox?
var--; //SI -> decremento var...
if(var==0)
var=2; //...ajuste fino de 130ms aprox
flag=0; //reset flag para contar 130ms aprox
rtc_get_date(day,mth,year,dow); //coge dia,mes,año
rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo
printf(lcd_putc,"\fFECHA: %2X/%2X/%2X\nHORA: %2X:%2X:%2X",day,mth,year,hour,min,sec); //lcd
}
set_timer0(0); //reset TMR0
flag++; //incremento variable flag
}
///PROGRAMA
void main(void){
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //CONFiguracion interrupcion TMR0
set_timer0(0); //carga TMR0
lcd_init(); //inicializa lcd
rtc_init(); //inicializa rtc
lcd_putc("RELOJ CALENDARIO\n VZENER'05"); //presentacion...
delay_ms(800); //...inicial
CONFIGURAR(); //ve a menu CONFIGURAR
enable_interrupts(GLOBAL); //activadas interrupciones
for(;;){ //bucle...
if(input(PIN_A5)==0){ //Si se pulsa CONF....
while(!input(PIN_A5)){} //elimina rebotes
beep();
CONFIGURAR();
} //ve a menu CONFIGURAR
} //...infinito
}
///FUNCION CONFIGURAR
void CONFIGURAR(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones
do{
switch(menu){
case 0: lcd_putc("\fCONFIGURAR\nHORAS?"); //horas
if(!input(PIN_C6)){
while(!input(PIN_C6)){}
beep();
horas();
menu=1; //apunta siguiente opcion
}
break;
case 1: lcd_putc("\fCONFIGURAR\nMINUTOS?"); //minutos
if(!input(PIN_C6)){
while(!input(PIN_C6)){}
beep();
minutos();
menu=2; //apunta siguiente opcion
}
break;
case 2: lcd_putc("\fCONFIGURAR\nDIA?"); //dias
if(!input(PIN_C6)){
while(!input(PIN_C6)){}
beep();
dia();
menu=3; //apunta siguiente opcion
}
break;
case 3: lcd_putc("\fCONFIGURAR\nMES?"); //mes
if(!input(PIN_C6)){
while(!input(PIN_C6)){}
beep();
mes();
menu=4; //apunta siguiente opcion
}
break;
case 4: lcd_putc("\fCONFIGURAR\nANIO?"); //años
if(!input(PIN_C6)){
while(!input(PIN_C6)){}
beep();
anio();
menu=5; //apunta siguiente opcion
}
break;
case 5: lcd_putc("\fSALIR\nCONFIGURAR?"); //salir CONFiguracion
if(!input(PIN_C6)){
menu=6;
beep();
}
}
if(!input(PIN_C7)){ //controla el boton up...
while(!input(PIN_C7)){}
menu++;
if(menu>5)
menu=0;
} //...para mostrar menu por lcd
delay_ms(130); //retardo para ver lcd
}while(menu<6);
menu=0; //actualiza indices menu
rtc_set_datetime(day,mth,year,dow,hour,min); //nueva hora,minuto,...
enable_interrupts(GLOBAL); //activadas interrupciones
set_timer0(0); //carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
printf(lcd_putc,"\fCONF.HORAS:\nHORA: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_C7)){ //¿se ha pulsado up?
while(!input(PIN_C7)){} //elimina rebotes
hour++; //SI -> incremento hour
switch(hour){ //limites...
case 0x0A: hour=0x10;break;
case 0x1A: hour=0x20;break;
case 0x24: hour=0x00;
} //...hour
printf(lcd_putc,"\nHORA: %2X:%2X:%2X",hour,min,sec); //muestra por lcd hour
}
}while(input(PIN_C6));
while(!input(PIN_C6)){} //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
printf(lcd_putc,"\fCONF.MINUTOS:\nHORA: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_C7)){ //¿se ha pulsado up?
while(!input(PIN_C7)){} //elimina rebotes
min++; //SI -> incremento min
switch(min){ //limites...
case 0x0A: min=0x10;break;
case 0x1A: min=0x20;break;
case 0x2A: min=0x30;break;
case 0x3A: min=0x40;break;
case 0x4A: min=0x50;break;
case 0x5A: min=0x00;
} //...min
printf(lcd_putc,"\nHORA: %2X:%2X:%2X",hour,min,sec); //muestra por lcd min
}
}while(input(PIN_C6));
while(!input(PIN_C6)){} //elimina rebotes
}
///FUNCION CONFIGURA DIAS
void dia(void){
printf(lcd_putc,"\fCONF.DIAS:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_C7)){ //¿se ha pulsado up?
while(!input(PIN_C7)){} //elimina rebotes
day++; //SI -> incremento day
switch(day){ //limites...
case 0x0A: day=0x10;break;
case 0x1A: day=0x20;break;
case 0x2A: day=0x30;break;
case 0x32: day=0x01;
} //...day
printf(lcd_putc,"\fCONF.DIAS:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd day
}
}while(input(PIN_C6));
while(!input(PIN_C6)){} //elimina rebotes
}
///FUNCION CONFIGURA MES
void mes(void){
printf(lcd_putc,"\fCONF.MES:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_C7)){ //¿se ha pulsado up?
while(!input(PIN_C7)){} //elimina rebotes
mth++; //SI -> incremento mth
switch(mth){ //limites...
case 0x0A: mth=0x10;break;
case 0x13: mth=0x01;
} //...mth
printf(lcd_putc,"\fCONF.MES:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd
}
}while(input(PIN_C6));
while(!input(PIN_C6)){} //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
printf(lcd_putc,"\fCONF.ANIO:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_C7)){ //¿se ha pulsado up?
while(!input(PIN_C7)){} //elimina rebotes
year++; //SI -> incremento mth
switch(year){ //limites...
case 0x0A: year=0x10;break;
case 0x1A: year=0x20;break;
case 0x2A: year=0x30;break;
case 0x3A: year=0x40;break;
case 0x4A: year=0x50;break;
case 0x5A: year=0x60;break;
case 0x6A: year=0x70;break;
case 0x7A: year=0x80;break;
case 0x8A: year=0x90;break;
case 0x9A: year=0x00;
} //...year
printf(lcd_putc,"\fCONF.ANIO:\nFECHA: %2X/%2X/%2X",day,mth,year); //muestra por lcd
}
}while(input(PIN_C6));
while(!input(PIN_C6)){} //elimina rebotes
}
///FUNCION BEEP
void beep(void){
output_high(PIN_B3); //activa zumbador
delay_ms(50);
output_low(PIN_B3); //desactiva zumbador
}
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
Dado q uso otro PIC (18F2550), aunq no estoy del todo seguro. Haber Vszener si me das una ayudita porfavor :lol: o quien sepa del tema, cualquier ayuda es bienvenida :)Los pic's de la familia mejorada de 8-bits, es decir, los PIC18, el timer puede ser configurable de 8 o 16-bits, me parece que ese es el problema, que por defecto viene configurado a 16-bits, configuralo a 8-bits y ya el timer estará solucionado.Y como hago eso? :? Disculpa mi ignorancia :$
Suerte!!! ;)
Vamos con un ejemplito mas de manejo de lcd!!!esta vez haremos un contador de 0 a 9 y vuelta a empezar pero con un pulsador, es decir cada vez que presionemos el pulsador se mostrara el siguiente digito de nuestro contador hasta llegar a 9 que entonces si volvemos a pulsar el boton volvera a cero y se escuchara un beep del zumbador conectado al pic:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 27/Agosto/05
//
// Programa: Contador 0a9 por LCD con pulsador y buzzer
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) un mensaje de inicio del programa
// y se espera hasta que pulsemos el boton, entonces se borra pantalla y cada vez
// que presionemos el boton se ira incrementando en un valor el digito mostrado en
// la mitad de la fila 1º del lcd hasta llegar a 9 que entonces volvera a 0 y se
// emitira un beep.
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// ·tabNum[] -> vector donde se almacenan numeros del contador 0a9
// ·i -> indice para vector tabNum
// Conexiones: B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
// B3 -> Buzzer(beep)
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd
///PROGRAMA
void main(void)
{
char tabNum[10]={"0","1","2","3","4","5","6","7","8","9"},i=0; //tabla y variable definida
lcd_init(); //inicializa lcd
printf(lcd_putc,"Presione boton
para contador0a9" ); //muestra mensaje inicio
do{ //espera hasta que se pulse boton...
}while(input(PIN_A0)==1);
printf(lcd_putc,"f" ); //...para borrar pantalla e iniciar contador
printf(lcd_putc,"
VsZeNeR"05" ); //auto publicidad en la 2ºfila lcd
lcd_gotoxy(8,1); //vuelve 1ºfila lcd y apunta la mitad de la columna
for( ; ; ){ //bucle...
if(!input(PIN_A0)){ //¿se ha pulsado el boton?
do{ //SI -> eliminar...
}while(!input(PIN_A0)); //...rebotes del boton
if(i>9){ //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_high(PIN_B3); //activa buzzer(beep)
delay_ms(50); //tiempo de escucha del beep
output_low(PIN_B3); //desactiva buzzer(beep)
}
printf(lcd_putc,"%c",tabNum[ i ]); //muestra por pantalla el numero
printf(lcd_putc,"" ); //retrasa el cursor una posicion(escribe encima)
i++; //incremento contador indice tabNum
}
} //...infinito
}
Ya tenemos nuestro primer contador en lcd!!!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
Y aqui esta un ejemplito mas!!!esta vez el ejemplo consiste en un teclado y una lcd conectados....decir que para este ejemplo hacen falta las librerias lcd2.c y kbd3x4.c que las podreis encontrar en el post anterior....lcd2.c maneja la lcd pero las lineas de control estan en el porta y las de datos en el b, tambien decir que usamos 8bits de datos, y la kbd3x4.c es para manejar teclados 3x4 y esta conectado al portb conjuntamente al lcd por lo tanto debemos hacer una seleccion dinamica para manejar conjuntamente el lcd y el teclado(de eso se encargan la slibrerias....jeje), bueno el programa consiste en mostrar por lcd la tecla pulsada en el teclado:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 17/Septiembre/05
//
// Programa: LCD y teclado 3x4
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por lcd la tecla pulsada conectado un
// keypad 3x4 al pic. Tener en cuenta que hay que poner la directiva
// NOLVP para que el pin B4 sea de salida.
//
// Conexiones: B0 -> D0 LCD/Columna 1 keypad
// B1 -> D1 LCD/Columna 2 keypad
// B2 -> D2 LCD/Columna 3 keypad
// B3 -> D3 LCD
// B4 -> D4 LCD/Fila A keypad
// B5 -> D5 LCD/Fila B keypad
// B6 -> D6 LCD/Fila C keypad
// B7 -> D7 LCD/Fila D keypad
// A0 -> RS LCD
// A1 -> RW LCD
// A2 -> E LCD
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<kbd3x4.c> //libreria manejo keypad
#include<lcd2.c> //libreria manejo lcd 8bits
#use fast_io(A)
#use fast_io(B)
///PROGRAMA
void main(void)
{
char c; //variable donde se almacena tecla pulsada
lcd_init(); //inicializa lcd
lcd_putc(" VsZeNeR"05
Tecla pulsada:" ); //presentacion
lcd_gotoxy(15,2); //donde se va a mostrar tecla
for( ; ; ){ //bucle...
do{ //espera hasta...
c=kbd_getc();
}while(c==0); //...pulsar una tecla
lcd_putc(c); //muestra tecla pulsada en lcd
lcd_putc("" ); //retrocede una posicion(escribe encima de la ultima tecla mostrada)
} //...infinito
}
Pues ya sabemos usar lcd y teclado!!!jeje hasta pronto!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
Y aqui esta un ejemplito mas!!!esta vez el ejemplo consiste en un teclado y una lcd conectados....decir que para este ejemplo hacen falta las librerias lcd2.c y kbd3x4.c que las podreis encontrar en el post anterior....lcd2.c maneja la lcd pero las lineas de control estan en el porta y las de datos en el b, tambien decir que usamos 8bits de datos, y la kbd3x4.c es para manejar teclados 3x4 y esta conectado al portb conjuntamente al lcd por lo tanto debemos hacer una seleccion dinamica para manejar conjuntamente el lcd y el teclado(de eso se encargan la slibrerias....jeje), bueno el programa consiste en mostrar por lcd la tecla pulsada en el teclado:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 17/Septiembre/05
//
// Programa: LCD y teclado 3x4
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por lcd la tecla pulsada conectado un
// keypad 3x4 al pic. Tener en cuenta que hay que poner la directiva
// NOLVP para que el pin B4 sea de salida.
//
// Conexiones: B0 -> D0 LCD/Columna 1 keypad
// B1 -> D1 LCD/Columna 2 keypad
// B2 -> D2 LCD/Columna 3 keypad
// B3 -> D3 LCD
// B4 -> D4 LCD/Fila A keypad
// B5 -> D5 LCD/Fila B keypad
// B6 -> D6 LCD/Fila C keypad
// B7 -> D7 LCD/Fila D keypad
// A0 -> RS LCD
// A1 -> RW LCD
// A2 -> E LCD
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<kbd3x4.c> //libreria manejo keypad
#include<lcd2.c> //libreria manejo lcd 8bits
#use fast_io(A)
#use fast_io(B)
///PROGRAMA
void main(void)
{
char c; //variable donde se almacena tecla pulsada
lcd_init(); //inicializa lcd
lcd_putc(" VsZeNeR"05
Tecla pulsada:" ); //presentacion
lcd_gotoxy(15,2); //donde se va a mostrar tecla
for( ; ; ){ //bucle...
do{ //espera hasta...
c=kbd_getc();
}while(c==0); //...pulsar una tecla
lcd_putc(c); //muestra tecla pulsada en lcd
lcd_putc("" ); //retrocede una posicion(escribe encima de la ultima tecla mostrada)
} //...infinito
}
Pues ya sabemos usar lcd y teclado!!!jeje hasta pronto!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
me sale este mensaje de error a la hora de ejecutar el programa rs232 & keypad.
SIMULATION LOG
==============
Design: C:\Documents and Settings\Alfonso\Escritorio\vs_rs232&keypad.DSN
Doc. no.: <NONE>
Revision: <NONE>
Author: <NONE>
Created: 17/09/05
Modified: 17/09/05
Compiling source files...
Processing vs_rs232&keypad.c...
NOT built - requires CCSC
N.B. 3rd party assemblers such as MPASM, ASEM51, ASM11 and AVRASM can be installed using the Proteus SETUP program.
Build FAILED with 1 error(s).
¿SabéIS de que puede ser?
gracias
////////////////////////////////////////////////////////////////////////////////
/// DS1307.C ///
/// Driver for Real Time Clock ///
/// ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
/// used when PIC loses power and DS1307 run from 3V BAT ///
/// - Disable squarewave output ///
/// ///
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec) Set the date/time ///
/// ///
/// ds1307_get_date(day,mth,year,dow) Get the date ///
/// ///
/// ds1307_get_time(hr,min,sec) Get the time ///
/// ///
////////////////////////////////////////////////////////////////////////////////
#ifndef RTC_SDA
#define RTC_SDA PIN_C1 //4
#define RTC_SCL PIN_C0 //3
#endif
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);
void ds1307_init(void)
{
BYTE seconds = 0;
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;
delay_us(3);
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x80); // Disable squarewave output pin
i2c_stop();
}
void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;
i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2c_stop();
}
void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}
void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
}
BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}
return(retval);
}
// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;
temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
#include <18F2550.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=12000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
//Antes de incluir la libreria del ds1307, tiens q poner q pines vas a usar para la conexionde este al pic (VIA I2C):
#define RTC_SDA PIN_C1
#define RTC_SCL PIN_C0
//Ahora si lo incluyes:
#include <ds1307.c>
//Variables necesarias para el ds1307, almacenamiento de lo q cojes.
BYTE sec;
BYTE min;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;
void main()
{
ds1307_init(); //inicializo ds1307.
ds1307_set_date_time(15,6,5,2,15,20,55); //fija dia, mes, año, dow, hora, minutosy segundos como quiera.
while(1)
{
delay_ms(1000); //Espero CASI un segundo.
ds1307_get_date(day,month,yr,dow); //Cojo dia, mes, año y dia de la semana actuales y los almaceno en esas variables.
ds1307_get_time(hrs,min,sec); //Lo mismo pero cogiendo las horas, minutos y segundos.
printf("\f\%02d/\%02d/\%02d\r\n",day,month,yr); //lo mando al rs232.
printf("\%02d:\%02d:\%02d", hrs,min,sec);
}
}
// Conexiones: B0 -> E
// B1 -> RS
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
///////////////////////////////////////////////////////////////////////////
//// LCD Controlador.C ////
//// Driver para manejar el display LCD ////
//// ////
//// lcd_init() Debe ser llamada antes que ninguna funcion. ////
//// ////
//// lcd_putc(c) Escribe el caracter C en la proxima posicion ////
//// de la linea actual del LCD. ////
//// Las siguientes son modificadores especiales: ////
//// \f Borra el display ////
//// \n Va al principio de la segunda linea ////
//// \b Se desplaza atras una posicion ////
//// ////
//// lcd_gotoxy(x,y) Elige la posicion a escribir en el display ////
//// LCD (arriba a la izquierda es 1,1) ////
//// ////
//// lcd_getc(x,y) Devuelve el caracteren la posicion x,y del LCD ////
//// ////
//// desplazar_display(x,y) Mueve el contenido escrito en el display ////
//// la cantidad de espacios x, en el sentido ////
//// indicado por y (0=Izquierda, 1=Derecha) ////
//// ////
///////////////////////////////////////////////////////////////////////////
// Las dos siguientes estructuras estan dirigidas a poder usar el display en:
// A0 rs
// A1 enable
// A2 rw hasta aqui es la estructura de los comandos
struct lcd_pin_map_a
{
BOOLEAN rs;
BOOLEAN enable;
BOOLEAN rw;
BOOLEAN Latch;
BOOLEAN ShiftIn;
BOOLEAN ClockIn;
} lcd_Command;
// B2 D4
// B3 D5
// B4 D6
// B5 D7 y aqui es la de datos, lineas que son entradas o salidas.
struct lcd_pin_map_b
{
BOOLEAN ClockOut;
BOOLEAN ShiftOut;
int data : 4;
BOOLEAN Unused;
BOOLEAN Unused2;
} lcd_Data;
// esto situa la estructura entera
#if defined(__PCH__) //Si es un PIC18
#byte lcd_Data = 0xF81 // en port B (direccion 0xF81)
#byte lcd_Command = 0xF80 // en port A (direccion 0xF80)
#else //Si es un PIC16
#byte lcd_Data = 6 // en port B (direccion 6)
#byte lcd_Command = 5 // en port A (direccion 5)
#endif
#define set_tris_lcd_Data(x) set_tris_b(x)
#define set_tris_lcd_Command(x) set_tris_a(x)
#define Izquierda 0
#define Derecha 1
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // Direccion LCD RAM de la segunda linea
// Otras definiciones para usar en lcd_send_byte
#define LCD_CLEAR 0x01
#define LCD_HOME 0x02
#define LCD_DISPLAY_OFF 0x08
#define LCD_DISPLAY_ON 0x0C
#define LCD_Caracter_BLINK 0x0D
#define LCD_CURSOR_ON 0x0E
#define LCD_CURSOR_BLINK 0x0F
#define LCD_CURSOR_SHIFT_RIGHT 0x10
#define LCD_CURSOR_SHIFT_LEFT 0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT 0x1C
BYTE const LCD_INIT_STRING[4]={0x20|(lcd_type<<2),LCD_DISPLAY_ON,LCD_CLEAR,6};
// Esto es enviado al LCD para inicializarlo bien //
// Lo siguiente es usado para setear la direcion de los registros I/O.
// Seteo del puerto A:
struct lcd_pin_map_a const LCD_WRITE_a = {0,0,0,0,1,0}; // Para modo escritura todos
//los bits deben ser salidas menos ShiftIn, que es entrada, por eso se pone en 1 .-
// Seteo del puerto B:
struct lcd_pin_map_b const LCD_WRITE_b = {0,0,0,0,0}; // Para modo escritura todos
//los bits de datos deben ser salidas .-
struct lcd_pin_map_b const LCD_READ_b = {0,0,15,0,0}; // Para modo lectura todos
//los bits de datos deben ser entradas , por eso se ponen en 1 .-
/* aqui comienzan las funciones del display LCD */
//#separate
BYTE lcd_read_byte()
{
BYTE low,high;
set_tris_lcd_Data(LCD_READ_b);
lcd_Command.rw = 1;
delay_us(1);
lcd_Command.enable = 1;
delay_us(1);
high = lcd_Data.data;
lcd_Command.enable = 0;
delay_us(1);
lcd_Command.enable = 1;
delay_us(1);
low = lcd_Data.data;
lcd_Command.enable = 0;
set_tris_lcd_Data(LCD_WRITE_b);
return( (high<<4) | low);
}
//#separate
void lcd_send_nibble( BYTE n )
{
lcd_Data.data = n;
delay_us(1);
lcd_Command.enable = 1;
delay_us(1);
lcd_Command.enable = 0;
}
void lcd_send_byte( BYTE address, BYTE n )
{
lcd_Command.rs = 0;
//delay_us (600);//trabaja sin la siguiente linea...
while ( bit_test(lcd_read_byte(),7) ) ;
lcd_Command.rs = address;
delay_us(1);
lcd_Command.rw = 0;
delay_us(1);
lcd_Command.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init()
{
BYTE i;
set_tris_lcd_Command(LCD_WRITE_a);
set_tris_lcd_Data(LCD_WRITE_b);
lcd_Command.rs = 0;
lcd_Command.rw = 0;
lcd_Command.enable = 0;
delay_ms(50);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y)
{
BYTE address;
// Solo permite el rango (1, 1) a (16, 2)
if (x == 0 || x > 16 || y == 0 || y > 2)
return;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
//envia el comando de posicion del cursor
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c)
{
switch (c) {
case '\f' : lcd_send_byte(0,LCD_CLEAR);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,LCD_CURSOR_SHIFT_RIGHT); break;
default : lcd_send_byte(1,c); break;
}
}
char lcd_getc( BYTE x, BYTE y)
{
char value;
lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) );
// espera mientras el flag Busy esta en bajo
lcd_Command.rs=1;
value = lcd_read_byte();
lcd_Command.rs=0;
return(value);
}
void desplazar_display(int posiciones, boolean sentido)
{
// Primer parámetro: Numero de desplazamientos
// Segundo parámetro: Sentido del desplazamiento (TRUE=Derecha, FALSE=Izquierda)
int i,aux;
if (sentido) aux=LCD_DISPLAY_SHIFT_RIGHT; // Desplazamiento a la derecha
else aux=LCD_DISPLAY_SHIFT_LEFT;
for (i=1; i<=posiciones; i++)
{
lcd_send_byte(0,aux);
}
}Hola muchachos! (aunque algunos ya no son taaaaan muchachos... :D :D :D )
E tratado de compilar un ejercicio que esta al principio de LCD y el compilador me da un erro en el comando VsZeNeR"05" ); //muestra por pantalla el mensaje exactamente con el 05esta no la entendí mbien, podrías colocar el link del mensaje (eso lo hacer haciendo click derecho en el titulo del numero del post y abrir en otra ventana o copiar la ruta), y decir que mensaje te sale en el compilador
otra duda de donde puedo descargar el proteus para simular Cde su pagina, hay versiones demo, o puedes comprarlo tb de la misma pagina: http://www.labcenter.co.uk/
# necesito hacer una comvercion de analogico a digital y mostrarla en un LCD como lo puedo hacerde esto para hacerlo en el 16f648a, no creo que se pueda, pues este micro no posee conversor A/D, pero con uno que tenga, como el 16f88 u otro, creo que tendrás que hacer algo así:
... includes pic, libreria lcd
#device adc=8 // puede ser de 8 o 10 bits
#fuses ...
#use delay (clock=4000000)
void main()
{
int16 adcValue;
setup_adc_ports(RA0_ANALOG); //RA0 entrada analógica, según el micro que uses, la sentencia RA0_ANALOG a veces cambia
setup_adc(ADC_CLOCK_INTERNAL); // reloj interno
set_adc_channel(0); // selecciona el canal 0
set_tris_a(0xFF);
lcd_init();
do
{
adcValue=read_adc(); // Lee el resultado de la conversion
delay_us(20); // Retardo para carga del cap. de muestreo
printf (lcd_putc,"\fValor:%u", adcValue);
// el printf puede desplegar los datos en varios formatos, la u dice que mostrará el dato como entero sin signo, tb se puede usar una X (mayúscula o minúcula) y se mostrará en hexa, mas datos los puedes ver en el manual de CCS, que tb esta en su pagina: http://www.ccsinfo.com/downloads.php Current Compiler Manuals
} while (TRUE);
}
Mira este link 7 Segmentos con int Timer0 (http://www.todopic.com.ar/foros/index.php?topic=21738.0), puede ser util para ti.
if(input_state(pin_a1))//o cualquier otro pin donde tengas conectado el pulsador
{
delay_ms(50);//tiempo que espero hasta que se estabilice
if(input_state(pin_a1))//verifico si el pulsador sigue presionado
{
....//Hago lo que tenga que hacer
while(input_state(pin_a1));//Espero hasta que se deje de presionar el pulsador
}
}
setup_timer_0(RTCC_8_BIT | RTCC_DIV_4 | RTCC_INTERNAL);
Es decir, uso un registro de 8 bits, por lo que tendre un desborde cada 256uS (usando un cristal de 4MHz, cada tick del reloj es de 1uS por 256 = 256uS) y al usar un prescaler de 4 la interrupcion saltara cada 4 * 256uS = 1.024mS. Por ende cada display se visualizara cada 1.024mS (casi 1mS).Te metiste mal Zago querido!!
Estas en uno de los hilos mas leidos del foro, te recomiendo que antes de patear otro hormiguero aqui, antes seas capaz de hacer por los demas solo un decimo de lo que ha hecho en este hilo el amigo Vszener!!
Hay dos formas de componer un lio de estos:
Una es pedir disculpas por el exabrupto...
La segunda es no meterse en estos lios... :mrgreen: :mrgreen:
zagoaristides:
Lo que me parece de verdad lamentable es tu comentario despectivo, primero porque no es de buena educación despreciar de esa forma lo que se recibe gratuitamente y después y principal porque es injusto: este trabajo ha sido realizado con gran esfuerzo por parte del amigo vszener y otros amigos del foro que desinteresadamente lo ponen a disposición de todo el que acierta a pasar por aquí. y así durante años. Y ciertamente no es una porquería.
Te pongo este post porque sé que la prudencia del amigo vszener le va a impedir contestarte como es debido, pero te ruego que en lo sucesivo pienses en las consecuencias de tus palabras antes de escribirlas.
Muchas gracias.
En realidad fue de atolondrado, porque con mis amigos decimos Lamentable cuando algo nos sale mal y nos lamentamos, es más de nuestros pagos y me doy cuenta que sonó como el ortis, pero eso me pasa por escribir tan rápido y no releer. Ahora el lamentable soy io!
Abrazo y disculpas a todos los que ofendí sin querer.
Buenas:
Si te vas al primer mensaje de este hilo, encontrarás un enlace donde te podrás descargar todo lo que aparece aquí.
Suerte!!! ;)
AQUI (http://www.box.net/shared/4l7bedpqrz) están. :wink:
gracias a aquellas personas que con su ayuda desinteresada llevan luz donde no la hay haciendo de este mundo un sitio mas plural donde vivir gracias....... :-/ :-/ :-/ :-/ :-/ :-/
OYE CUATE NECESITO URGENTE PARA MI TESIS LA LIBRERINA KBD3X4 .C NO LA ENCUENTRO EN NINGUN LADO TENGO LA KBD.C PERO NO SE SI ESTA ME TRAIGA PROBLEMAS AL METER EN EL MISMO PUERTO EL TECLADO Y EL LCD POR FAVOR SI LA TIENES MANDAMELA TE LO AGRADECERIA PARA TODA LA VIDA MI CORREO ES LAPPRAS@HOTMAIL.COM
en ccs no hay q estar pendiente de poner las banderas de interrupcion nuevamente a cero?....al igual que en assembler retorna al lugar donde ocurrió la interrupcion?Exactamente, el compilador se encarga de eso, de guardar y restablecer los registros y borrar las banderas. Pero para la interrupción por cambio de estado de RB4-RB7, donde como requisito hay que hacer una lectura/escritura del Puerto B no lo realiza, así que a tenerlo en cuenta.
hola amigo vszener necesito que me ayudes en unas cosillas en c , con el programa para desplegar un mensaje ya que deseo desplegar un mensaje de 30 caracteres lo estoy haciendo con la libreria del ccs lcd.c pero no lo consigo he leido que necesito mover el cursor del lcd pero no se como hacerlo si tienes tiempo te lo agradeceria 1000000 jajaja gracias sigue con tus grandes aportes he aprendido bastante :-/ :-/Para pasar a la siguiente linea solo coloca lcd_gotoxy(1,2); o un lcd_putc("\n");
Hola vszener, tal vez puedas ayudarme, necesito reemplazar el codec HT12E y el decode HT12D con el pic 16f84 o 16F628 (por que no los encuentro, ya estoy esperando mas de tres meses y no llegan al Perú). La idea es enviar un dato en forma serial por cualquier pin del puerto B, cuando se activa un pulsador y recibirlo por un puerto B de otro pic similar, luego al soltar el pulsador, el led se apagará. Lo que quiero es saber el código de la transmisión serial y poder encender un led y apagarlo cuando activo un pulsador en el otro pic. Gracias.Revisa el siguiente ejemplo (http://www.todopic.com.ar/foros/index.php?topic=4530.msg38961#msg38961) de vszener, a partir de ese ya podes ir diseñando el tuyo. Y revisa que vi un par de ejemplos más de comunicación RS23 ;-)
Palmas
value=getchar();
printf("%C",value);#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay (clock=4000000)
#use RS232 (baud=9600,parity=N,xmiT=PIN_C6,rcv=PIN_C7,bits=8)
void main(void)
{
printf(" Bienvenidos... \rSistema Encendido\r");
}
#include <16F877A.h>
#include <string.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay (clock=4000000)
#use RS232 (STREAM= ROBOT, baud=9600,parity=N,xmiT=PIN_C4,rcv=PIN_C5,bits=8)
#use RS232 (STREAM= PC,baud=9600,parity=N,xmiT=PIN_C6,rcv=PIN_C7,bits=8)
char string_robot[16];
char string_pc[16];
int1 kbhit_robot=0; // Para saber si llego dato desde la alarma.
int1 kbhit_pc=0; // Para saber si llego dato desde el modem.
#int_EXT
void ext_isr()
{
gets(string_pc,PC);
kbhit_pc=1;
}
#int_RDA
void rda_isr()
{
gets(string_robot,robot);
kbhit_robot=1;
}
void main(void)
{
printf("esperando dato");
SET_TRIS_C(0b10100000);
ext_int_edge(H_TO_L);
enable_interrupts(int_RDA);
enable_interrupts(int_EXT);
enable_interrupts(GLOBAL);
while(1)
{
while(kbhit_robot==0&&kbhit_pc==0){} //Espero a que llegue dato desde algun dispositivo.
if(kbhit_robot)
{
fprintf(ROBOT,"\n\rEl dato de la alarma fue: %s",string_robot);
}
if(kbhit_pc)
{
fprintf(PC,"\n\rEl dato del modem fue: %s",string_robot);
}
kbhit_robot=0;
kbhit_pc=0; // Reinicio bandera para proxima espera.
}
}
// Luces del auto fantastico por Ralf2, Foro todopic!
#include <16F876a.h>
#device adc = 10
#use delay (CLOCK = 4000000)
#fuses XT,NOWDT,NOLVP
#byte port_b=6
#byte port_c=7
#use fast_io(all)
void main()
{
int x;
port_b=0;
port_c=0;
set_tris_b(0);
set_tris_c(0);
port_b=1;
while(1)
{
for (x=0;x<=14;x++)
{
shift_left(&port_b,2,0);
delay_ms(100);
}
for (x=0; x<=14;x++)
{
shift_right(&port_b,2,0);
delay_ms(100);
}
}
}
#include <18F4550.h> //Libreria del PIC
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN //Configuracion de los fuses:
#use delay (clock=4000000) //Configuramos oscilador a 4Mhz
#include <lcd2.c> //Libreria para la lcd
#include <kbd3x4.c> //Libreria para teclado matricial
#use fast_io(A)
#use fast_io(B)
//---------- PROGRAMA PRINCIPAL ----------------
void main ()
{
char tecla; //almacena tecla pulsada
lcd_init(); //inicializa lcd
lcd_putc("Tecla pulsada:\n");
for(;;){
do{ //espera hasta que se pulse una tecla
tecla=kbd_getc();
}while(tecla==0);
printf(lcd_putc,"%c",tecla); //muestra tecla
lcd_putc("\b"); //retrocede una posicion
} //...infinito
}
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,NOVREGEN,NOPBADEN a ver si resuelve tu problema.Con respecto a las librerías aquí están, ves como no es tan lamentable la filosofia del foro es compartir y compartir y compartir.
Saludos
Desde este enlace os podeis descargar lo necesario para el programa anterior: ClavesVs zener :
Suerte!!! :wink:
El primer ejemplo como no!!! la iluminacion de un led!!!jeje alguien alguna vez a visto programa similar???jeje bueno fuera de bromas por alguno hay que empezar y este es el nivel inferior jeje. El programa consiste en el encendido y apagado d eun led cada 0.5s por el pin RB0 del pueto B:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 6/Agosto/05
//
//Programa: Parpadeo de un led cada 0.5s
//Version: 0.0
//
//Dispositivo: PIC 16F648A Compilador: CCS vs3.227
//Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
//Notas: Parpadeo de un led cada 0.5s por el pin RB0 del puerto B
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(b)
///PROGRAMA
void main(void)
{
set_tris_b(0xFE); //portb como salida(RB0,las demas desactivadas)
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
do{
output_low(PIN_B0); //led off
delay_ms(500);
output_high(PIN_B0); //led on
delay_ms(500);
}while(TRUE); //bucle infinito
}
Seguimos en contacto!<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
Y para empezar con estos "cacharros" que mejor que decir "hola mundo" jeje pues aqui esta!!!!:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 26/Agosto/05
//
// Programa: Hola mundo
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) en la primera linea la
// frase "hola mundo <img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />" y en la segunda linea "VsZeNeR"05". Tener
// en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
//
// Conexiones: B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd
///PROGRAMA
void main(void)
{
lcd_init(); //inicializa lcd
printf(lcd_putc,"hola mundo ; )
VsZeNeR"05" ); //muestra por pantalla el mensaje
}
Jeje ya sabemos encender las lcd"s.....<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
buen dia amigo tengo una pregunta yo le realice una modificación al programa original del 16f648a al 16f88 que el que se consigue en mi pais lo simulo y todo bien pero cuando lo monto en la practica en displey se no funciona correctamente y se coloca a saltar de un digito a otro espero pronta respuesta graciassi ami me paso algo parecido y le baje la tension al pic en 3 volt y me empezo a andar , me parese que no aguanta la corriente el pic hay que ponerle transistores
tengo una duda
Fry: Estoy teniendo una de esas cosas... ya sabes jaquecas con imagenes...
Leela: quieres decir ideas?!
Fray: Si claro eso!!!
Pues siguiendo la politica y filosofia de un profe mi de la universidad, el cual decia: "no pierdas el tiempo en hacer lo fabricado...." he mirado por internet y por el foro una libreria para la lcd y para el teclado, y he hallado una!!!jeje la libreria son de la empresa Microsystems Engineering...aqui dejo el enlace para que os bajeis los ejemplos donde estan la slibrerias kbd2.c y lcd2.c:
<a href="http://www.msebilbao.com/tienda/downloads_ejemplos.php" target="_blank">http://www.msebilbao.com/tienda/downloads_ejemplos.php[/url]
Decir que la libreria lcd2.c es de 8 bits y la del CCS es de 4 bits.....pero bueno ya buscaremos mas o me pondre yo mano a la obra haber que sale!!!jeje....decir quee stas librerias las vamos a usar y tb modificar.....aqui dejo el enlace para que os bajeis las librerias mencionadas y la modificacion del kbd2.c a kbd3x4.c...la modificacion la he hecho porque la kbd2.c es para teclado 4x4 y de momento nosotros vamos a usar teclados 3x4.....
<a href="http://miarroba.com/foros/ver.php?foroid=348538&temaid=3622968" target="_blank">http://miarroba.com/foros/ver.php?foroid=348538&temaid=3622968[/url]
<img src="http://pics.miarroba.com/caretos/wink.gif" alt="Giño" title="Giño" />
Hola amig@s. Aprovechando esta serie de ejemplos que han posteado y muy buenos, quisiera generar una duda respecto a hacer que un led parpadee, les comento la siguiente cuestión: he hecho varios ejemplos sobre esto, pero todos han sido de la misma forma, es decir, cuento por ejemplo con un pulsador conectado en RA0 y cuando lo presiono me genera una salida o serie de salidas en el puerto B para hacer que varios leds parpadeen durante cierto tiempo, pero esto es por cada pulso que le doy al botón. Ahora tengo la siguiente duda: ¿Cómo puedo hacer que un led o varios leds parpadeen cada vez que mantenga presionado un botón? es decir, que una vez que suelte el pulsador el led o los leds dejen de parpadear, quisera saber cómo puedo hacer esto. Gracias y sigan compartiendo tan buenos ejemplos.con instrucciones de control, mientras que el pin x esta en alto, prenda leds, si no apague.
No conocco las patillas tanto del 16f648a ni del LCD de buestro ejercicio.
Gracias por tu rapida atencion KILLERJC. Le e echado un vistazo a las paginas y busquedas que me as dado. Tu informacion es mui concreta a lo que buscaba. Aunque mui engorrosa devido a que esta en ingles. Malo para mi. El traductor que utilizo comete el (error) de traducirme los pines y no respeta los saltos de linea, pero muchas gracias.
Buenas Tardes, tengo la duda de si estos programas funcionan para el PIC 18F4550.
Saludos!
Hola vszener dime ¿que codificador deveria utilizar para un programa como este?
Hola vszener.
No puedo utilizar siempre display de 7 segmentos B podria ser 8 pero nada sustituye a T. Yo probe con un con uno de 14seg para T pero no consegui nada. E vuelto a buscar el dataset pero no consigo una imagen concreta que indique el encendido de sus segmentos desde su pin. ¿Como lo hiciste tu?
. Yo probe con un con uno de 14seg para T pero no consegui nada
Hola KILLERJ (el icono del mensaje deberia ser "confusion) Yo entre en su Tema de ejemplitos para C cada uno de sus ejemplos pinche en citar, dentro de los proyectos de vszener . tu nombre no aparecia por ninguna parte y aun a si los as recibido tu los dos.
Sobre B y T vszener dice utilizar display de 7 segmentos. A mi no me funciono. Ahora que lo vuelbo a mirar utiliza el 6 como b yo no e sabido poner T con uno de 16seg. Me gustaria un dataset grafico. Mas que el codigo.
Tengo problemas a la hora de encontrar el dataset de los componentes. Lo que mas me interesa-gusta los
graficos de estos con la asignacion de sus pines (en estos casos no me importa que esten en ingles). Cuales son
las paginas mas recomendables para ello.
Un dia d lluvia como hoy es mas molesto que tu.
Entiendo lo que dices pero si yo en un terminal de 16-14segmentos solo me interesa la letra T solo necesito 4 terminales (mas los 2 de alimentacion( 1 en Proteus))
Hola amigo estoy tratando de armar tu circuito pero nose k tipos de display usaste ánodo común y como lo conectas si pudieras subir el proteus mil gracias saludos
Desde este enlace os podeis descargar los ficheros del programa anterior: LCD & KEYPAD 3x4
Suerte!!! :wink: