• Viernes 8 de Noviembre de 2024, 20:17

Autor Tema:  Teclado Matricial y Display 7 Segmentos - ATMEL AVR  (Leído 30757 veces)

netshark

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Teclado Matricial y Display 7 Segmentos - ATMEL AVR
« en: Viernes 29 de Mayo de 2009, 22:40 »
0
EL TECLADO MATRICIAL
Implementado con un Micro ATMEL AVR ATMEGA 8535

Para entender un poco sobre el funcionamiento eléctrico de un teclado matricial, lean la siguiente presentación:
Acá la presentación: EL_TECLADO_MATRICIAL_v1_4.pdf (1.6 MB)

Para la práctica se necesita un teclado matricial de 4X4, lo pueden comprar o fabricarlo.
Si tienen los recursos, pueden comprar el teclado, pero les costará alrededor de 135 pesos.



Una forma mucho más económica y didáctica es construirlo ustedes mismos.

Material:
- 16 pushbuttons pequeños
- 1 PCB tipo "Easy Circuit" que pueda alojar todos los botones
- Cable y soldadura

Debemos conectar los switches de forma que toda una fila de ellos tengan una terminal común, así las 4 filas cada una. Después cada columna debe tener la otra terminal común.
Se ve claramente en el diagrama:


Y si prefieren usar un display de 7 segmentos, el circuito es el siguiente:


El display de 7 segmentos está construido de la siguiente forma:


Además una sencilla tabla de cuales segmentos encender para cada número:


Teclado hecho en casa



Se tuvieron que cortar algunas pistas verticales con cutter para separar las columnas, y funciona a la perfección.





En este caso se usó un microcontrolador ATMEL ATMEGA8535 datasheet pero puede bien ser implementado en un microcontrolador más pequeño, como el ATMEGA8 sin mucha dificultad, sólo habría que cambiar el acomodo de los puertos y el cableado, (datasheet)

Se implementó un programa para controlar el teclado matricial, y según la tecla que se presione, aparecerá:

1) LEDs encendidos en una tira de leds en función de la fila-columna
2) Código del 0 a la F en un display de 7 segmentos.



La tira de 10 leds sirve para ver qué tecla se presionó. De izquierda a derecha, los primeros dos leds no se utilizan, los siguientes 4 indican la columna y los ultimos 4 indican el renglón. Hay un led ROJO cercano al AVR (concretamente en el pin PD7) que se prende cuando detecta alguna tecla presionada y se apaga cuando termina la decodificación ó si descarta que se haya presionado (por si fue ruido o un falso contacto)



Ejemplo al presionar la tecla en la ultima fila de la ultima columna...



Aparecen:


Es el programa básico con decodificación de filas y columnas y tiene protección antirrebotes. Ésta es la versión que jala con la tira de LEDs:

