viernes, 31 de mayo de 2013

MICRO-CONTROLADORES: Programa teclado en Ensamblador


El lenguaje Ensamblador para programar micro-controladores tiene grandes ventajas, debido a que permite controlar a nivel mas básico el programa, especialmente es útil en aplicaciones donde el tiempo deba ser preciso. 


PROGRAMA USO DEL TECLADO PIC 16F887

En el siguiente programa se muestra el despliegue de los números de un teclado mediante 6 displays. El teclado esta conectado al puerto B. Ademas el programa esta elaborado en MPLAB y ademas contiene su simulación adjunta en Proteus

TECLADO Y DISPLAYS KS
Código en Ensamblador del PIC16F887


LIST P=16F887
INCLUDE 
;Declaracion variables
tecla      EQU 0x20
num_tecla     EQU 0x21
barrido_display    EQU 0x22
ayuda      EQU 0x24
cont1_pausa     EQU 0x25
cont2_pausa     EQU 0X26
cont3_pausa     EQU 0X27
contador_barrido_display EQU 0x28
display1     EQU 0x29
display2     EQU 0x2A
display3     EQU 0x2B
display4     EQU 0x2C
display5     EQU 0x2D
display6     EQU 0x2F



ORG 0X00
goto INICIO

ORG 0x10

INICIO:
;Inicializacion variables barrido y num_tecla
clrf contador_barrido_display
clrf barrido_display
clrf num_tecla
clrf ayuda
clrf cont1_pausa
clrf cont2_pausa
movlw 0x01
movwf cont3_pausa 

;Banco 3
bsf STATUS,RP0
bsf STATUS,RP1

;Valores digitales Puerto B
clrf ANSELH  
bcf OPTION_REG,NOT_RBPU

;Banco 2
bcf STATUS,RP1
bsf STATUS,RP0

;Mitad entradas(1) mitad salidas(0)
movlw 0xF0
movwf TRISB

;Salidas puerto C puerto D
clrf TRISC
clrf TRISD

;Banco 0
bcf STATUS,RP0
bcf STATUS,RP1

;PORT B mitad en alto(entradas) y mitad el bajo(salidas)
movlw 0xF0
movwf PORTB

;En bajo puerto C y con el contador puerto D
clrf PORTC
movlw 0xFF
movwf PORTC
movwf display1
movwf display2
movwf display3
movwf display4
movwf display5
movwf display6
clrf PORTD


BARRIDO_DISPLAY:
clrf num_tecla
call TABLA_POSICIONES
movwf barrido_display
movwf PORTD  

;Si es el display1
movlw 0x00
xorwf contador_barrido_display,W
btfss STATUS,Z
goto DISPLAY2
movfw display1
movwf PORTC
goto SIGUIENTE_DISPLAY


DISPLAY2:  
;Si es el display2
movlw 0x01
xorwf contador_barrido_display,W
btfss STATUS,Z
goto DISPLAY3
movfw display2
movwf PORTC
goto SIGUIENTE_DISPLAY

DISPLAY3:  
;Si es el display3 
movlw 0x02
xorwf contador_barrido_display,W
btfss STATUS,Z
goto DISPLAY4
movfw display3
movwf PORTC
goto SIGUIENTE_DISPLAY

DISPLAY4:
;Si es el display4
movlw 0x03
xorwf contador_barrido_display,W
btfss STATUS,Z
goto DISPLAY5
movfw display4
movwf PORTC
goto SIGUIENTE_DISPLAY

DISPLAY5
;Si es el display5
movlw 0x04
xorwf contador_barrido_display,W
btfss STATUS,Z
goto DISPLAY6
movfw display5
movwf PORTC
goto SIGUIENTE_DISPLAY

DISPLAY6
;Si es el display6
movfw display6
movwf PORTC


SIGUIENTE_DISPLAY:
incf contador_barrido_display,F 


;Compara si no ha cambiado, es decir sigue siendo 0xF0
movlw 0xF0
xorwf PORTB,W
btfss STATUS,Z
goto PASO2
goto RETARDO

PASO2:
;Saca los valores de PORTB a tecla
movwf tecla

;Cambia entradas por salidas en PORTB
;Banco 2
bcf STATUS,RP1
bsf STATUS,RP0

;Mitad entradas(1) mitad salidas(0) al revez
movlw 0x0F
movwf TRISB

;Banco 0
bcf STATUS,RP0
bcf STATUS,RP1

;PORT B mitad en alto(entradas) y mitad el bajo(salidas)
movlw 0x0F
movwf PORTB

;Hace XOR con 0xF0 para ver que valor a cambiado nivle bajo
movlw 0x0F
xorwf PORTB,W

