Define pin con variable array en C de CCS

pues asi es siempre debes usar resistencias para cada led, yo tramposamente si uso un decodificador 74ls47 y en el catodo le pongo una resistencia de 1k , no pasa nada, si deberia tener cada segmento su resistencia pero asi le hago para no usar tantas.

en realidad es muy simple lo que puedes hacer.

1 display de 4 digitos a 7 segmentos puede ser controlado con un 74ls47. 4 bits sirven para el decodificador BCD, los otros 4 bits sirven para seleccionar cada display

ahora si puedes usar un 74hc595 solo usarias 3 pines del micro el 74hc595 serviria como un puerto extra

digamos que haces una libreria para el 74hc595 y quedaria algo asi:

include<74hc595.h>

y la fucnion

port595( 0xFF );

se usaria exactamente igual a un puerto B pero seria de solo salida
 
muchas gracias D@rkBytes, ya sé que me hablaron de mascaras pero eso es un camino oscuro para mi, un mundo desconocido donde tus pesadillas se hacen realidad. Pero voy a leer acerca de ese tema. no lo domino por eso no me he lanzado al agua. postdata: "no se porque me complico la vida"
pero aqui vooooooy.



gracias alesergi, tu si me entendiste, pero lastimosamente las mascaras de bits es un tema desconocido para mi por ahora. pero lo intentaré.
 
Última edición:
pero las mascaras no son dificiles de usar.

un ejemplo es este

tenemos este byte
10101101

y queremos los 4 bits de la derecha los de la izquierda no nos interesan lo que hacemos es una AND
00001111

es decir la AND solo dejara pasar los que estan en 1 los que estan en 0 no pasaran

10101101
00001111
_____________
00001101

como vemos solo deje pasar los 4 bits de la derecha

ejemplo:

char byte1= 0b10111010;
char variable;


digamos que le queremos hacer una AND con lo que hay en la variable byte1

variable= 0b10111010 & 0b00001111;

y eso es todo.

variable ahora vale 0b00001010
 
Muchas gracias D@rkbytes. Ya sé que me hablaron de mascaras pero eso es un camino oscuro para mi, un mundo desconocido donde tus pesadillas se hacen realidad.
Pero voy a leer acerca de ese tema. No lo domino, por eso no me he lanzado al agua.
Es muy sencillo y ya te lo explicaron.

Adjunto un ejemplo de un contador por interrupción externa (RB0) usando un tipo de máscara para este pin.

El resto de pines (RB7<>RB1) serán usados para los segmentos de dos displays en modo multiplex.
 

Adjuntos

  • 16F628A Contador 0-99 por RB0 con displays 7 segmentos.rar
    50.9 KB · Visitas: 22
Última edición:
GRACIAS Trilo-byte:
por la explicación, tenias mucha razón no son difíciles. juego de niños. pero tuve que leer, aclaro no quería leer.(problema común).

usando un AND y ponemos unos a los bits que no queremos modificar, luego un OR y ponemos ceros a los bits que no queremos modificar.

en mi caso no es necesario el AND. ya que solo el primer bit esta declado como 1. y el resto es cero. solamente necesito usar el OR Y LISTO.
TRISA = 0b00000001
para el 2:
portb = portb | 0b01001000
como el primer bit es 1, al ejecutar OR siempre me dara "1" solo me cambia los ultimos 7 bits


GRACIAS D@RKBYTE. gracias por el ejemplo aunque ya lo había resuelto, pero tu ejemplo esta super interesante eres todo todo un profesional ya que utilizaste el corrimiento de bits para no afectar RB0 voy a estudiarlo detenidamente.

ya puedo morir en paz, saludos desde Guatemala. yaaaajuuuuuuuuuu
 
Disculpen, pero no encontraba dónde postear mi pregunta, pero en fin, ya que yo abrí este tema relacionado a los display 7 segmentos y solucioné mi problema usando mascaras de bits sugerido por AleSergi, ahora toca el señor Arduino.
Tengo el siguiente código, aclaro que no es mío, y deshabilité algunas instrucciones para un display 7segmentos.
El problema es que se queda colgado, empieza funcionando bien y se queda colgado como si se llenara la memoria.
¿Alguien me puede echar una mano para que no se cuelgue?
El ide de arduino me dice que existe un problema en el bucle for, pero no veo cuál es.
Les agradezco de antemano la ayuda.
C++:
#define Nled 7 //Se define la cantidad de LED a usar

int led[Nled]={2,3,4,5,6,7,8}; // Puertos usados para cada LED
//int frec = 500; // Frecuencia por defecto

void setup()
{
  for(int i=2; i < 9; i++){ // Inicializando pines digitales a usar como salida
    pinMode(i,OUTPUT);
  }
}

void loop()
{
  //frec = analogRead(A0); //Leyendo valor entre 0 y 1023
  ledSecuense1(); // Ejecutando la funcion
}

/*
  Funcion ledSecuense1():
Utilizando el bucle for se recorren los pines asignados
a cada LED uno a uno prendiendo el seleccionado
y apagando el anterior, todo esto por medio de la variable i
la cual se declara en el mismo bucle.
La frecuencia con la cual ocurren estos eventos se controla
con la funcion delay.
*/
void ledSecuense1()
   {
     for(int i=0; i < 8; i++)
     {   
    digitalWrite(led,HIGH);
    digitalWrite(led[i-1],LOW);
    //delay(frec);
    delay(200);     
    }
}
 