Código: Text
  1. ;Código decodificador de teclado matricial
  2. ;Implementado por David Valencia Pesqueira en UPIITA-IPN 2009
  3. ;Profesor: Dr. Antonio Hernández Zavala
  4. ;GRUPO 4BM3
  5. ;
  6. ;   El siguiente programa decodifica un teclado matricial
  7. ;   de 16 teclas. Éste tipo de algoritmo está diseñado para
  8. ;   detectar sólo una tecla a la vez, ya que para detectar
  9. ;   más de una se requieren diodos por cada interruptor en la
  10. ;   construcción del teclado matricial y éso ya queda fuera
  11. ;   del enfoque didáctico de éste programa.
  12. ;
  13. ;   Para más información sobre la construcción de teclados
  14. ;   matriciales con diodos visitar:
  15. ;   http://www.dribin.org/dave/keyboard/one_html/
  16. ;
  17. ;Historial
  18. ;v0.1 - Pruebas de las resistencias Pull-UP --- OK
  19. ;v0.2 - Probando la salida del tempscan
  20. ;v0.3 - Nueva estructura de tempscan -- OK
  21. ;v0.4 - Salida por tira de leds en PORTA -- OK
  22. ;
  23. ;Hardware en un ATMEL ATMega 8535
  24. ;El teclado está conectado de la siguiente manera:
  25. ;
  26. ;          COLUMNAS
  27. ;              0    1   2   3
  28. ;   
  29. ;   FILAS   0  X    X   X   X  PC4
  30. ;
  31. ;           1  X    X   X   X  PC5
  32. ;
  33. ;           2  X    X   X   X  PC6
  34. ;
  35. ;           3  X    X   X   X  PC7
  36. ;          
  37. ;              PC0  PC1 PC2 PC3
  38. ;
  39. ;######################################################
  40. ;CABECERA
  41. .include "m8535def.inc"
  42.  
  43. ;######################################################
  44. ;Vector de Interrupciones
  45. .org 0x00
  46.     rjmp reset ;interrupción de Reset
  47. ;
  48. ;######################################################
  49. ;Variables Globales
  50. ;La variable tempscan se acomoda de la siguiente forma
  51.  
  52. ;tempscan = [fila3,fila2,fila1,fila0,col3,col2,col1,col0]
  53. ;Son "banderas" que se prenden para indicar en qué fila
  54. ; y qué columna se halla la tecla.
  55.  
  56.  
  57. .def tempscan=r17
  58. .def temp=r16
  59.  
  60. ;Rutina Principal
  61. reset:
  62.     ;inicializar pila
  63.     cli
  64.     ldi temp,low(ramend)
  65.     out spl,temp
  66.     ldi temp,high(ramend)
  67.     out sph,temp
  68.     sei
  69.     rjmp init
  70.  
  71. init:
  72.     ;Inicializar Puertos
  73.     ;Este código emplea el puerto C, con los bits 0 al 3 para las columnas
  74.     ;y los bits 4 al 7 para las filas.
  75.     ;Inicia con las filas como salidas con ceros y las columnas como entradas
  76.     ;que se mantienen en un nivel alto mientras no estén conectadas
  77.     ;Para lograr esto, se habilitan las "resistencias pull-up" que conectan
  78.     ;el pin deseado hacia VCC.
  79.     ;Para hacerlo se declaran los pines como entradas (DDRC=0) pero
  80.     ;enviamos 0xFF al registro PORTC para activarlas.
  81.  
  82.     ;Declarando al nibble alto como salida y al bajo como entrada
  83.     ldi temp,0b11110000
  84.     out DDRC,temp
  85.     ;Activando las resistencias pull-up en la parte baja
  86.     ldi temp,0x0F
  87.     out PORTC,temp
  88.     ;Si se presiona una tecla, el "0" de alguna fila será
  89.     ;detectado por las columnas, y entonces comienza el
  90.     ;proceso de decodificación.
  91.  
  92.     ldi temp,0b10000000
  93.     out DDRD,temp
  94.     ;Puerto D como salida para cuando detecta tecla
  95.     ser temp
  96.     out DDRA,temp
  97.     ;Nibble bajo del puerto A como salida
  98.     clr temp
  99.     out PORTA,temp
  100.  
  101.     clr tempscan ;Borra el resultado del escaneo
  102.  
  103.     rjmp begin
  104.  
  105. begin:
  106.     clr temp
  107.     out PORTD,temp
  108.     ;Probar si algun botón fue presionado
  109.     in temp,PINC
  110.     cpi temp,0x0F ;Si hay algun cero en las columnas, buscar la tecla
  111.     brne antirrebotes
  112. rjmp begin
  113.  
  114. antirrebotes:
  115. ;Esta rutina espera un corto periodo de tiempo mientras el interruptor
  116. ;se estabiliza para evitar que el micro detecte la misma tecla varias
  117. ;veces al igual que posible ruido.
  118.     ;Vuelve a leer las entradas
  119.     ser temp
  120.     out PORTD,temp
  121.     rcall delay
  122.     in temp,PINC
  123.     cpi temp,0x0F
  124.     ;Si detecta el cero de nuevo, procesa la detección
  125.     brne deteccion
  126.     ;Si fue un falso contacto, vuelve a empezar
  127.     rjmp begin
  128. ;FIN DE ANTIRREBOTES
  129.  
  130. deteccion:
  131.     clr tempscan
  132.     ;inicializamos el código de escaneo temporal
  133.     ldi tempscan,0x00
  134.     ;Buscar las columnas
  135.     colscan:
  136.         sbis pinc,0 ;prueba la columna 0
  137.         ldi tempscan,0x01
  138.         sbis pinc,1 ;prueba la columna 1
  139.         ldi tempscan,0x02
  140.         sbis pinc,2 ;prueba la columna 2
  141.         ldi tempscan,0x04
  142.         sbis pinc,3 ;prueba la columna 3
  143.         ldi tempscan,0x08
  144.  
  145.    
  146.     cpi tempscan,0x00 ;si no halló la columna, repetir
  147.     breq init
  148.  
  149.     ;Ahora que se encontró la columna, tienen que invertirse
  150.     ;los sentidos del nibble bajo y el alto para buscar la
  151.     ;fila
  152.     rcall invertir
  153.     ;Ahora invertidos, buscaremos si alguna fila está
  154.     ;baja
  155.     in temp,PINC
  156.     cpi temp,0xF0 ;Si hay algun cero en las columnas, buscar la tecla
  157.     brne filadetectada
  158.     rjmp init ;Si no hay fila con cero, devuelve los puertos
  159.     ;a su estado original y reinicia el programa
  160.    
  161.     filadetectada:
  162.     ;Buscar la fila
  163.     filascan:
  164.         ldi temp,0x10
  165.  
  166.         sbis pinc,4 ;Prueba la fila 0
  167.         rjmp col0
  168.         sbis pinc,5 ;Prueba la fila 1
  169.         rjmp col1
  170.         sbis pinc,6 ;Prueba la fila 2
  171.         rjmp col2
  172.         sbis pinc,7 ;Prueba la fila 3
  173.         rjmp col3
  174.         rjmp init ;Si no halla la fila, reinicia
  175.  
  176.         ;A continuación se escribirá el valor correspondiente
  177.         ;a la fila, se usa el comando ROL para multiplicar por 2
  178.         ;pero se limpia antes la bandera de acarreo para evitar
  179.         ;que se sume y entregue valores erróneos.
  180.         col0:
  181.             add tempscan,temp
  182.             rjmp fincol
  183.  
  184.         col1:
  185.             ldi temp,0x20
  186.             add tempscan,temp
  187.             rjmp fincol
  188.        
  189.         col2:
  190.             ldi temp,0x40
  191.             add tempscan,temp
  192.             rjmp fincol
  193.  
  194.         col3:
  195.             ldi temp,0x80
  196.             add tempscan,temp
  197.             rjmp fincol
  198.    
  199.     fincol:
  200.  
  201.     ;Toca procesar el código temporal para sacarlo
  202.     ;por los leds, en este caso sale en 4 leds en puertoA
  203.     out PORTA,tempscan
  204.     clr tempscan
  205.     rcall desinvertir ;devolver los puertos al estado original
  206.     rjmp begin
  207.  
  208. ;Subrutinas
  209.  
  210. delay:
  211.     cli
  212.     ;Respaldar variables globales en la pila
  213.     push r16
  214.     push r17
  215.     ;Inicia secuencia de retraso
  216.     loop0: ldi r17,0x04
  217.     loop1: ldi r16,0xFF
  218.     loop2: dec r16
  219.         brne loop2
  220.         dec r17
  221.         brne loop1
  222.     sei
  223.     ;Restaurar las variables desde la pila
  224.     pop r17
  225.     pop r16
  226. ret
  227.  
  228. invertir: ;Inversión de los pines
  229.     ldi temp,0b00001111
  230.     out DDRC,temp
  231.     ;Activando las resistencias pull-up en la parte alta
  232.     ldi temp,0xF0
  233.     out PORTC,temp
  234.     ;Ahora la parte alta es entrada con pullup y la parte
  235.     ;baja son salidas con ceros
  236. ret
  237.  
  238. desinvertir: ;Devolver los pines al estado inicial
  239.     ldi temp,0b11110000
  240.     out DDRC,temp
  241.     ;Activando las resistencias pull-up en la parte alta
  242.     ldi temp,0x0F
  243.     out PORTC,temp
  244.     ;Ahora la parte baja es entrada con pullup y la parte
  245.     ;alta son salidas con ceros
  246. ret
  247.  
  248. ;FIN DEL PROGRAMA TECLADO MATRICIAL
  249.  
  250.  

