Direccionamiento indirecto en PIC 16f876a para display de 7 segmentos

Hola a todos, este es mi primer mensaje en el foro.

Estoy realizando unas prácticas en la universidad con un PIC16f876a y tengo un problema:

Tengo que realizar un contador descendente de 9 a 0 (cada numero dura 1 sg) y debe ir mostrándose por un display de 7 segmentos. Tengo los bucles realizados mediante interrupciones con TMR0 ya que nos lo pide expresamente mediante este método.

Mi duda es que en la práctica me pone que es "direccionamiento indirecto" para pasarle los datos a PORTC y encender el display, y no tengo muy claro como hacerlo mediante este método, y por otro lado tampoco se que dato debo pasarle a PORTC para que se encienda con el numero correcto, es decir supongo que tengo que asignar un código binario a cada número pero no me han dado especificaciones para el display.

Gracias por adelantado!
 
Trabajan con una placa de desarrollo? Tenes esquema? A partir de ello estableces el dato binario que tiene que salir por el puerto C. Luego vemos el direccionamiento indirecto.

 
Trabajan con una placa de desarrollo? Tenes esquema? A partir de ello estableces el dato binario que tiene que salir por el puerto C. Luego vemos el direccionamiento indirecto.

Ahora que dices eso, no tengo el esquemático de la tabla ( es un pic school pero no se mucho más), imagino que voy conectando RC0,RC1,...,RC7 a cada uno de los segmentos (a,b,c...) y entonces debería conseguir que cada vez que busque que cambie el display, el dato que salga por PORTC sea diferente para encender los segmentos adecuados y en el orden que busco.

Sabría ir sacando ese dato (a falta de confirmar cual es la conexion que debo hacer que la mirare en el laboratorio el viernes), me faltaría saber como ir pasando esos datos con direccionamiento indirecto.
 
para no complicarte tanto la vida dibujando todos los numeros y sobre todo para no ocupar todo el puerto

¿por que no ocupas un decodifidador BCD?

ahora si puedes enviar datos crudos por el puerto C ejemplo:

char numero;
numero =5; //se va a mostrar el numero 5 en el display
portc=numero;

bueno eso es en el caso de tener conectado el display con un decodificador como es el 74ls47.


pero si lo haces por dibujado de display ocupas todo el puerto seria algo mas o menos asi:
primero debes tener un array con todos tus numeros dibujados yo pondre numeros al azar.

unsigned char display[10] = {0b11101111,11101000,000011111,..... etc};
unsigned char numero;


numero=8; //cargamos la variable numero con un numero cualquiera
portc=display[numero]; //el aray se movera hasta el numero supuestamente dibujado
 
para no complicarte tanto la vida dibujando todos los numeros y sobre todo para no ocupar todo el puerto

¿por que no ocupas un decodifidador BCD?

ahora si puedes enviar datos crudos por el puerto C ejemplo:

char numero;
numero =5; //se va a mostrar el numero 5 en el display
portc=numero;

bueno eso es en el caso de tener conectado el display con un decodificador como es el 74ls47.


pero si lo haces por dibujado de display ocupas todo el puerto seria algo mas o menos asi:
primero debes tener un array con todos tus numeros dibujados yo pondre numeros al azar.

unsigned char display[10] = {0b11101111,11101000,000011111,..... etc};
unsigned char numero;


numero=8; //cargamos la variable numero con un numero cualquiera
portc=display[numero]; //el aray se movera hasta el numero supuestamente dibujado

Hola y muchas gracias por la respuesta. Estamos limitados a usar solo la placa asi que la idea del array es la mejor, pero debo hacer direccionamiento indirecto puesto que programamos en ensamblador en el entorno MPLAB.

No he creado arrays ni tablas en este entorno todavia pero me imagino que la unica manera seria ir declarando uno a uno todos los numeros
 
Hola ubico, un detalle que se te olvido mencionar es el lenguaje en le que estas haciendo el programa. Me parece mas coherente que sea en asm por eso de los tipos de direccionamiento...inmediato, directo, indirecto, indexado...Si es asi básicamente tienes que utilizar los registroa INDF y SFR
 
Última edición:
bueno eso complica la cosa en pleno siglo 21 2017 aun usando ASM pues se me hace absurdo ya hace 11 años me decian que ni estudiara ASM pues es de cavernicolas pero bueno.

yo que tu usaba directo un decodificador.

ahora si estas usando ASM puedes pasar esto rapidamente a ensamblador:

char numero;
numero =5; //se va a mostrar el numero 5 en el display
portc=numero;


;funcion para mover numeros

registro = numero
portc = registro

como se ve solo meto el numero al registro o puedes meter el numero directamente al registro.
a la salida del puerto puedes conectar el decodificador y asi te ahorras tiempo en programar
 
Arriba