Funcion ledSecuense1(): Utilizando el bucle for se recorren los pines asignados a cada LED uno a uno prendiendo el seleccionado y apagando el anterior, todo esto por medio de la variable i la cual se declara en el mismo bucle. La frecuencia con la cual ocurren estos eventos se controla con la funcion delay.
No programo en arduino, pero por lo que comentas en el código, me parece que debería ser así:
C++:
#define Nled 8 // Se define la cantidad de LED a usar.

int led[Nled]={0, 1, 2, 3,4, 5, 6, 7}; // Pines usados para cada LED
int frec; // Variable para la frecuencia del retardo.

void setup (void)
{
  for(int i = 0; i < 8; i ++) // Inicializando pines digitales a usar como salida.
    pinMode(i, OUTPUT);
}

void loop (void)
{
  ledSecuense1(); // Ejecutar la subrutina.
}

/*
Subrutina ledSecuense1():
Utilizando el bucle for se recorren los pines asignados
a cada LED uno a uno prendiendo el seleccionado
y apagando el anterior, todo esto por medio de la variable i,
la cual se declara en el mismo bucle.
La frecuencia con la cual ocurren estos eventos se controla
con la instrucción delay.
*/
void ledSecuense1 (void)
{
    for(int i = 0; i < 8; i ++)
    {
      frec = analogRead(A0); // Leyendo valor entre 0 y 1023
      digitalWrite(led[i], HIGH);
      delay(frec);
      digitalWrite(led[i], LOW);
    }
}
 
Por el foro hay un ejemplo que subí para usar dos display de siete segmentos multiplexado.
Por supuesto el código es delayless va por interrupciones y timers.
https://www.google.com/url?sa=t&sou...Vaw1MYo5VCsj4ET5Ia-R6eD8g&cshid=1576049596755


muchas gracias scooter pero no estoy multiplexando, solo corregir mi código se cuelga el arduino.

No programo en arduino, pero por lo que comentas en el código, me parece que debería ser así:
C++:
#define Nled 8 // Se define la cantidad de LED a usar.

int led[Nled]={0, 1, 2, 3,4, 5, 6, 7}; // Pines usados para cada LED
int frec; // Variable para la frecuencia del retardo.

void setup (void)
{
  for(int i = 0; i < 8; i ++) // Inicializando pines digitales a usar como salida.
    pinMode(i, OUTPUT);
}

void loop (void)
{
  ledSecuense1(); // Ejecutar la subrutina.
}

/*
Subrutina ledSecuense1():
Utilizando el bucle for se recorren los pines asignados
a cada LED uno a uno prendiendo el seleccionado
y apagando el anterior, todo esto por medio de la variable i,
la cual se declara en el mismo bucle.
La frecuencia con la cual ocurren estos eventos se controla
con la instrucción delay.
*/
void ledSecuense1 (void)
{
    for(int i = 0; i < 8; i ++)
    {
      frec = analogRead(A0); // Leyendo valor entre 0 y 1023
      digitalWrite(led[i], HIGH);
      delay(frec);
      digitalWrite(led[i], LOW);
    }
}

no mi amigo el codigo es para encender 7 leds enciendo uno apago otro por eso la expresión digitalwrite(led[i-1] enciende uno y apaga el anterior. siempre gracias.
 
muchas gracias scooter pero no estoy multiplexando, solo corregir mi código se cuelga el arduino.

A ver si te aclaras porque antes decías que no era tuyo y ahora sí que es tuyo. Las normas del foro dicen claramente que si traes algo de otro sitio que preguntes en ese sitio del que lo has sacado.

no mi amigo el codigo es para encender 7 leds enciendo uno apago otro por eso la expresión digitalwrite(led[i-1] enciende uno y apaga el anterior. siempre gracias.
¿Que sentido tiene ese baile con un solo display?
Bueno, quizás una cuestión decorativa. Supongo.
 
Última edición:
Scooter: 1ro. el código lo he modificado así ya no puedo preguntar donde lo descargue, 2do. ya no me acuerdo donde lo baje, el ejemplo original es para hacer un vumetro de 7 leds. por eso hay lectura de una entrada analógica (analogRead(A0) ), yo lo quiero usar para controlar un display 7 segmentos, cada segmentos esta formado por 4 leds y es controlado por transistores, solo quiero entender el código para completar mi proyecto y 3ro. apenas 2 días llevo con los arduinos, usaba pics con asm y css. pero quiero dominar arduinos en 7 días. espero haberme explicado. y gracias.


AleSergi no es ese el problema, lo que pasa es que el indice del arreglo en el for es 7, si ves al principio del código solo tengo 7 elementos y un arreglo empieza por cero eso significa que el numero literal o final es 6 y en el bucle for hago referencia a 7 elementos causando un desborde. espero haberme explicado. y gracias nuevamente


D@rkbytes
Lo que en realidad quiero hacer es un display grande programable via bluetooth, usando leds para cada segmento tendrá al menos 25 leds cada uno y utilizaré un transistor por cada segmento, para programarlo utilizare un módulo bluetooth porque el display estará en lo alto, quiero ponerle una animación a los display indicando que se ha guardado los numero digitados.
muchas gracias por tu ayuda.
 
Cómo?
Al resolver algo, ya que preguntas, también esta bien visto dejar la solución, aunque sea para un caso particular, quizás a otro le sirva, aunque sea de base


DJ T3 : para fomentar la lectura ahí lo menciono solo es de sustituir el 8 por el 7 en el bucle for en la función ledSecuense1(), además aquí esta prohibido el mínimo esfuerzo.
 
Atrás
Arriba