Hola saludos, pues he posteado ya algunas cosillas aparte, jaja, ahora aca va el junto, pues me he pasado el dia tratando de encontrar una solución y buscando el error que no lo he encontrado. Se tarata de una especie de calculadora, ya qeu despliega el resultado mediante 5 displays, e ingresa los datos mediante un teclado matricial, los displays deben estar multiplexados por el microcontrolador, debo hacerlo en el 16f84a (si se puede, ya he visto, no he acabado el programa ya que debe sumar multiplicar y dividir y reconocer división entre cero y no debe mostrar resultados negativos, ni con punto flotante, y numero maximo a desplegar será 99999, ahh y no debo usar decodificador)
aca parte de mi codigo, digo parte, porque no lo he acabado, falta hacer las operaciones con cualquier dato de ingreso, aca solamente trato de ingresar dos numeros, sumarlos y mostrar el resultado en los displays (sumar directamente sin presionar la tecla de suma, solo por motivos de prueba, despues solucionado el problema que he tenido ya sera mas sencillo, creo). Ahh si he cometido errores garrafales de programación como no usar punteros, es porque no funcionaba, ya que compilaba, pero no funcionaba como cuando lo hice de esta manera:
#include<16F84A.h>
#include<teklado.c> //esta es mi libreria para manejo del teclado
// devuelve el codigo ascii de la tecla presionada, mediante la función: kbd_getc()
#fuses XT,NOWDT,PUT,NOPROTECT
#use delay(clock=4000000)
#byte port_a=5
#byte port_b=6
#use fast_io(a)
#use fast_io(b)
unsigned int CONST LED [11]={0x00,0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0e,0xfe,0xde};
int dato1 [5],dato2 [5],total[5],dig1,dig2,dig_r;
int32 num1=0,num2=0,result=0;
int i,cont,pin=44; // pin 44 asignado a RA4, 63 a RA3..., 60 a RA0; esto esta en el 16f84a.h
char c,c2;
void entero(int32 num,int dig,int dato[]) // funcion para convertir a entero un dato array
{ // el int obtenido se guarda en num, dig es la cantidad de digitos; y dato es el array a cambiar a int
num=0;
cont=1;
do
{
num=num+dato[dig-1]*cont;
cont=cont*10;
dig--;
}while(dig!=0);
}
void array(int32 resultado) // funcion para convertir de int a array
{ // resultado es el numero int que se quiere desea convertir a array
i=0;
do
{
total[i]=resultado%10;
resultado/=10;
i++;
}while(resultado!=0);
dig_r=i; // digitos resultado
}
void mux(int v_mux[]) // función de multiplexación
{
set_tris_b(0x01); // displays
pin=44;
for(i=0;i<5;i++)
{
port_b=LED[v_mux[i]+1]; // se despliega dato
// use +1 porque pretendo hacer que no se muestre nada en los displays qeu no tengan datos,
// no lo logre por el momento, si podeis ayudarme con ello
output_high(pin); // displays de cátado común, se activa cátodo correspondiente
delay_ms(50); // retardo para observación contínua
output_low(pin); // apagamos display, para pasar al siguiente
delay_ms(50); // retardo para observación continua
pin--; // cambiamos de pin
}
}
void cargar(int dato[],int dig) // funcion para cargar datos del teclado a un array
{ // dato sera el que contenga las teclas presionadas, en dig se guardará la cantidad de digitos que se presiono
i=0;
set_tris_b(0xf0); // teclado
while(true)
{
do
{
c=kbd_getc(); // se guarda la tecla presionada
}while(c==0); // se pide presion de tecla, mientras no se presione niguna
do
{
c2=kbd_getc(); // ya que si usas c de nuevo perderías el valor de la tecla
}while(c2!=0); // de acá no sale hasta que no sueltes la tecla
if(c=='*') // se presiono *, para terminar?
break;
if(c!=0)
{
dato[i]=c-'0'; // guardo dato char c a int dato (conversion)
i++; // hasta presionar *
dig=i;
}
}
}
void main()
{
set_tris_a(0xe0); // el puerto A como salidas para los transistores de multiplexación (use transistores 2n3904 =npn)
port_b_pullups(true); // activa pull up del puerto b, no hará falta conectar resistencias
port_a=0; // inicialización puertos
port_b=0;
for(i=0;i<5;i++) // inicialización variables para datos y resultado
{
dato1[i]=0;
dato2[i]=0;
total[i]=0;
}
while(true) // ciclo de programa
{
cargar(dato1,dig1); // cargo un dato en dato1 (mediante ingreso por teclado), y guardo cantidad de digitos en dig1
entero(num1,dig1,dato1); // convierto a entero dato1
mux(dato1); // visualizo en displays dato1
cargar(dato2,dig2); // cargo otro dato en dato2 (teclado tb), y su cantidad de digitos en dig2
entero(num2,dig2,dato2); // convierto a entero dato2
mux(dato2); // visualizo en displays dato2
result=num1+num2; // realizo la suma
array(result); // conviero el resultado de la suma en array
mux(total); // visualizo el resultado total en displays
}
}
este es todo el codigo que he realizado y funciona mas o menos, ya que no me muestra el resultado, talvez he cometido errores muy tontos, disculpen por ello, talvez sea mejor con los punteros, no recuerdo muy bien como manejarlos, me refrescan la memoria? osea para que sirve el * y para que el &
o bueno cualquier ayuda que se pueda para que mi programa funcione correctamente me vendrá de maravilla.
ahh talvez aclararles que usé CCS version 4.013, ya que alguna vez recuerdo que queria usar los numeros de los pines con la version 3.242 y no me compilaba; pero con la 4 nome dio ningun problema al compilar y funciona de maravilla esa parte.
os dejo tb la simulación que hice con el proteus 6.9 sp4
muchas gracias, adios!