Esta otra versión saca qué tecla fue presionada en un display de 7 segmentos:

Aquí unas fotos:


Código: Text
  1. ;Código decodificador de teclado matricial
  2. ;Implementado por David Valencia Pesqueira en UPIITA-IPN 2009
  3. ;Profesor: Dr. Antonio Hernández Zavala
  4. ;GRUPO 4BM3
  5. ;
  6. ;   El siguiente programa decodifica un teclado matricial
  7. ;   de 16 teclas. Éste tipo de algoritmo está diseñado para
  8. ;   detectar sólo una tecla a la vez, ya que para detectar
  9. ;   más de una se requieren diodos por cada interruptor en la
  10. ;   construcción del teclado matricial y éso ya queda fuera
  11. ;   del enfoque didáctico de éste programa.
  12. ;
  13. ;   Para más información sobre la construcción de teclados
  14. ;   matriciales con diodos visitar:
  15. ;   http://www.dribin.org/dave/keyboard/one_html/
  16. ;
  17. ;Historial
  18. ;v0.1 - Pruebas de las resistencias Pull-UP --- OK
  19. ;v0.2 - Probando la salida del tempscan
  20. ;v0.3 - Nueva estructura de tempscan -- OK
  21. ;v0.4 - Salida por tira de leds en PORT_DISP -- OK
  22. ;v0.5 - Salida por tira de leds en 4 pines de PORT_DISP -- OK
  23. ;
  24. ;Hardware en un ATMEL ATMega 8535
  25. ;El teclado está conectado de la siguiente manera:
  26. ;
  27. ;          COLUMNAS
  28. ;              0    1   2   3
  29. ;   
  30. ;   FILAS   0  X    X   X   X  PC4
  31. ;
  32. ;           1  X    X   X   X  PC5
  33. ;
  34. ;           2  X    X   X   X  PC6
  35. ;
  36. ;           3  X    X   X   X  PC7
  37. ;          
  38. ;              PC0  PC1 PC2 PC3
  39. ;
  40. ;######################################################
  41. ;CABECERA
  42. .include "m8535def.inc"
  43.  
  44. ;######################################################
  45. ;EQUIVALENCIAS
  46. ;Puerto para el teclado
  47. .equ PORT_K=PORTC
  48. .equ PIN_K=PINC
  49. .equ DDR_K=DDRC
  50. ;Puerto de salida para el display de Siete Segmentos
  51. .equ PORT_DISP=PORTA
  52. .equ DDR_DISP=DDRA
  53.  
  54. ;######################################################
  55. ;Vector de Interrupciones
  56. .org 0x00
  57.     rjmp reset ;interrupción de Reset
  58. ;
  59. ;######################################################
  60. ;Variables Globales
  61. ;La variable tempscan se acomoda de la siguiente forma
  62.  
  63. ;tempscan = [-,-,-,-,fila01,fila00,col01,col00]
  64. ;Son "banderas" que se prenden para indicar en qué fila
  65. ;y qué columna se halla la tecla.
  66. ;
  67.  
  68. .def tempscan=r17
  69. .def temp=r16
  70.  
  71. ;Rutina Principal
  72. reset:
  73.     ;inicializar pila
  74.     cli
  75.     ldi temp,low(ramend)
  76.     out spl,temp
  77.     ldi temp,high(ramend)
  78.     out sph,temp
  79.     sei
  80.     rjmp init
  81.  
  82. init:
  83.     ;Inicializar Puertos
  84.     ;Este código emplea el puerto C, con los bits 0 al 3 para las columnas
  85.     ;y los bits 4 al 7 para las filas.
  86.     ;Inicia con las filas como salidas con ceros y las columnas como entradas
  87.     ;que se mantienen en un nivel alto mientras no estén conectadas
  88.     ;Para lograr esto, se habilitan las "resistencias pull-up" que conectan
  89.     ;el pin deseado hacia VCC.
  90.     ;Para hacerlo se declaran los pines como entradas (DDR_K=0) pero
  91.     ;enviamos 0xFF al registro PORT_K para activarlas.
  92.  
  93.     ;Declarando al nibble alto como salida y al bajo como entrada
  94.     ldi temp,0b11110000
  95.     out DDR_K,temp
  96.     ;Activando las resistencias pull-up en la parte baja
  97.     ldi temp,0x0F
  98.     out PORT_K,temp
  99.     ;Si se presiona una tecla, el "0" de alguna fila será
  100.     ;detectado por las columnas, y entonces comienza el
  101.     ;proceso de decodificación.
  102.  
  103.     ldi temp,0b10000000
  104.     out DDRD,temp
  105.     ;Puerto D como salida para cuando detecta tecla
  106.    
  107.     ser temp
  108.     out DDR_DISP,temp
  109.     ;Puerto A como salida
  110.     ldi temp,0b00000010 ;Enviar un guion al puerto A
  111.     out PORT_DISP,temp
  112.  
  113.     clr tempscan ;Borra el resultado del escaneo
  114.  
  115.     rjmp begin
  116.  
  117. begin:
  118.     clr temp
  119.     out PORTD,temp
  120.     ;Probar si algun botón fue presionado
  121.     in temp,PIN_K
  122.     cpi temp,0x0F ;Si hay algun cero en las columnas, buscar la tecla
  123.     brne antirrebotes
  124. rjmp begin
  125.  
  126. antirrebotes:
  127. ;Esta rutina espera un corto periodo de tiempo mientras el interruptor
  128. ;se estabiliza para evitar que el micro detecte la misma tecla varias
  129. ;veces al igual que posible ruido.
  130.     ;Vuelve a leer las entradas
  131.     ser temp
  132.     out PORTD,temp
  133.     rcall delay
  134.     in temp,PIN_K
  135.     cpi temp,0x0F
  136.     ;Si detecta el cero de nuevo, procesa la detección
  137.     brne deteccion
  138.     ;Si fue un falso contacto, vuelve a empezar
  139.     rjmp begin
  140. ;FIN DE ANTIRREBOTES
  141.  
  142. deteccion:
  143.     clr tempscan
  144.     ;inicializamos el código de escaneo temporal
  145.     ldi tempscan,0x00
  146.     ;Buscar las columnas
  147.     colscan:
  148.         sbis PIN_K,0 ;prueba la columna 0
  149.         ldi tempscan,0x00
  150.         sbis PIN_K,1 ;prueba la columna 1
  151.         ldi tempscan,0x01
  152.         sbis PIN_K,2 ;prueba la columna 2
  153.         ldi tempscan,0x02
  154.         sbis PIN_K,3 ;prueba la columna 3
  155.         ldi tempscan,0x03
  156.  
  157.     ;Ahora que se encontró la columna, tienen que invertirse
  158.     ;los sentidos del nibble bajo y el alto para buscar la
  159.     ;fila
  160.     rcall invertir
  161.     ;Ahora invertidos, buscaremos si alguna fila está
  162.     ;baja
  163.     in temp,PIN_K   
  164.     cpi temp,0xF0 ;Si hay algun cero en las columnas, buscar la tecla
  165.     brne filadetectada
  166.     rjmp init ;Si no hay fila con cero, devuelve los puertos
  167.     ;a su estado original y reinicia el programa
  168.    
  169.     filadetectada:
  170.     ;Buscar la fila
  171.     filascan:
  172.        
  173.         sbis PIN_K,4 ;Prueba la fila 0
  174.         rjmp fila0
  175.         sbis PIN_K,5 ;Prueba la fila 1
  176.         rjmp fila1
  177.         sbis PIN_K,6 ;Prueba la fila 2
  178.         rjmp fila2
  179.         sbis PIN_K,7 ;Prueba la fila 3
  180.         rjmp fila3
  181.         rjmp init ;Si no halla la fila, reinicia
  182.  
  183.         ;A continuación se escribirá el valor correspondiente
  184.         ;a la fila, se usa el comando ROL para multiplicar por 2
  185.         ;pero se limpia antes la bandera de acarreo para evitar
  186.         ;que se sume y entregue valores erróneos.
  187.         fila0:
  188.             ldi temp,0x00
  189.             add tempscan,temp
  190.             rjmp fincol
  191.  
  192.         fila1:
  193.             ldi temp,0x04
  194.             add tempscan,temp
  195.             rjmp fincol
  196.        
  197.         fila2:
  198.             ldi temp,0x08
  199.             add tempscan,temp
  200.             rjmp fincol
  201.  
  202.         fila3:
  203.             ldi temp,0x0C
  204.             add tempscan,temp
  205.             rjmp fincol
  206.    
  207.     fincol:
  208.  
  209.     ;Toca procesar el código temporal para sacarlo
  210.     ;por los leds, en este caso sale en 4 leds en puertoA
  211.     ;out PORT_DISP,tempscan
  212.     rcall desinvertir ;devolver los puertos al estado original
  213.     rcall scantoseven ;Mandar al display 7 segmentos
  214.     rjmp begin
  215.  
  216. ;Subrutinas
  217.  
  218. delay:
  219.     cli
  220.     ;Respaldar variables globales en la pila
  221.     push r16
  222.     push r17
  223.     ;Inicia secuencia de retraso
  224.     loop0: ldi r17,0x20
  225.     loop1: ldi r16,0xFF
  226.     loop2: dec r16
  227.         brne loop2
  228.         dec r17
  229.         brne loop1
  230.     sei
  231.     ;Restaurar las variables desde la pila
  232.     pop r17
  233.     pop r16
  234. ret
  235.  
  236. invertir: ;Inversión de los pines
  237.     ldi temp,0b00001111
  238.     out DDR_K,temp
  239.     ;Activando las resistencias pull-up en la parte alta
  240.     ldi temp,0xF0
  241.     out PORT_K,temp
  242.     ;Ahora la parte alta es entrada con pullup y la parte
  243.     ;baja son salidas con ceros
  244. ret
  245.  
  246. desinvertir: ;Devolver los pines al estado inicial
  247.     ldi temp,0b11110000
  248.     out DDR_K,temp
  249.     ;Activando las resistencias pull-up en la parte alta
  250.     ldi temp,0x0F
  251.     out PORT_K,temp
  252.     ;Ahora la parte baja es entrada con pullup y la parte
  253.     ;alta son salidas con ceros
  254. ret
  255.  
  256. scantoseven: ;Convierte el escaneo a display 7 segmentos catodo común
  257.     ;Revisar el cableado del display en las hojas adjuntas 
  258.     ;El bit mas alto va al segmento "a" hasta el "g" y luego el punto decimal.
  259.     cpi tempscan,0x00
  260.     breq cero
  261.     cpi tempscan,0x01
  262.     breq uno
  263.     cpi tempscan,0x02
  264.     breq dos
  265.     cpi tempscan,0x03
  266.     breq tres
  267.     cpi tempscan,0x04
  268.     breq cuatro
  269.     cpi tempscan,0x05
  270.     breq cinco
  271.     cpi tempscan,0x06
  272.     breq seis
  273.     cpi tempscan,0x07
  274.     breq siete
  275.     cpi tempscan,0x08
  276.     breq ocho
  277.     cpi tempscan,0x09
  278.     breq nueve
  279.     cpi tempscan,0x0A
  280.     breq letraA
  281.     cpi tempscan,0x0B
  282.     breq letraB
  283.     cpi tempscan,0x0C
  284.     breq letraC
  285.     cpi tempscan,0x0D
  286.     breq letraD
  287.     cpi tempscan,0x0E
  288.     breq letraE
  289.     cpi tempscan,0x0F
  290.     breq letraF
  291.     rjmp guion
  292.  
  293.     cero:ldi temp,0b11111100
  294.     rjmp sacarsegmentos
  295.     uno:ldi temp,0b01100000
  296.     rjmp sacarsegmentos
  297.     dos:ldi temp,0b11011010
  298.     rjmp sacarsegmentos
  299.     tres:ldi temp,0b11110010
  300.     rjmp sacarsegmentos
  301.     cuatro:ldi temp,0b01100110
  302.     rjmp sacarsegmentos
  303.     cinco:ldi temp,0b10110110
  304.     rjmp sacarsegmentos
  305.     seis:ldi temp,0b10111110
  306.     rjmp sacarsegmentos
  307.     siete:ldi temp,0b11100000
  308.     rjmp sacarsegmentos
  309.     ocho:ldi temp,0b11111110
  310.     rjmp sacarsegmentos
  311.     nueve:ldi temp,0b11110110
  312.     rjmp sacarsegmentos
  313.     letraA:ldi temp,0b11101110
  314.     rjmp sacarsegmentos
  315.     letraB:ldi temp,0b00111110
  316.     rjmp sacarsegmentos
  317.     letraC:ldi temp,0b10011100
  318.     rjmp sacarsegmentos
  319.     letraD:ldi temp,0b01111010
  320.     rjmp sacarsegmentos
  321.     letraE:ldi temp,0b10011110
  322.     rjmp sacarsegmentos
  323.     letraF:ldi temp,0b10001110
  324.     rjmp sacarsegmentos
  325.     guion:ldi temp,0b00000010
  326.  
  327.     sacarsegmentos: ;enviar al display siete segmentos
  328.     out PORT_DISP,temp
  329. ret
  330.  
  331. ;FIN DEL PROGRAMA TECLADO MATRICIAL
  332.  

