sábado, 8 de octubre de 2011

Teclado Matricial 4x4


Es un dispositivo de entrada que consiste en un arreglo matricial de 16 teclas (pulsadores). Dispone de un conector SIL (Single In Line) de 8 pines: 4 filas y 4 columnas. La interconexión de los pulsadores es como se muestra en la imagen:


Cuando se presiona una tecla se conecta una fila con una columna. La manera de averiguar la tecla presionada consiste en enviar un nivel lógico a una de las filas (diferente al nivel de las filas restantes) y buscar la columna por la que se recibe el mismo nivel lógico. De esta manera se obtiene la fila y columna al igual que en una matriz. 

El diagrama de conexión típico al ATmega8 es el siguiente:

Las resistencias de 1K son necesarias para evitar hacer un cortocircuito accidental si se comparten los mismos pines del PIC con otro periférico, como por ejemplo un Display o un LCD.

Las resistencias de 10K son necesarias para asegurar el nivel lógico 0 en las entradas del ATmega8.

Algoritmo de búsqueda:
  • Los pines PD0-PD3 se configuran como Salidas. Los pines PD4-PD7 se configuran como Entradas.
  • Las filas del teclado se conectan a los pines PD0-PD3 y las columnas a los pines PD4-PD7.
  • Se envía “0” a todas las filas.
  • Se envía “1” a la primera fila.
  • Se verifica el nivel lógico en cada una de las columnas. Si se pulsó una tecla de la primera fila se obtendrá un “1” en la columna correspondiente.
  • Si no se encuentra un “1” (no se pulsó tecla en la primera fila) se envía un  “1” a la siguiente fila (a las filas restantes se envía “0”).
  • Se verifican las columnas en busca del nivel lógico “1”.
  • El procedimiento continúa hasta completar las 4 filas.
  • Conociendo la fila por la que se envió “1” y conociendo la columna por la que se recibe “1” se puede conocer la tecla pulsada.

 Programa Para ATmega8:

El programa lee la tecla pulsada en un teclado matricial 4x4 y simultáneamente muestra la última tecla pulsada en un display de 7 segmentos.

Diagrama de Conexión:


Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para control de teclado matricial 4x4 
;Adicionalmente muestra la tecla pulsada en un display
;Para teclado: Salida: PD0-PD3
;        Entradas: PD4-PD7
;Para Display: Salidas: PD1-PD7 (7 segmentos)
;        PC0 (Habilitacion catodo comun)
;Oscilador interno de 8 MHz
;---------------------------------------------------------
.nolist
.include "m8def.inc"
.list
.device  atmega8

.def KEY=r17
.def TEMP=r18
.def COUNT=r19
.def CHAR=r20
.def ROW=r21

.org 0x0000

; Inicializacion de stack

 ldi r16,HIGH(RAMEND)
 out SPH,r16
 ldi r16,LOW(RAMEND)
 out SPL,r16

; Fin inicializacion de Stack

; Inicio de programa

 ldi r16,0x01
 out DDRC,r16  ; PC0 como salida
 ldi r16,0x0F
 out DDRD,r16  ; PD7-PD4 como entradas, PD3-PD0 como salidas
 sbi PORTC,0
 clr TEMP
BEGIN: clr KEY
 inc KEY
 ldi ROW,0x01
 out PORTD,ROW
KEY_V: nop
 sbic PIND,4         ; Verifica tecla pulsada en columna 1
 rjmp CON2  ; Ir a CON2 si se pulsa tecla
 inc KEY  ; Incrementar KEY si no se pulsa tecla
 sbic PIND,5  ; Verifica tecla pulsada en columna 2
 rjmp CON2  ; Ir a CON2 si se pulsa tecla
 inc KEY  ; Incrementar KEY si no se pulsa tecla
 sbic PIND,6  ; Verifica tecla pulsada en columna 3
 rjmp CON2  ; Ir a CON2 si se pulsa tecla
 inc KEY  ; Incrementar KEY si no se pulsa tecla
 sbic PIND,7  ; Verifica tecla pulsada en columna 4
 rjmp CON2  ; Ir a CON2 si se pulsa tecla
 inc KEY  ; Incrementar KEY si no se pulsa tecla
 cpi KEY,0x11
 brbs 1,CON1  ; Comprueba si llego a ultima tecla
 lsl ROW
 out PORTD,ROW
 rjmp KEY_V
CON1: clr KEY
 rjmp DISP
CON2: mov TEMP,KEY ; Retiene ultima tecla pulsada
DISP: ldi r16,0xFF
 out DDRD,r16 ; PORTD como salida
 rcall CONV
 out PORTD,CHAR
 cbi PORTC,0
 nop
 sbi PORTC,0
 ldi r16,0x0F
 out DDRD,r16 ; PD7-PD4 como entradas, PD3-PD0 como salidas
 clr r16
 out PORTD,r16
 out PIND,r16
 rjmp BEGIN

