You are on page 1of 30

Microelectrnica

Parte 8: Arreglos + Matriz


de puntos + Teclado
Autor: Mauricio Galvez Legua
(mgalvez@uni.edu.pe)

Arreglos (Array)
El manejo de arreglos nos permite poder almacenar
una serie de valores y acceder a ellos mediante un
ndice.

Arreglos (Array)
Ejemplo: En el siguiente programa visualizamos en
el display los dgitos del 0 al 9 y en la barra de leds
una serie de datos. Se ha definido dos arreglos: uno
para la barra de leds (ledB) y otro para el display
(displayD)

Arreglos (Array)
#include <xc.h> // Librera de XC8
//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char i;
char ledB[10]
= {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,
0b00100000,0b01000000,0b10000000,0b00001111,0b11110000};
char displayD[10]
= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
TRISB = 0;
PORTB = 0;
TRISD = 0;
PORTD = 0;
while(1){
for(i=0; i<10; i++){
PORTB = ledB[i];
PORTD = displayD[i];
__delay_ms(500);
}
}
}

Arreglos (Array)

Arreglos (Array)
Ejemplo: En el siguiente programa visualizamos en
la matriz de display los dgitos del 0 al 7 en forma
multiplexada. El programa es relativamente simple
por que se ha definido un arreglo para los datos de
multiplexacin (mux).

Arreglos (Array)

Arreglos (Array)
#include <xc.h> // Librera de XC8
//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char i;
char mux[8]={0b11111110,0b11111101,0b11111011,0b11110111,
0b11101111,0b11011111,0b10111111,0b01111111};
char display[8]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};
TRISC = 0;
PORTC = 0;
TRISD = 0;
PORTD = 0xFF;
while(1){
for(i=0; i<8; i++){
PORTC = display[i];
PORTD = mux[i];
__delay_ms(5);
PORTD= 0xFF;
}
}
}

Manejo de Matriz de Puntos


Existe una gran variedad de matriz de puntos que el
Proteus tiene en sus libreras. Nosotros vamos a
trabajar con los formatos 8x8 y 5x7:

Ambos display son de ctodo comn. Dependiendo


de como se coloquen en el circuito podemos tener
dos formas de trabajarlos.
9

Manejo de Matriz de Puntos


La matriz de puntos por
columnas (normal): Aplicable
cuando
queremos
mostrar
mensajes en forma horizontal.

10

Manejo de Matriz de Puntos


La matriz de puntos por filas
(mirror): Aplicable cuando
queremos mostrar mensajes en
forma vertical.

11

Manejo de Matriz de Puntos


Para poder utilizarlo de esta forma debemos
"voltear" a la matriz mediante la opcin Mirror:

12

Ejemplo (P10A): Trabajando con matriz por filas


Para implementar este programa lo primero que
debemos hacer es definir nuestra matriz de
caracter en funcin al pinout indicado lneas arriba.
Para el ejemplo vamos a displayar el caracter A:

13

Ejemplo (P10A): Trabajando con matriz por filas


El circuito en Proteus es:

14

Ejemplo (P10A): Trabajando con matriz por filas


El programa es:

#include <xc.h> // Librera de XC8


//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char i;
char mux[8]={0b11111110,0b11111101,0b11111011,0b11110111,
0b11101111,0b11011111,0b10111111,0b01111111};
char display[8]={0x3C,0x42,0x42,0x42,0x7E,0x42,0x42,0x42};
TRISB = 0;
PORTB = 0;
TRISD = 0;
PORTD = 0xFF;
while(1){
for(i=0; i<8; i++){
PORTB = display[i];
PORTD = mux[i];
__delay_ms(5);
PORTD= 0xFF;
}
}
15
}

Ejemplo (P10B): Trabajando con matriz por


columnas
Para implementar este programa lo primero que
debemos hacer es definir nuestra matriz de
caracter en funcin al pinout indicado lneas arriba.
Para el ejemplo vamos a displayar el caracter A:

16

Ejemplo (P10B): Trabajando con matriz por


columnas
El circuito en Proteus es:

17

Ejemplo (P10B): Trabajando con matriz por


columnas
El programa
es:

#include <xc.h> // Librera de XC8


