Escolar Documentos
Profissional Documentos
Cultura Documentos
Índice
Introducción ------------------------------------------------------------------------ 3
Descripción ------------------------------------------------------------------------ 4
Apéndice A ------------------------------------------------------------------------- 28
Apéndice B ------------------------------------------------------------------------- 30
Apéndice C ------------------------------------------------------------------------- 32
Apéndice D ------------------------------------------------------------------------- 34
Conclusión ------------------------------------------------------------------------- 36
Introducción
El proyecto consiste en un cartel electrónico programable de matrices de “leds”.
Mediante un teclado de PC-AT se podrán ir ingresando los distintos caracteres, el
cual se podrán ir visualizando en la pantalla.
Esta compuesta de ocho matrices de “leds” 7x5 cátodo común, lo cual formara una
matriz de 7 filas por 80 columnas.
El tamaño máximo de caracteres del mensaje es de 128, que pueden ser desde
números del 0-9, y letras desde A-Z minúsculas y mayúsculas.
Dispondrá de un microcontrolador PIC 16F873, el cual posee 4K de memoria de
programa, 192 bytes de memoria de datos, 128 bytes de memoria RAM, además de
puertos de entrada/salida, etc. Este se utilizara para manejar todos los componentes
del proyecto como la memoria, las matrices, los codificadores, etc.
Se pueden visualizar dos tipos de mensajes, uno mensaje giratorio y otro de a frases
instantáneas.
Se utilizara una memoria EEPROM de 2K byte, en ella se irán guardando los
distintos mensajes ingresados.
Posee 8 lugares de memoria, 4 para cada modo. Una vez apagado se volverá a
mostrar el ultimo mensaje ingresado.
Descripción
El objetivo del trabajo es poder visualizar dos tipos de mensajes, un mensaje
giratorio y otro que va aparecer de a frases instantáneas. Los mensajes se
guardaran en la memoria I2C EEPROM (24C16), para poder ser utilizados
nuevamente, la conexión y funcionamiento se describe en el Apéndice C. La
cantidad máxima de caracteres que se pueden escribir es de 128. El control del
cartel se hará mediante un teclado de PC-AT, la descripción de este es detallado en
el Apéndice A. Los caracteres que se pueden visualizar son mayúsculas de la (A) a
la (Z), minúsculas de la (a) a la (z) y los números del (0) al (9). El control se va a
realizar mediante el microcontrolador PIC 16F873, (Apéndice D), que será el
encargado de manejar la memoria I2C EEPROM, el teclado, los decodificadores y
las matrices de “leds”.
Diseño Hardware
usar un decodificador de 6 a 48, pero al hacer el diseño físico con una herramienta
beta, se usarán componentes más sencillos que seguro estarán disponibles. En vez
de decodificadores 6 a 48, se usarán decodificadores 3 a 8, y en vez de un sólo
decodificador se necesitarán 5 para codificar las 40 columnas. Esto no es suficiente
para mantener una sola columna activa, así que es necesario introducir un segundo
nivel de codificación, en este caso, lo que se codifica son las señales “enable” de los
decodificadores anteriores para que sólo 1 de los 5 anteriores este activo en un
momento dado. Con un decodificador 3 a 8 es suficiente para controlar los 5. Para el
primer nivel de codificación introducido se necesitan 3 señales de control que se
conectaran a las entradas A, B y C de los 5 decodificadores. Los 5 comparten las
mismas señales. Para el segundo nivel de codificación se necesitarán 3 señales,
para las entradas A, B y C del decodificador. Las salidas de este decodificador se
conectan con las entradas “enable” de los 5 decodificadores anteriores. El resto de
entradas se conectan a GND. Por otro lado se necesitan 7 señales, una por cada fila
del “Display”.
Una vez que se conoce el número de señales necesarias para el diseño se debe
realizar la conexión con los componentes, para ello se debe tener en cuenta el nivel
lógico de las señales. En primer lugar recordar que para iluminar un “led” es
necesario introducir una señal lógica alta (‟1‟) por el ánodo y tener una señal lógica
baja (‟0‟) por el cátodo. Por tanto, dado que los cátodos están unidos por las
columnas y son estas las que se han codificado, se situará la salida de cada
decodificador conectado a la columna de la matriz.
La salida será activa a nivel bajo así que será el decodificador 74138. Para el
decodificador de las señales “enable” al ser ésta activa a nivel alto, se usará el
decodificador 74238. El resultado de las conexiones entre componentes y el diseño
lógico inicial se puede ver en la figura 1.
Diseño eléctrico
FILA01
SEÑAL 01
FILA02
SEÑAL 02
FILA03
SEÑAL 03
FILA04
SEÑAL 04
FILA05
SEÑAL 05
FILA06
SEÑAL 06
FILA07
SEÑAL 07
COL 01
COL 02
COL 03
COL 04
COL 05
COL 06
COL 37
COL 38
COL 39
COL 40
15
14
13
12
11
10
15
14
13
12
11
10
9
7
9
7
U1 U2
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74ALS138 74ALS138
E1
E2
E3
E1
E2
E3
C
C
A
B
A
B
1
2
3
6
4
5
1
2
3
6
4
5
SEÑAL 08
SEÑAL 09
SEÑAL 10
15
14
13
12
11
10
9
7
U3
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74HC238
E1
E2
E3
C
A
B
1
2
3
6
4
5
SEÑAL 11
SEÑAL 12
SEÑAL 13
FIGURA 1
COL 01
COL 02
COL 03
COL 04
COL 05
COL 06
COL 37
COL 38
COL 39
COL 40
16
15
14
13
12
11
10
16
15
14
13
12
11
10
9
9
U1 U2
1C
2C
3C
4C
5C
6C
7C
1C
2C
3C
4C
5C
6C
7C
COM
COM
ULN2003A ULN2003A
1B
2B
3B
4B
5B
6B
7B
1B
2B
3B
4B
5B
6B
7B
1
2
3
4
5
6
7
1
2
3
4
5
6
7
15
14
13
12
11
10
15
14
13
12
11
10
9
7
9
7
U3 U4
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74HC238 74HC238
E1
E2
E3
E1
E2
E3
C
C
A
B
A
B
1
2
3
6
4
5
1
2
3
6
4
5
FIGURA 2
FILA01
FILA02
U2
9
OSC1/CLKIN RB0/INT
21 U1
10
OSC2/CLKOUT RB1
22 SEÑAL 01 2
1A0 1Y0
18
1 23 SEÑAL 02 4 16 FILA03
MCLR/Vpp/THV RB2 1A1 1Y1
RB3/PGM
24 SEÑAL 03 6
1A2 1Y2
14
2
RA0/AN0 RB4
25 SEÑAL 04 8
1A3 1Y3
12
3
RA1/AN1 RB5
26 SEÑAL 05 11
2A0 2Y0
9
4
RA2/AN2/VREF- RB6/PGC
27 SEÑAL 06 13
2A1 2Y1
7
5 28 SEÑAL 07 15 5 FILA04
RA3/AN3/VREF+ RB7/PGD 2A2 2Y2
6 17 3
RA4/T0CKI 2A3 2Y3
7 11
RA5/AN4/SS RC0/T1OSO/T1CKI
12 1
RC1/T1OSI/CCP2 1OE
13 19
RC2/CCP1 2OE
14 FILA05
RC3/SCK/SCL
15 74ALS241
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT
FILA06
PIC16F873
FILA07
COL 01
FIGURA 3
Programa en assembler
List p=16F873
INCLUDE "P16F873.INC" ;Definiciones de registros internos
errorlevel -302
cblock 0x35
Direccion,Dato,Banderas,Copia,restador,retardo,valor,cont,fila,fila1,GIRAR1,cuanto,memoria,comp
endc
org 0x00
goto INICIO
org 0x04
MOVWF W_TEMP
SWAPF STATUS,W
MOVwf STATUS_TEMP
CALL LEER_TECLADO
bcf INTCON,INTF
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
RETLW 0x59 ;s
RETLW 0x01 ;a
RETLW 0x6d ;w
RETLW 0x8A ;2
RETLW 0
RETLW 0
RETLW 0X0b ;c
RETLW 0x73 ;x
RETLW 0x10 ;d
RETLW 0x15 ;e
RETLW 0X94 ;4
RETLW 0X8F ;3
RETLW 0
RETLW 0
RETLW 0x83 ;ESPACIO
RETLW 0x67 ;v
RETLW 0x1a ;f
RETLW 0x5e ;t
RETLW 0x55 ;r
RETLW 0X9A ;5
RETLW 0
RETLW 0
RETLW 0x40 ;n
RETLW 0x06 ;b
RETLW 0x23 ;h
RETLW 0x1e ;g
RETLW 0x79 ;y
RETLW 0XA0 ;6
RETLW 0
RETLW 0
RETLW 0
RETLW 0x3a ;m
RETLW 0x2c ;j
RETLW 0x62 ;u
RETLW 0XA6 ;7
RETLW 0XAB ;8
RETLW 0
RETLW 0
RETLW 0
RETLW 0x31 ;k
RETLW 0x28 ;i
RETLW 0x45 ;o
RETLW 0XB7 ;0
RETLW 0XB1 ;9
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0x36 ;l
RETLW 0
RETLW 0x4b ;p
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0X0A
RETLW 0
RETLW 0
RETLW 0x08
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0x08 ;borrar
RETLW 41h
RETLW 00h
RETLW 7Fh ;L
RETLW 01h
RETLW 01h
RETLW 01h
RETLW 01h
RETLW 00h
RETLW 7Fh ;M
RETLW 20h
RETLW 18h
RETLW 20h
RETLW 7Fh
RETLW 00h
RETLW 7Fh ;N
RETLW 10h
RETLW 08h
RETLW 04h
RETLW 7Fh
RETLW 00h
RETLW 3Eh ;O
RETLW 41h
RETLW 41h
RETLW 41h
RETLW 3Eh
RETLW 00h
RETLW 7Fh ;P
RETLW 48h
RETLW 48h
RETLW 48h
RETLW 30h
RETLW 00h
RETLW 3Eh ;Q
RETLW 41h
RETLW 45h
RETLW 42h
RETLW 3Dh
RETLW 00h
RETLW 7Fh ;R
RETLW 48h
RETLW 4Ch
RETLW 4Ah
RETLW 31h
RETLW 00h
RETLW 32h ;S
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 26h
RETLW 00h
RETLW 40h ;T
RETLW 40h
RETLW 7Fh
RETLW 40h
RETLW 40h
RETLW 00h
RETLW 7Eh ;U
RETLW 01h
RETLW 01h
RETLW 01h
RETLW 7Eh
RETLW 00h
RETLW 7Ch ;V
RETLW 02h
RETLW 01h
RETLW 02h
RETLW 7Ch
RETLW 00h
RETLW 7Eh ;W
RETLW 01h
RETLW 0Eh
RETLW 01h
RETLW 7Eh
RETLW 00h
RETLW 63h ;X
RETLW 14h
RETLW 08h
RETLW 14h
RETLW 63h
RETLW 00h
RETLW 70h ;Y
RETLW 08h
RETLW 07h
RETLW 08h
RETLW 70h
RETLW 00h
RETLW 43h ;Z
RETLW 45h
RETLW 49h
RETLW 51h
RETLW 61h
RETLW 00h
NOP
RETLW 0
RETLW 0
RETLW 0x3d ;K
RETLW 0x31 ;I
RETLW 0x55 ;O
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0
RETLW 0x43 ;L
RETLW 0
RETLW 0x5b ;P
RETLW 01h
RETLW 00h
RETLW 1Fh ;m
RETLW 10h
RETLW 0Ch
RETLW 10h
RETLW 0Fh
RETLW 00h
RETLW 1Fh ;n
RETLW 08h
RETLW 10h
RETLW 0Fh
RETLW 00h
RETLW 0Eh ;o
RETLW 11h
RETLW 11h
RETLW 11h
RETLW 0Eh
RETLW 00h
RETLW 1Fh ;p
RETLW 14h
RETLW 14h
RETLW 08h
RETLW 00h
RETLW 08h ;q
RETLW 14h
RETLW 14h
RETLW 1Fh
RETLW 00h
RETLW 1Fh ;r
RETLW 08h
RETLW 10h
RETLW 00h
RETLW 09h ;s
RETLW 15h
RETLW 15h
RETLW 12h
RETLW 00h
RETLW 10h ;t
RETLW 7Eh
RETLW 11h
RETLW 00h
RETLW 1Eh ;u
RETLW 01h
RETLW 01h
RETLW 1Fh
RETLW 00h
RETLW 1Ch ;v
RETLW 02h
RETLW 01h
RETLW 02h
RETLW 1Ch
RETLW 00h
RETLW 1Eh ;w
RETLW 01h
RETLW 06h
RETLW 01h
RETLW 1Eh
RETLW 00h
RETLW 11h ;x
RETLW 0Ah
RETLW 04h
RETLW 0Ah
RETLW 11h
RETLW 00h
RETLW 1Dh ;y
RETLW 05h
RETLW 05h
RETLW 1Eh
RETLW 00h
RETLW 11h ;z
RETLW 13h
RETLW 15h
RETLW 19h
RETLW 00h
RETLW 80h ;espacio
RETLW 80h
RETLW 00h
RETLW 21h ;1
RETLW 7Fh
RETLW 01h
RETLW 00h
RETLW 23h ;2
RETLW 45h
RETLW 49h
RETLW 31h
RETLW 00h
RETLW 41h ;3
RETLW 51h
RETLW 69h
RETLW 46h
RETLW 00h
RETLW 0Ch ;4
RETLW 14h
RETLW 24h
RETLW 7Fh
RETLW 04h
RETLW 00h
RETLW 72h ;5
RETLW 51h
RETLW 51h
RETLW 51h
RETLW 4Eh
RETLW 00h
RETLW 1Eh ;6
RETLW 29h
RETLW 49h
RETLW 49h
RETLW 06h
RETLW 00h
RETLW 40h ;7
RETLW 47h
RETLW 48h
RETLW 70h
RETLW 00h
RETLW 36h ;8
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 36h
RETLW 00h
RETLW 30h ;9
RETLW 49h
RETLW 49h
RETLW 4Ah
RETLW 3Ch
RETLW 00h
RETLW 3Eh ;0
RETLW 45h
RETLW 49h
RETLW 51h
RETLW 3Eh
RETLW 00h
INICIO
clrf PORTB
clrf PORTA
bsf STATUS,RP0
MOVLW b'00000001'
MOVWF TRISB
movlw b'00000110'
movwf ADCON1
MOVLW b'00000000'
MOVWF TRISA
MOVLW b'11111111'
MOVWF TRISC
MOVLW b'10000111'
MOVWF OPTION_REG
movlw b'10000000' ; La velocidad para la EEPROM sera de 100 Kc.
movwf SSPSTAT
movlw .9
movwf SSPADD
bcf STATUS,RP0
movlw b'00101000'
movwf SSPCON
clrf BANDERAS
clrf cuanto
clrf PCLATH
clrf Nbits
clrf Nbytes
clrf fila
clrf GIRAR1
clrf fila1
clrf DATAIN
clrf NO_ROTAR
clrf saltar
clrf SALTO
movlw 0x02
movwf GIRAR
clrf Direccion
clrf valor
MOVLW b'10010000'
MOVWF INTCON
movlw 0x4E
movwf FSR
movlw 0x28
movwf RESTADOR
borrar clrf INDF
incf FSR,F
decfsz RESTADOR
goto borrar
GOTO LAZO_LECTURA
mal
decf fila
decf Direccion
decf Direccion
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
goto Ru12
Cam
movf RESTADOR,0
sublw 0x14
btfss STATUS,C
goto mal
btfsc STATUS,Z
goto LIMPIAR
movwf RESTADOR
Cambiar2
call ROTO1
clrf 0x4E
decfsz RESTADOR
goto Cambiar2
goto LIMPIAR
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
bsf INTCON,GIE
clrf PCLATH
clrf cont
A121 bsf STATUS,RP1
call EE_Read
bsf STATUS,RP1
movf EEDATA,0
bcf STATUS,RP1
xorlw 0xFF
,RP1
movf EEDATA,0
bcf STATUS,RP1
movwf CUENTAS
A32
call ROTO1
movf CUENTAS,0
call Tabla1
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf CUENTAS
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto A32
bsf STATUS,RP1 ;Pasamos al banco 2
incf EEADR,F ;Siguiente dirección EEPROM
bcf STATUS,RP1
clrf PCLATH
goto A121
Z
goto escribir3
movf GIRAR,0
xorlw 0x04
btfsc STATUS,Z
clrf GIRAR
clrf GIRAR
clrf GIRAR1
movlw 0x4E
movwf FSR
movlw 0x28
movwf RESTADOR
Aor123 clrf INDF
incf FSR,F
decfsz RESTADOR
goto Aor123
goto LIMPIAR
escribir3
movlw 0x01
movwf GIRAR
clrf GIRAR1
movlw 0x4E
movwf FSR
movlw 0x28
movwf RESTADOR
Aor124 clrf INDF
incf FSR,F
decfsz RESTADOR
goto Aor124
goto LIMPIAR
Rn3
call ROTO1
movf CUENTAS,0
call Tabla1
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf CUENTAS,1
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto Rn3
clrf PCLATH
goto LIMPIAR2
movf GIRAR,0
xorlw 0x03
btfsc STATUS,Z
goto escribir31
movf GIRAR,0
xorlw 0x04
btfsc STATUS,Z
clrf GIRAR
clrf GIRAR
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
goto GIRATORIO1
muestra1 CLRWDT
clrf fila1
DECFSZ Nbytes,W
goto Bis4
goto escr
Bis4 clrf comp
movf GIRAR,0
xorlw 0x02
btfsc STATUS,Z
goto LAZO_LECTURA
movf GIRAR,0
xorlw 0x01
btfsc STATUS,Z
goto fase1
movf GIRAR,0
xorlw 0x00
btfsc STATUS,Z
goto fase2
Bis3 movlw 0x05
movwf retardo
movlw 0x10
movwf RESTADOR1
Bis2
movlw 0x23
movwf PORTA
movlw 0x28
movwf RESTADOR
movlw 0x75
movwf FSR
Bis1 rlf INDF,0
movwf PORTB
call RETARDO
decf FSR,F
decfsz RESTADOR,1
goto Bis1
decfsz RESTADOR1,1
goto Bis2
goto muestra1
muestra CLRWDT
DECFSZ Nbytes,W
goto Ais4
goto escribir
Ais4 movf GIRAR,0
xorlw 0x02
btfsc STATUS,Z
goto LAZO_LECTURA
movf GIRAR,0
xorlw 0x01
btfsc STATUS,Z
goto fase1
movf GIRAR,0
xorlw 0x00
btfsc STATUS,Z
goto fase2
Ais3 movlw 0x05
movwf retardo
movlw 0x10
movwf RESTADOR1
Ais2
movlw 0x23
movwf PORTA
movlw 0x28
movwf RESTADOR
movlw 0x75
movwf FSR
Ais1 rlf INDF,0
movwf PORTB
call RETARDO
decf FSR,F
decfsz RESTADOR,1
goto Ais1
decfsz RESTADOR1,1
goto Ais2
goto muestra
MOVF KeyRtn,W
xorlw 0x16
btfsc STATUS,Z
goto fase21
MOVF KeyRtn,W
xorlw 0x1E
btfsc STATUS,Z
goto fase22
MOVF KeyRtn,W
xorlw 0x26
btfsc STATUS,Z
goto fase23
MOVF KeyRtn,W
xorlw 0x25
btfsc STATUS,Z
goto fase24
goto fase2
LAZO_LECTURA
Vis CLRWDT
DECFSZ Nbytes,W
goto Vis4
goto SIGUE1
Vis4 movf GIRAR,0
xorlw 0x02
btfsc STATUS,Z
goto LAZO_LECTURA
F1 movlw 0x09
addwf KeyRtn,1
return
F2 movlw 0x0C
addwf KeyRtn,1
return
F3 movlw 0x65
subwf KeyRtn,1
return
SIGUE1
bcf INTCON,GIE
MOVF KeyRtn,W
xorlw 0x04
btfsc STATUS,Z
call F2
MOVF KeyRtn,W
xorlw 0x76
btfsc STATUS,Z
call F3
MOVF KeyRtn,W
xorlw 0x05
btfsc STATUS,Z
call F1
MOVF KeyRtn,W
xorlw 0x06
btfsc STATUS,Z
call F1
MOVF KeyRtn,W
subwf SALTO
btfsc STATUS,Z
goto LIMPIAR1
MOVF KeyRtn,W
movwf SALTO
SUBLW 0x0d
BTFSC STATUS,C
goto LIMPIAR
MOVF KeyRtn,W
SUBLW 0x67
BTFSC STATUS,C
goto SIGUE
goto LIMPIAR
SIGUE
MOVLW 0x0e
subwf KeyRtn,0
BTFSC BANDERAS_CAPS
goto TBL_MAY
TBL_MIN
CALL TABLA0
movwf CUENTAS
xorlw 0xB7
btfsc STATUS,Z
xorlw 0x03
btfsc STATUS,Z
goto Rn1
movf GIRAR,0
xorlw 0x04
btfsc STATUS,Z
goto Rn1
goto FIN_TABLA
TBL_MAY
incf PCLATH
clrf BANDERAS
CALL TABLA1
movwf CUENTAS
xorlw 0x97
btfss STATUS,Z
clrf PCLATH
clrf saltar
movf CUENTAS,0
goto FIN_TABLA
retardo1
movlw 0x10
movwf Delay_Cont
call Delay_var ;Temporiza 1 segundo
return
FIN_TABLA
movf CUENTAS,0
xorlw 0xA9
btfsc STATUS,Z
goto FIN_TABLA1
movf CUENTAS,0
xorlw 0x0A
btfsc STATUS,Z
goto ENTER
movf CUENTAS,0
xorlw 0xFC
btfsc STATUS,Z
goto ESCAPE
xorlw 0xFE
btfsc STATUS,Z
goto ejecutar
movf CUENTAS,0
xorlw 0xFF
btfsc STATUS,Z
goto ejecutar1
goto CARACTER_ASCII
FIN_TABLA1
comf BANDERAS,W
andlw 0x01
movwf BANDERAS
btfsc BANDERAS_CAPS
nop
btfsc BANDERAS_CAPS
goto LIMPIAR
nop
goto LIMPIAR
ejecutar NOP
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
bsf INTCON,GIE
decf GIRAR
goto fase1
ejecutar1 NOP
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
bsf INTCON,GIE
clrf GIRAR
goto fase2
call Recibir_Byte
movf Dato,0
xorlw 0xFF
btfss STATUS,Z
goto R12
movlw 0x03
movwf RESTADOR1
V1 call retardo2
decfsz RESTADOR1
goto V1
goto repro1
Ca
movf RESTADOR,0
sublw 0x14
btfss STATUS,C
goto Viss3
btfsc STATUS,Z
goto Viss3
movwf RESTADOR
Cambia2
call ROTO1
clrf 0x4E
decfsz RESTADOR
goto Cambia2
goto Viss3
,Z
goto R112
incf PCLATH
incf Direccion
call Recibir_Byte
incf Direccion
R32 incf cont
call ROTO1
movf Dato,0
call Tabla1
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf Dato,1
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto R32
clrf PCLATH
goto R121
call Recibir_Byte
incf Direccion
movf Dato,0
xorlw 0x97
btfsc STATUS,Z
incf PCLATH
R312 incf cont
call ROTO1
movf Dato,0
call Tabla
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf Dato,1
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto R312
clrf PCLATH
decfsz fila1,1
goto R121
ENTER
NOP
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
bsf INTCON,GIE
movlw 0xFF
movwf Dato
call Enviar_Byte
call retardo1
movf GIRAR,0
xorlw 0x00
btfsc STATUS,Z
goto GIRATORIO1
movf GIRAR,0
xorlw 0x01
btfsc STATUS,Z
goto ENTER1
goto LIMPIAR
ENTER1
incf Direccion
movf Direccion,0
movwf GIRAR1
movlw 0x4E
movwf FSR
movlw 0x28
movwf RESTADOR
borr1 clrf INDF
incf FSR,F
decfsz RESTADOR
goto borr1
clrf fila
goto LIMPIAR
movlw 0x09
movwf RESTADOR
clrf cont
movf Direccion,0
movwf valor
xorlw 0x02
btfsc STATUS,Z
goto BORRAR1
movf Direccion,0
movwf valor
xorlw 0x00
btfsc STATUS,Z
goto BORRAR1
BORRAR2 movlw 0x02
subwf valor,1
incf cont
movf valor,0
xorlw 0x00
btfsc STATUS,Z
goto BORRAR3
decfsz RESTADOR,1
goto BORRAR2
goto BORRAR3
CARACTER_ASCII
Run1 movf GIRAR,0
xorlw 0x04
btfsc STATUS,Z
goto LIMPIAR2
movf GIRAR,0
xorlw 0x03
btfsc STATUS,Z
goto LIMPIAR2
incf fila
movf saltar,0
call retardo1
incf Direccion
movf CUENTAS,0
movwf Dato
call Enviar_Byte
call retardo1
incf Direccion
movf GIRAR,0
xorlw 0x01
btfsc STATUS,Z
goto Ru12
Run3
call ROTO1
movf CUENTAS,0
call Tabla1
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf CUENTAS,1
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto Run3
clrf PCLATH
goto LIMPIAR
movf GIRAR,0
xorlw 0x01
btfsc STATUS,Z
goto Ru12
Run31
call ROTO1
movf CUENTAS,0
call Tabla
movwf CARACTER ;W contains table data - put it in 15h
movwf 0x4E
incf CUENTAS,1
movf CARACTER,0
xorlw 0x00
btfss STATUS,Z
goto Run31
goto LIMPIAR
ROTO1
movf 74h,0
movwf 75h
movf 73h,0
movwf 74h
movf 72h,0
movwf 73h
movf 71h,0
movwf 72h
movf 70h,0
movf 66h,0
movwf 67h
movf 65h,0
movwf 66h
movf 64h,0
movwf 65h
movf 63h,0
movwf 64h
movf 62h,0
movwf 63h
movf 61h,0
movwf 62h
movf 60h,0
movwf 61h
movf 5Fh,0
movwf 60h
movf 5Eh,0
movwf 5Fh
movf 5Dh,0
movwf 5Eh
movf 5Ch,0
movwf 5Dh
movf 5Bh,0
movwf 5Ch
movf 5Ah,0
movwf 5Bh
movf 59h,0
movwf 5Ah
movf 58h,0
movwf 59h
movf 57h,0
movwf 58h
movf 56h,0
movwf 57h
movf 55h,0
movwf 56h
movf 54h,0
movwf 55h
movf 53h,0
movwf 54h
movf 52h,0
movwf 53h
movf 51h,0
movwf 52h
movf 50h,0
movwf 51h
movf 4Fh,0
movwf 50h
movf 4Eh,0
movwf 4Fh
return
movwf 4Fh
movf 4Dh,0
movwf 4Eh
return
GIRATORIO
goto LAZO_LECTURA
GIRATORIO1 movlw 0x020
movwf fila
movlw 0x05
movwf retardo
movlw 0x4E
movwf FSR
movlw 0x28
movwf RESTADOR
borrar2 clrf INDF
incf FSR,F
decfsz RESTADOR
goto borrar2
GIRATORIO3
clrf Direccion
GIRATORIO2
call Recibir_Byte
movf Dato,0
movwf saltar
xorlw 0xFF
btfsc STATUS,Z
goto fin
incf Direccion
call Recibir_Byte
movf saltar,0
xorlw 0x01
btfsc STATUS,Z
goto MIN
goto MAY
goto RET
decfsz retardo
goto RET2
call RET1
RET2 clrf PORTB
incf PORTA
return
LIMPIAR
NOP
clrf PCLATH
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
bsf INTCON,GIE
GOTO LAZO_LECTURA
LIMPIAR1
NOP
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
clrf SALTO
bsf INTCON,GIE
GOTO LAZO_LECTURA
LIMPIAR2
NOP
CLRF KeyRtn
CLRF ASCII
CLRF Nbytes
clrf SALTO
bsf INTCON,GIE
GOTO muestra
LEER_TECLADO
BTFSC KBD_DATO
GOTO KBD_ES1
BCF BIT_ACTUAL
GOTO SEGUIR
KBD_ES1
BSF BIT_ACTUAL
SEGUIR
INCF Nbits,F
DECFSZ Nbits,W
GOTO BIT_REAL
BTFSS BIT_ACTUAL
RETURN
GOTO CLEANUP
BIT_REAL
MOVF Nbits,W
XORLW 0x09
BTFSC STATUS,Z
goto ES_9NO_BIT
NO_ES_9NO_BIT
DECFSZ NO_ROTAR,W
RRF DATAIN,1
MOVF Nbits,W
XORLW 0x0B
BTFSC STATUS,Z
GOTO aceptar_byte
RETURN
ES_9NO_BIT
BTFSC BIT_ACTUAL
GOTO CLEANUP
MOVF DATAIN,W
BTFSC STATUS,Z
GOTO CLEANUP
MOVWF KeyRtn
MOVLW 0x01
MOVWF NO_ROTAR
RETURN
aceptar_byte
MOVLW 0x01
MOVWF Nbytes
CLRF NO_ROTAR
CLEANUP
CLRF Nbits
CLRF DATAIN
RETURN
;*************************************************************************
Recibir_Byte
clrf PIR1
call Send_Start ; Pone la condición de Inicio
movlw b'10100000' ; Prepara el Byte de control para la EEPROM
addwf memoria,0
call Send_Byte ; Envía el byte de control a la memoria serial
movf Direccion,w ; Envía la dirección donde se leerá la EEPROM
call Send_Byte
call Send_Stop
call Send_Start ; Pone la condición de re-inicio
movlw b'10100001' ; Se envía el byte de control indicando una lectura
addwf memoria,0
call Send_Byte
call Leer_Byte ; Se lee lo enviado por la EPROM
call Send_Stop ; Se envía la condición de STOP
return
;**********************************************************************
Enviar_Byte
clrf PIR1
call Send_Start ; Se pone la condición de inicio
movlw b'10100000' ; Se envía el byte de control
addwf memoria,0
call Send_Byte
movf Direccion,w ; Se envía la Dirección donde guardar el dato
call Send_Byte
movf Dato,w ; Se envía el Dato
call Send_Byte
call Send_Stop ; Condición de STOP
return
;**********************************************************************
Send_Start2
return
;**********************************************************************
Leer_Byte
;**************************************************************************************
;EE_Read: Leer un byte de la EEPROM. Se supone al registro EEADR cargado con la direc-
;ción a leer. En EEDATA aparecerá el dato leído.
END
Diagrama de flujo
Inicialización de
variables
Enter =0 Enter=0
F3=0 Presionar F3=1 Presionar F3=0
Enter o F3 F3
Enter=1 F3=1
F3=0
Siguiente
renglón
Visualizar
mensaje
ULN2003A 74HC238
U14 U1
19
2OE 24LC16B
1
1OE
SCK
SDA
WP
3 17
2Y3 2A3 R1 R2
5 15
2Y2 2A2
7 13 10k 10k
1
3
5
2Y1 2A1
9 11
2Y0 2A0
12 8
1Y3 1A3
14 6
1Y2 1A2
16 4
1Y1 1A1
18 2
1Y0 1A0
74HC241
R5
10k
21
22
23
24
25
26
27
28
11
12
13
14
15
16
17
18
U2
RC6/T X/CK
RB0/INT
RB6/PGC
RB7/PGD
RB4
RB5
RC1/T 1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RB3/PGM
RC4/SDI/SDA
RC5/SDO
RC7/RX/DT
Conector PC-AT
PIC16F873
3
4 5
2
1
R4
RA3/AN3/VREF+
RA2/AN2/VREF-
MCLR/Vpp/T HV
OSC2/CLKOUT
10k
OSC1/CLKIN
RA5/AN4/SS
RA4/T 0CKI
RA0/AN0
RA1/AN1
9
10
1
2
3
4
5
6
7
C2
13pF
X1
CRYSTAL
C1
13pF
C3
R3
10k
1uF
Si selecciono F1:
Si selecciono F2:
Al realizar otra prueba las matrices iluminaban poco, era porque las matrices
necesitan un pico de corriente de 140mA, ya que el puerto B del PIC no puede
entregar esa corriente, tuve que poner un amplificador de corriente.
Estos problemitas surgen por no leer antes las hojas de datos de los componentes.
Apéndice A
Donde las líneas del reloj y de datos son bidireccionales de E/S con colector abierto
capaces de manejar una corriente de hasta de 300mA.
El teclado es libre de transmitir hacia el “host” mientras ambas líneas del reloj del
teclado y datos permanezcan en alto. En este momento la transmisión de datos
hacia el “host” se realiza a través de un protocolo de comunicación en serie que en
el AT consta de un marco de 11 bits, el primer bit de inicio, los 8 siguientes de datos
(el LSB primero), 1 bit de paridad impar y el último de fin o parada. En el siguiente
diagrama se representa un byte de datos transmitidos desde el teclado:
Este programa se limitara a recibir los códigos de las teclas pulsadas. Para ello se
debe leer el código binario producido en los flancos de bajado del reloj, se debe
colocar el reloj del teclado como la entrada de interrupción RB0, y cada vez que esta
se activa se lee en RC0 un bit del dato.
Como la línea de reloj y de dato del teclado son a colector abierto, hay que
configurar la entrada RB0 como “pull up”, y a la entrada RC0 hay que colocarle una
resistencia a Vcc.
Apéndice B
Matriz de 5x7 LEDs
El modelo de matriz de “leds” elegido para el proyecto es el 5x7 “Dot Matrix Display”
(red) del fabricante Para Light.
La identificación del elemento es: Part Number: C-5570E
Algunas de las características [20] generales que presenta son las siguientes:
Otras características pueden verse en la siguiente tabla y para más información ver
su datasheet.
Parámetro Valor
Potencia disipada 105 mW
Corriente continua 30 mA
Pico de corriente(1/10 Duty Cycle, 0,1ms) 140 mA
Voltaje 5V
Temperatura de Uso/almacenaje -400C hasta +85ºC
Temperatura de soldadura 260ºC durante 5 segundos
La siguiente imagen muestra las dimensiones de la matriz así como las dos posibles
disposiciones internas de sus “leds”.
Apéndice C
MEMORIA I2C EEPROM 24C16
Características:
2. Líneas de Polarización (Vcc y Vss): Los dispositivos I2C, trabajan con voltajes de
alimentación (Vcc) entre 2.3 a 5.5VDC. El conector Vss conecta la tierra del circuito.
Existen circuitos convertidores de voltaje, para permitir la conexión de redes y
dispositivos que se polarizan con diferentes niveles de voltaje.
5. Línea de Reloj (SCL): Fija la sincronización de los datos que viajan entre maestro
y esclavos. Al igual que SDA, esta línea también es de colector / drenador abierto, lo
que también se debe conectar entre ella y la fuente de polarización la resistencia
“pull-up”. La frecuencias de operación que soporta el protocolo son: estándar
(100KHz), rápida (400KHz) y de “alta velocidad” (1MHz).
Apéndice D
Microcontrolador PIC 16F873
Para el manejo del teclado se utiliza el puerto RB0 configurado como una
interrupción conectada al reloj, y el puerto RC0 conectado al de datos.
Se utilizan para la pantalla de “leds” los bits RB1 a RB7 para las filas.
Para controlar de los decodificadores se utilizo puerta A del PIC.
Para la memoria EEPROM se utilizo el puerto RC3 (SCL) y RC4 (SDA) que son I2C.
Conclusión
De este proyecto se pueden formular muchas conclusiones que en su totalidad son
productivas.
La propuesta de realizar un proyecto a libre elección fomenta el desarrollo de
proyectos ingeniosos y tal vez, por que no, útiles. Realmente cubre con todos los
aspectos de un trabajo de ingeniería.
Aprender a manejar un microcontrolador no es tan difícil como parece. Vale la pena
conocer a un dispositivo tan versátil, completo y eficiente.
Otra ventaja de este desafío es su carácter integrador. Para este proyecto se
utilizaron todos los conocimientos adquiridos tanto en el ámbito universitario como
en el ámbito personal. Es decir la experiencia de proyectos anteriores.
Muchos problemas y contratiempos se hicieron presentes pero todos ellos fueron
subsanados utilizando el ingenio y los conocimientos.