Autor Tema: mi 1º programa - control de display de 7 segmentos  (Leído 3553 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dssss

  • PIC10
  • *
  • Mensajes: 7
mi 1º programa - control de display de 7 segmentos
« en: 25 de Enero de 2009, 23:00:51 »
hola a todos hace poco que empece con los pics amos cosa de menos de una semana y bueno decirles que aunque me ha costado arrancar de lo lindo, sobretodo la configuracion del ccs xDD, he aqui mi 1º programa que consigo acabar y simular con el proteus satisfactoriamente no es mucho pero bueno mi siguiente asignatura sera algo con el timer, ya vere que puedo acer con lo que tengo en el armario  :D

se trata como bien dice el titulo de un simple programa que controla un display de 7 segmentos, en mi caso de anodo comun que son los que tengo en el armario, un ejemplo que la verdad viendolo se puede extraer mucha informacion ya que yo he aprendido a acerlo a partir de empollar otros programas , sin mas les dejo con el programa preparado para compilar en ccs.

PD: implementados solo 2 bits para ahorrar tiempecillo [0-3]

Pic usado : pic16f84A

Código: [Seleccionar]
/* Control display 7 seg - imp 2 bit*/

#include <16f84A.h>
#include <stdio.h>

#FUSES HS,NOWDT,NOPROTECT,PUT  //defino fusibles a activar cuando lo pase por el grabador
#use delay (clock=8000000)     //podria ponerle 20mhz pero tampoco lo quiero quemar explotandolo al maximo
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7) //defino puerto b


void confpuertos();

void main()
{
confpuertos();

while(1)
{
if((input(PIN_A1)==0)&&(input(PIN_A0)==0))  // port a = 0
{
output_b(0xC0);  //salida port b
}
if((input(PIN_A1)==0)&&(input(PIN_A0)==1)) //port a = 1
{
output_b(0xF9);  //salida port b
}
if((input(PIN_A1)==1)&&(input(PIN_A0)==0))  //port a = 2
{
output_b(0xA4);  //salida port b
}
if((input(PIN_A1)==1)&&(input(PIN_A0)==1)) //port a = 3
{
output_b(0xB0);  //salida port b
}

}
}



void confpuertos()
{
disable_interrupts(GLOBAL);  //desactivo interrupciones
set_tris_a(0xff);  //puerto A como entrada
set_tris_b(0x00); //puerto B como salida

return;

}
   

Un saludo de mi parte

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: mi 1º programa - control de display de 7 segmentos
« Respuesta #1 en: 25 de Enero de 2009, 23:18:03 »
hola dssss! Te felicito por tu avance, dale duro y parejo q esto se aprende rapido. Te recomiendo q leas mucho codigo, aca en el foro vas a encontrar miles de ejemplos.
Con respecto a tu programa, te doy una sugerencia. Para ahorrar codigo, podes definir un arreglo que contenga los numeros del 0 al 9. Por ej. previamente tenes q decirle al compilador q trate al puerto b como un byte:
Código: [Seleccionar]
#byte port_a=0x05
#byte port_b=0x06
despues definis el arreglo q contiene los numeros del 0 al 9:
Código: [Seleccionar]
int8 num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};y por ultimo, como dije, para sacar un valor x:
Código: [Seleccionar]
portb=num[x];Podrias sacar directamente el valor q se esta ingresando por el puerto A:
Código: [Seleccionar]
portb=num[porta];
suerte y saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: mi 1º programa - control de display de 7 segmentos
« Respuesta #2 en: 26 de Enero de 2009, 00:21:09 »
Te felicito por tu primer programa dssss. Algunas acotaciones:

La línea:
Código: [Seleccionar]
#include <stdio.h>
es innecesaria, porque no estas utilizando la librería en cuestión. Quedate tranquilo de todas formas CCS no la incluye al compilar el programa si no se utiliza, por lo que no ocupas espacio extra.

Código: [Seleccionar]
#use delay (clock=8000000)     //podria ponerle 20mhz pero tampoco lo quiero quemar explotandolo al maximo
Tu comentario es lo que no comprendo. Lo que pones en el clock=xxxxx no puede tener cualquier valor, debe ser igual al valor del cristal con el que funciona el PIC, caso contrario el compilador generará mal las rutinas de retardo y temporización.

Código: [Seleccionar]
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7) //defino puerto b
Código: [Seleccionar]
set_tris_a(0xff);  //puerto A como entrada
set_tris_b(0x00); //puerto B como salida

Si quieres simplificar un poco, puedes eliminar esos dos pedazos de código, CCS asigna las direcciones de los puertos automaticamente.

Código: [Seleccionar]
return;
No es necesario colocar el return en los procedimientos, en CCS solo hay que colocar explicitamente el return cuando hay que devolver algun valor en una funcion.

Creo que lo demás lo ha dicho gera. Saludos.


"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado dssss

  • PIC10
  • *
  • Mensajes: 7
Re: mi 1º programa - control de display de 7 segmentos
« Respuesta #3 en: 29 de Enero de 2009, 19:12:50 »
gracias por responderme , la verdad que la idea de usar una matriz para definir los valores del display no se me habia ocurrido. en cuanto a lo de usar un puntero a la direccion del registro queria acerlo pero era de noche y na no habia muchas ganas d mirar que direciones tenian xDDDD pero igualmente se agradece.

<code>
#use delay (clock=8000000)     //podria ponerle 20mhz pero tampoco lo quiero quemar explotandolo al maximo
</code>

por ultimo lo que queria decir aqui era que para lo que ace el programa no vale la pena meterle el cristal de 20 mhz con otro d 8 que engo por aki vale de sobra

un saludo y gracias por vuestras respuestas de nuevo


 

anything