; Subrutinas

CONV: ldi ZH,HIGH(2*TABLE)
 ldi ZL,LOW(2*TABLE)
 add ZL,TEMP
 lpm
 mov CHAR,r0
 ret

; Tabla de datos

TABLE:
.DB 0x00,0x0C,0xB6,0x9E,0xE2,0xCC,0xDA,0xFA,0xF2,0x0E,0xFE,0xDE,0xBC,0xEE,0x7E,0xF8,0x72

Archivos de Programa:

Multiplexaje de Display con Desplazamiento de Caracteres

Programa para ATmega8

El programa consiste en mostrar una serie caracteres en 4 display multiplexados.
los caracteres se muestran en grupos de 4 y se desplazan a la izquierda.

Diagrama de Conexión:




 
Funcionamiento:

  • Aplicando un procedimiento de multiplexaje se muestran los primeros 4 caraceres (CHAR1, CHAR2, CHAR3 y CHAR4). 
  • transcurrido un tiempo tal que el ojo pueda captar los caracteres se desplaza la cadena hacia la izquierda y se muestran los siguientes 4 caracteres (CHAR2, CHAR3, CHAR4, CHAR5). 
  • El programa comprueba si se mostraron todos los caracteres y cuando esto ocurre el proceso se repite.
Programa en Assembler:

;-----------------------------------------------------------
;Autor: LONELY113
;  http://lonely113.blogspot.com
;
;Programa para multiplexar 4 display
;Muestra mensaje LONELY113 con desplazamiento a la izquierda
;Salidas: Puerto D (PD1-PD7) 7 segmentos de display
;   Puerto A (PB0-PB3) habilitacion de display 
;Tipo de display: Catodo comun
;Calibrado para oscilador interno de 8 MHz
;-----------------------------------------------------------
.nolist
.include "m8def.inc"
.list
.device  atmega8

.def CHAR=r1
.def COUNT1=r20
.def COUNT2=r21
.def COUNT3=r22
.def TEMP=r18

.org 0x0000

;Inicializacion de Stack
 ldi r16,HIGH(RAMEND)
 out SPH,r16
 ldi r16,LOW(RAMEND)
 out SPL,r16
; Fin inicializacion de Stack

; Inicio de programa

 ldi r16,0xFF
 out DDRB,r16  ;PORTB como salida de habilitacion
 ldi r16,0xFF
 out DDRD,r16  ;PORTD como salida a displays
 ldi r16,0x0F
 out PORTB,r16 ;Deshabilitacion de displays
 clr r16
 out PORTD,r16
 clr CHAR
 ldi COUNT1,0xFF ; Inicia contadores
 ldi COUNT2,0x20
 ldi COUNT3,0x10
BEGIN: rcall CONVER
 out PORTD,TEMP
 cbi PORTB,3
 nop   ; Habilita display 4
 sbi PORTB,3
 inc CHAR
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,2
 nop   ; Habilita display 3
 sbi PORTB,2
 inc CHAR
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,1
 nop                ; Habilita display 2
 sbi PORTB,1
 inc CHAR
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,0
 nop   ; Habilita display 1
 sbi PORTB,0
 ldi r16,0x03
 sub CHAR,r16 
 dec COUNT1  ; Rutina de repeticion de 
 brne BEGIN  ; visualizacion de los 
 ldi COUNT1,0xFF ; 4 caracteres
 dec COUNT2
 brne BEGIN
 ldi COUNT1,0xFF
 ldi COUNT2,0x20
 dec COUNT3
 brne BEGIN
 ldi COUNT1,0xFF     ; Reinicia contadores
 ldi COUNT2,0x20
 ldi COUNT3,0x10
 inc CHAR         ; 4 siguientes caracteres
 ldi r16,0x0D
 cp r16,CHAR
 brne BEGIN
 clr CHAR
 rjmp BEGIN

; Subrutinas

CONVER: ldi ZH,HIGH(2*TABLE)
 ldi ZL,LOW(2*TABLE)
 add ZL,CHAR
 lpm
 mov TEMP,r0
 ret

TABLE:
.DB 0x00,0x00,0x00,0x70,0x7E,0x6E,0xF3,0x70
.DB 0xDC,0x0C,0x0C,0x9E,0x00,0x00,0x00,0x00

Archivos de Programa:
Descargar

Multiplexaje de Display

Programa para ATmega8


El programa consiste en controlar la visualización simultánea en 4 display cátodo común de 7 segmentos utilizando el método de multiplexaje para optimizar el uso de pines del ATmega8 .

Diagrama de Conexión:

Funcionamiento:
  • Se deshabilitan todos los displays (PB3-PB0=1111).
  • Se envía dato a mostrar al Puerto D (PD1-PD7).
  • Se habilita el display que mostrará el dato (Por ejemplo Display 1 a PB0=0).
  • Se deshabilita Display (Por ejemplo Display 1 a PB0=1).
  •  Se envía nuevo dato al Puerto D.
  • Se habilita el display que mostrará el dato.
  • Se deshabilita el display.
  • El procedimiento continúa hasta enviar 4 datos a los 4 displays.
  • Todo el proceso se repite endefinidamente. El ojo humano no llega a notar el parpadeo de los displays pues ocurre a muy alta frecuencia, por lo tanto se percibe como si los 4 displays estuvieran iluminados y mostrando los 4 datos simultáneamente.
  • El diagrama siguiente muestra el funcionamiento:

Programa en Assembler:

;-------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para multiplexar 4 display 
;y mostrar el mensaje HOLA
;Salidas: Puerto D (PD1-PD7) 7 segmentos de display
;   Puerto B (PB0-PB3) habilitacion de display 
;Tipo de display: Catodo comun
;Oscilador interno de 8 MHz
;-------------------------------------------------------
.nolist
.include "m8def.inc"
.list
.device  atmega8

.def TEMP=r17
.def DISP=r18

.org 0x0000
; Inicializacion de Stack
 ldi r16,HIGH(RAMEND)
 out SPH,r16
 ldi r16, LOW(RAMEND)
 out SPL,r16
; Fin inicializacion de Stack

; Inicio de programa
  
 ldi r16,0x0F  ; PORTB habilitacion de displays
 out DDRB,r16  ; PB3-PB0
 ldi r16,0xFF 
 out DDRD,r16  ; PORTB salida a displays
 ldi r16,0x0F
 out PORTB,r16 ; Deshabilita displays
BEGIN: ldi DISP,0x00
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,3
 nop
 sbi PORTB,3
 inc DISP
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,2
 nop
 sbi PORTB,2
 inc DISP
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,1
 nop
 sbi PORTB,1
 inc DISP
 rcall CONVER
 out PORTD,TEMP
 cbi PORTB,0
 nop
 sbi PORTB,0
 rjmp BEGIN

; subrutinas

CONVER: ldi ZH,HIGH(TABLE*2)
 ldi ZL,LOW(TABLE*2)
 add ZL,DISP
 lpm
 mov TEMP,r0
 ret

; Tabla en memoria de programa
TABLE:
.DB 0xEC,0x7E,0x70,0xEE

Archivos de programa:
Descargar

Semáforo

Programa para ATmega8

Control de 2 semáforos.

-Uso de contadores
-Subrutina de retardo calibrado a 1 s para oscilador interno de 8 MHz

Diagrama de conexión:


Funcionamiento:

             La luz Verde dura 25 segundos.
             La Luz Ámbar dura 5 segundos.
             La Luz Roja dura 30 segundos.
  • Se crea una variable TIME que se incrementa cada 1 segundo (calibrado mediante contadores para un cristal de 10 MHz).
  • Se verifica la variable TIME para cambiar el estado de las luces según el siguiente diagrama:

Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos 
;Salidas: Puerto D (RD0-RD5)
;    RD0=Verde1, RD1=Ambar1, RD2=Rojo1
;   RD3=Verde2, RD4=Ambar2, RD5=Rojo2
;Para reloj interno de 8 MHz
;---------------------------------------------------------

.nolist
.include "m8def.inc"
.list
.device  atmega8

.def COUNT1=r20
.def COUNT2=r21
.def COUNT3=r22
.def TIME=r4
.def STATE=r17

.org 0x0000

; Inicializacion de Stack
 ldi r16,LOW(RAMEND)
 out SPL,r16
 ldi r16,HIGH(RAMEND)
 out SPH,r16
; Fin inicializacion de Stack

; Inicio de programa

 ldi r16,0xFF
 out DDRD,r16 ; Puerto B como salida
 clr TIME
BEGIN: ldi r16,0x00 ; 00 segundos
 cp r16,TIME
 brbs 1,FIRST
 ldi r16,0x19 ; 25 segundos
 cp r16,TIME
 brbs 1,SECOND
 ldi r16,0x1E ; 30 segundos
 cp r16,TIME
 brbs 1,THIRD
 ldi r16,0x37 ; 55 segundos
 cp r16,TIME
 brbs 1,FOURTH
 rjmp FINISH
FIRST: ldi STATE,0x21 ; '00100001'b
 out PORTD,STATE
 rjmp FINISH
SECOND: ldi STATE,0x22 ; '00100010'b
 out PORTD,STATE
 rjmp FINISH
THIRD: ldi STATE,0x0C ; '00001100'b
 out PORTD,STATE
 rjmp FINISH 