Espero el programa sea claro y cualquier duda por favor dejen un mensaje en este tema.

 :D
« última modificación: Martes 27 de Octubre de 2009, 22:31 por netshark »

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Teclado Matricial y Display 7 Segmentos - ATMEL AVR
« Respuesta #1 en: Sábado 30 de Mayo de 2009, 23:08 »
0
Gracias netshark por este interesante post, esta muy bien detallado y facilita mucho la construcción de la placa y la comprensión del código. Por trabajo estoy bastante ausente del foro y veo que ya no tiene la actividad que tenia hace un tiempo, al menos el subforo de microcontroladores, por eso quiero organizar algo para activar nuevamente la actividad del sitio y volver al tiempo en el que el foro se había vuelto adicción  :comp:

Comienzo agradeciendo tu aporte y te motivo a que sigas haciendo este tipo de posteos, muy bueno!  :good:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

netshark

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Teclado Matricial y Display 7 Segmentos - ATMEL AVR
« Respuesta #2 en: Domingo 31 de Mayo de 2009, 17:27 »
0
Saludos!

Y es cierto, me ha parecido que la actividad en el foro está un poco floja, pero mi intención es ayudar poniendo mi granito de arena.

Hasta hace poco no sabía nada de electrónica, ni mucho menos de microcontroladores pero se me ha dado la programación en diversos lenguajes. Tengo compañeros en cuyas escuelas preparatorias les enseñaron a manejar PIC, AVR y otros y me imaginé que era un mundo oscuro y difícil de entender. Ahora en la universidad descubrí que es un universo bastante interesante y con un sinfín de aplicaciones.