//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char i;
char mux[8]={0b00000001,0b00000010,0b00000100,0b00001000,
0b00010000,0b00100000,0b01000000,0b10000000};
char display[8]={0xFF,0x80,0x77,0x77,0x77,0x77,0x80,0xFF};
TRISB = 0;
PORTB = 0xFF;
TRISD = 0;
PORTD = 0;
while(1){
for(i=0; i<8; i++){
PORTB = display[i];
PORTD = mux[i];
__delay_ms(5);
PORTD= 0;
}
}
}
18

Ejemplo (P10C):
Programa en "C" que displaya el mensaje UNI,
segn el formato siguiente:

Observar que el PORTD es el que multiplexa a las


dos matrices.
19

Ejemplo (P10C):
El circuito en Proteus es:

20

Ejemplo (P10C):
El programa es:

#include <xc.h> // Librera de XC8


//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char i;
char mux[8]={0b00000001,0b00000010,0b00000100,0b00001000,
0b00010000,0b00100000,0b01000000,0b10000000};
char display1[8]={0x00,0x00,0xFE,0xFE,0x00,0x00,0xFF,0x00};
char display2[8]={0x00,0xCF,0xE7,0x00,0x00,0xFF,0x00,0x00};
TRISB = 0;
PORTB = 0xFF;
TRISC = 0;
PORTC = 0xFF;
TRISD = 0;
PORTD = 0;
while(1){
for(i=0; i<8; i++){
PORTB = display1[i];
PORTC = display2[i];
PORTD = mux[i];
__delay_ms(5);
PORTD= 0;
}
}
21
}

Ejemplo (M1):
Ejemplo (M1): Se tiene un microcontrolador
PIC16F877A que tiene conectado una matriz de
leds en arreglo por filas. Se pide elaborar un
programa que permita:
Tener un cursor (led encendido) en la primera fila (y=0)
con el valor: 00000001 (x=0).
El cursor debe desplazarse de derecha a izquierda cada
400 milisegundos.
Al llegar el cursor al otro extremo (x=7), se debe reiniciar
la secuencia.
Mediante la variable denominada y, podemos cambiar
la fila de visualizacin. Por ejemplo en el siguiente
grfico se observa el "1" ubicado en y=3.
22

Ejemplo (M1):

23

Ejemplo (M1):
#include <xc.h> // Librera de XC8
#include <math.h>
//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char x=0,y=3;
char display;
TRISB = 0;
PORTB = 0;
TRISD = 0;
PORTD = 0xFF;
while(1){
PORTB = (char)pow(2,x);
PORTD = ~(char)pow(2,y);
__delay_ms(400);
PORTD= 0xFF;
if (x<7)
x++;
else{
x=0;
}
}
}

24

Ejemplo (M2):
Modificar el programa anterior para:
Tener un cursor (led encendido) en la primera fila (y=0)
con el valor: 00000001 (x=0).
El cursor debe desplazarse de arriba hacia abajo cada
400 milisegundos.
Al llegar el cursor al otro extremo (y=7), se debe reiniciar
la secuencia.
Mediante la variable denominada x, podemos cambiar
la columna donde se ubica el "1". Por ejemplo en el
siguiente grfico se observa el "1" ubicado en x=3.

25

Ejemplo (M2):

26

Ejemplo (M2):
#include <xc.h> // Librera de XC8
#include <math.h>
//Configuracin del PIC16F877A
#pragma config CP=OFF,DEBUG=OFF,WRT=OFF,CPD=OFF,LVP=OFF
#pragma config BOREN=OFF,PWRTE=ON,WDTE=OFF,FOSC=XT
#define _XTAL_FREQ 4000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
main(){
char x=3,y=0;
char display;
TRISB = 0;
PORTB = 0;
TRISD = 0;
PORTD = 0xFF;
while(1){
PORTB=(char)pow(2,x);
PORTD = ~(char)pow(2,y);
__delay_ms(400);
PORTD= 0xFF;
if (y<7)
y++;
else{
y=0;
}
}
}

27

Ejercicio (M3):
Se tiene un microcontrolador PIC16F877A que
tiene conectado una matriz de leds en arreglo por
filas. Se pide elaborar un programa que permita:
Tener un cursor (led encendido) que iniciar en la
primera fila con el valor: 00000001.
El cursor debe desplazarse por todo el borde de la
matriz, en sentido anti-horario.

28

Ejemplo (M3):

29

Fin
Autor: Mauricio Galvez Legua
(mgalvez@uni.edu.pe)

30

You might also like