FOURTH: ldi STATE,0x14 ; '00010100'b
 out PORTD,STATE
FINISH: nop
 rcall DELAY
 rjmp BEGIN

; Subrutinas

DELAY: ldi COUNT1,0xFF ; Retardo de 1 segundo
 ldi COUNT2,0xFF
 ldi COUNT3,0x29
LOOP: dec COUNT1
 brne LOOP
 ldi COUNT1,0xFF
 dec COUNT2
 brne LOOP
 ldi COUNT1,0xFF
 ldi COUNT2,0xFF
 dec COUNT3
 brne LOOP
 inc TIME
 ldi r16,0x3C ; reiniciar en 60 segundos
 cp r16,TIME
 brne RETURN
 clr  TIME
RETURN: ret

Archivos de programa:
Descargar

Selección de Código Binario y Visualización

Programa para ATmega8

Monitorea la entrada de un código binario (4 bits) y muestra la selección en decimal mediante un display.

-Aplicación de Tabla de datos para conversión Hexadecimal a 7 segmentos

Diagrama de conexión:


Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa que muestra codigo seleccionado en binario
;en un display catodo comun de 7 segmentos
;Entradas: Puerto B (Pines PB0-PB3)
;Salidas: Puerto D (Pines PD1-PD7)
;Oscilador interno de 8 MHz
;---------------------------------------------------------
.nolist
.include "m8def.inc"
.list
.device  atmega8

.org 0x0000

;Definicion de stack
 ldi  r25,HIGH(RAMEND)
 out  SPH,r25
 ldi  r25,LOW(RAMEND)
 out  SPL,r25
;fin definicion de stack

BEGIN: ldi r18,0x00 ;RB7-RB0 como entradas
 out DDRB,r18 
 ldi r18,0xFF ;RD7-RD0 como salidas
 out DDRD,r18
LOOP: in r17,PINB
 andi r17,0x0F
 rcall SAVE
 out PORTD,r16
 rjmp LOOP

;Subrutinas

SAVE: ldi ZH,HIGH(2*TABLA)
 ldi ZL,LOW(2*TABLA)
 add ZL,r17
 lpm
 mov r16,r0
 ret

;Tabla de conversion hex a 7 segmentos
TABLA:
.DB 0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E 
.DB 0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2
;Fin de tabla

Archivos de Programa:
Descargar

Luz Secuencial

Programa para ATmega8

Desplaza una luz en el Puerto B de derecha a izquierda y de izquierda a derecha.

-Comandos de rotación LSL y LSR
-Subrutina de retardo
-Calibrado para cristal interno de 8 MHZ

Esquema de conexión:


 Programa en Assembler:

;-----------------------------------------------------------
;Autor: LONELY113
;  http://lonely113.blogspot.com
;
;Programa para desplazamiento de luz en el puerto B

;Desplazamiento cada 1 s (Para oscilador interno de 8 MHz). 
;Salidas: Puerto B (PB0-PB7)
;-----------------------------------------------------------

;Para reloj interno de 8 MHz
.nolist
.include    "m8def.inc"
.list
.device     atmega8
.org     0x0000

.def COUNT1=r20
.def COUNT2=r21
.def COUNT3=r22
.def NUMBER=r4
.def TEMP=r17
; Inicializacion de stack
 ldi r16,LOW(RAMEND)
 out SPL,r16
 ldi r16,HIGH(RAMEND)
 out SPH,r16
; Fin inicializacion de stack

; Inicio de programa
 ldi r16,0xFF   ; Puerto B como salida
 out DDRB,r16
 clr r16   
 out PORTB,r16  ; Borrar PORTB 
 ldi r16,0x07 
 mov NUMBER,r16 ; Desplazar 7 posiciones
 ldi TEMP,0x01  ; '00000001'b
 out PORTB,TEMP  
FIRST: rcall DELAY
 lsl TEMP
 out PORTB,TEMP
 dec NUMBER
 brne FIRST    ; Desplaza 7 veces a la izquierda
 ldi r16,0x07
 mov NUMBER,r16
SECOND: rcall DELAY
 lsr TEMP
 out PORTB,TEMP
 dec NUMBER
 brne SECOND    ; Desplaza 7 veces a la derecha
 ldi r16,0x07
 mov NUMBER,r16
 rjmp FIRST    ; Bucle infinito

; Subrutinas

DELAY: ldi COUNT1,0xFF ; Retardo de 1 segundo
 ldi COUNT2,0xFF
 ldi COUNT3,0x29
LOOP: dec COUNT1
 brne LOOP
 ldi COUNT1,0xFF
 dec COUNT2
 brne LOOP
 ldi COUNT1,0xFF
 ldi COUNT2,0xFF
 dec COUNT3
 brne LOOP
 ret


Archivos de programa:
Descargar