Estoy preparando otros programas igualmente didácticos (manejo de LCD, interfaz USART con la computadora, etc) como una forma de introducirse a los microcontroladores AVR, que han tenido un increíble boom en la industria y no es para menos.

Una duda: Tengo en mi poder un fenomenal e-book sobre Lenguaje C para AVR, ¿Hay algún problema si lo subo a este foro?

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Teclado Matricial y Display 7 Segmentos - ATMEL AVR
« Respuesta #3 en: Lunes 1 de Junio de 2009, 05:59 »
0
Tal como dices, hay un sinfín de aplicaciones y los limites dependen de la imaginación de cada uno, mis felicitaciones por la voluntad para armar los documentos detallados y mas aun por compartirlos con todos nosotros.

Sobre el libro de lenguaje C para AVR, es bienvenido como todo aquello que quieras compartir, tienes a disposición el servidor FTP del foro para subir archivos de gran tamaño, los datos para el acceso los encontraras en el siguiente enlace--> viewtopic.php?t=12696  Dentro del FTP hay carpetas destinadas a las diferentes familias de microcontroladores, creo que el directorio de ATMEL esta vacio :argh: .. luego de subir el libro si quieres puedes poner el enlace en un post para un rápido acceso desde el subforo.

netshark mil gracias y un abrazo  :beer:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

netshark

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Teclado Matricial y Display 7 Segmentos - ATMEL AVR
« Respuesta #4 en: Miércoles 3 de Junio de 2009, 03:32 »
0
En el primer post puse las fotos del display empleando el segundo código.

Posteriormente pondré el código para lograr esto:



Stay tuned

P.D: @Einstec: Al parecer el FTP está mal, porque intenté entrar con Filezilla y me marca que está mal el password.