Descripción de la práctica
La siguiente practica consiste en utilizar una placa Arduino UNO, tres multiplexores 74HC595 y dos displays de 7 segmentos con cuatro dígitos.
Una vez montado todo y cargado el código, con un display se contara de cero a 9999 y con el otro, se hará justo lo contrario, de 9999 a cero.
Con un multiplexor se seleccionara la posición de cada display, y con los otros dos multiplexores se marcara el dígito correspondiente en cada display.
Material
- Placa Arduino
- Cables (aprox. 60).
- 3 multiplexores digitales 74HC595
- 2 displays de 7 segmentos con 4 dígitos. (3461BS para esta practica).
- 8 resistencias de 200 ohmios.
Esquema a montar
Los displays del diagrama se han pintado tal y como los que se han utilizado para el montaje (en este caso de ánodo común). Cada display depende de su datasheet.
Código del proyecto
//Pin connected to ST_CP of 74HC595
int latchPin = 8; //cable verde
//Pin connected to SH_CP of 74HC595
int clockPin = 12; //cable azul
////Pin connected to DS of 74HC595
int dataPin = 11; //cable amarillo
//DEfinicion de numeros
#define cero B00010100
#define uno B10110111
#define dos B00101100
#define tres B00100101
#define cuatro B10000111
#define cinco B01000101
#define seis B01000100
#define siete B00110111
#define ocho B00000100
#define nueve B00000101
//Definicion digito
#define displayPos1 B00010001
#define displayPos2 B00100010
#define displayPos3 B01000100
#define displayPos4 B10001000
//definicion de valores
int val_1_1=-1;
int val_1_2=0;
int val_1_3=0;
int val_1_4=0;
int val_2_1=10;
int val_2_2=9;
int val_2_3=9;
int val_2_4=9;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
}
void loop() {
iniciaDisplays();
}
void iniciaDisplays(){
updateValues();
for(int i=0;i<40;i++){
writeDigit(1);
writeDigit(2);
writeDigit(3);
writeDigit(4);
}
}
void writeDigit(int posicion){
digitalWrite(latchPin, 0);
switch (posicion) {
case 1:
sendNumber(displayPos1,val_1_1,val_2_1);
break;
case 2:
sendNumber(displayPos2,val_1_2,val_2_2);
break;
case 3:
sendNumber(displayPos3,val_1_3,val_2_3);
break;
case 4:
sendNumber(displayPos4,val_1_4,val_2_4);
break;
}
digitalWrite(latchPin, 1);
}
void sendNumber(byte posicion,int valor_1,int valor_2){
switch (valor_2) {
case 0:
shiftOut(dataPin, clockPin, cero);
break;
case 1:
shiftOut(dataPin, clockPin, uno);
break;
case 2:
shiftOut(dataPin, clockPin, dos);
break;
case 3:
shiftOut(dataPin, clockPin, tres);
break;
case 4:
shiftOut(dataPin, clockPin, cuatro);
break;
case 5:
shiftOut(dataPin, clockPin, cinco);
break;
case 6:
shiftOut(dataPin, clockPin, seis);
break;
case 7:
shiftOut(dataPin, clockPin, siete);
break;
case 8:
shiftOut(dataPin, clockPin, ocho);
break;
case 9:
shiftOut(dataPin, clockPin, nueve);
break;
}
switch (valor_1) {
case 0:
shiftOut(dataPin, clockPin, cero);
break;
case 1:
shiftOut(dataPin, clockPin, uno);
break;
case 2:
shiftOut(dataPin, clockPin, dos);
break;
case 3:
shiftOut(dataPin, clockPin, tres);
break;
case 4:
shiftOut(dataPin, clockPin, cuatro);
break;
case 5:
shiftOut(dataPin, clockPin, cinco);
break;
case 6:
shiftOut(dataPin, clockPin, seis);
break;
case 7:
shiftOut(dataPin, clockPin, siete);
break;
case 8:
shiftOut(dataPin, clockPin, ocho);
break;
case 9:
shiftOut(dataPin, clockPin, nueve);
break;
}
shiftOut(dataPin, clockPin, posicion);
}
void updateValues(){
//primer display
val_1_1++;
if(val_1_1==10){
val_1_1=-1;
val_1_2++;
if(val_1_2==10){
val_1_2=0;
val_1_3++;
if(val_1_3==10){
val_1_3=0;
val_1_4++;
if(val_1_4==10){
val_1_4=0;
updateValues();
}
}
}
}
if(val_1_1<0){
val_1_1=0;
}
//segundo display
val_2_1--;
if(val_2_1==-1){
val_2_1=10;
val_2_2--;
if(val_2_2==-1){
val_2_2=9;
val_2_3--;
if(val_2_3==-1){
val_2_3=9;
val_2_4--;
if(val_2_4==-1){
val_2_4=9;
updateValues();
}
}
}
}
if(val_2_1==10){
val_2_1=9;
}
}
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
}
El método shiftOut esta copiado de la pagina de Arduino y su ejemplo de como utilizar varios multiplexores 595.
No hay comentarios:
Publicar un comentario