;Hace OR con tecla para tener en tecla los bits que se han presionado
iorwf tecla,F

movlw 0xFF
movwf PORTC 

movlw 0x03
movwf cont3_pausa
PAUSA
decfsz cont1_pausa
goto PAUSA
decfsz cont2_pausa
goto PAUSA
decfsz cont3_pausa
goto PAUSA

clrf cont1_pausa
clrf cont2_pausa


;Compara de uno en uno los posibles valores para tecla

;Tecla 16(MAS)
movlw 0x88
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 12(MENOS)
incf num_tecla,F
movlw 0x84
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 8(POR)
incf num_tecla,F
movlw 0x82
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 4(DIVIDIDO)
incf num_tecla,F
movlw 0x81
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 15(IGUAL)
incf num_tecla,F
movlw 0x48
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 11(numero 3)
incf num_tecla,F
movlw 0x44
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 7(numero 6)
incf num_tecla,F
movlw 0x42
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 3(numero9)
incf num_tecla,F
movlw 0x41
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 14(numero 0)
incf num_tecla,F
movlw 0x28
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 10(numero 2)
incf num_tecla,F
movlw 0x24
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 6(numero 5)
incf num_tecla,F
movlw 0x22
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 2(numero 8)
incf num_tecla,F
movlw 0x21
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 13(ON OFF)
incf num_tecla,F
movlw 0x18
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 9(numero1)
incf num_tecla,F
movlw 0x14
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 5(numero 4)
incf num_tecla,F
movlw 0x12
xorwf tecla,W
btfsc STATUS,Z
goto FIN_PREGUNTA

;Tecla 1(numero 7)
incf num_tecla,F
goto FIN_PREGUNTA


FIN_PREGUNTA:

;recorro los datos de la pantalla de displays

;recorro el display 5 al 6
movfw display5
movwf display6
;recorro el display 4 al 5
movfw display4
movwf display5
;recorro el display 3 al 4
movfw display3
movwf display4
;recorro el display 2 al 3
movfw display2
movwf display3
;recorro el display 1 al 2
movfw display1
movwf display2


;Cargamos en el display1 el valor segun nuestra tabla 

call TABLA_DIGITOS
movwf ayuda 
comf ayuda,W 
movwf display1
goto RETARDO


TABLA_POSICIONES
;Incremento la posicion de barrido de display de tecla al PCL
movf contador_barrido_display,W
addwf PCL,f

retlw 0x20  ;valor posicion 1
retlw 0x10  ;valor posicion 2
retlw 0x08  ;valor posicion 3
retlw 0x04  ;valor posicion 4
retlw 0x02  ;valor posicion 5
retlw 0x01  ;valor posicion 6
clrf contador_barrido_display
retlw 0x20



 TABLA_DIGITOS 
;Incrementa el numero de tecla al PCL
movf num_tecla,W
addwf PCL,f 

;Tabla con numeros segun la tecla
;Columna 4 de abajo hacia arriba
retlw 0xE   ; valor para mas
retlw 0x01   ; valor para menos
retlw 0x37   ; valor para por
retlw 0x49    ; valor para dividiendo
;Columna 3 de abajo hacia arriba
retlw 0x05   ; valor para igual
retlw 0x4F   ; 3 en código 7 segmentos
retlw 0x7D   ; 6 en código 7 segmentos 
retlw 0x6F    ; 9 en código 7 segmentos
;Columna 2 de abajo hacia arriba
retlw 0x3F   ; 0 en código 7 segmentos 
retlw 0x5B   ; 2 en código 7 segmentos
retlw 0x6D   ; 5 en código 7 segmentos
retlw 0x7F   ; 8 en código 7 segmentos
;Columna 1 de abajo hacia arriba
retlw 0x64   ; valor para on/off
retlw 0x06   ; 1 en código 7 segmentos 
retlw 0x66   ; 4 en código 7 segmentos 
retlw 0x07   ; 7 en código 7 segmentos


RETARDO
;retardo de 0.5 segundos aprox
decfsz cont1_pausa
goto RETARDO
; decfsz cont2_pausa
; goto RETARDO
; decfsz cont3_pausa
; goto RETARDO

clrf cont1_pausa
movlw 0x08
movwf cont2_pausa

movlw 0xFF
movwf PORTC 

clrf cont1_pausa
clrf cont2_pausa

;Banco 2
bcf STATUS,RP1
bsf STATUS,RP0

;Mitad entradas(1) mitad salidas(0)
movlw 0xF0
movwf TRISB

;Banco 0
bcf STATUS,RP0
bcf STATUS,RP1


;PORT B mitad en alto(entradas) y mitad el bajo(salidas)
movlw 0xF0
movwf PORTB

goto BARRIDO_DISPLAY


END