📄 lcd_teclado.asm
字号:
list p= 16f84A
include "p16f84A.inc"
frase_1 equ 0x0C
frase_2 equ 0x0D
PDel0 equ 0x0E
PDel1 equ 0x0F
frase_3 equ 0x10
tecla equ 0x11
org 0x00
RESET
goto conf
org 0x05
mensaje_1:
addwf PCL,f
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw '"'
retlw 'M'
retlw 'A'
retlw 'N'
retlw 'E'
retlw 'J'
retlw 'O'
retlw '"'
mensaje_2:
addwf PCL,f
retlw ' '
retlw '"'
retlw 'L'
retlw 'C'
retlw 'D'
retlw ' '
retlw 'Y'
retlw ' '
retlw 'T'
retlw 'E'
retlw 'C'
retlw 'L'
retlw 'A'
retlw 'D'
retlw 'O'
retlw '"'
mensaje_3:
addwf PCL,f
retlw 'T'
retlw 'E'
retlw 'C'
retlw 'L'
retlw 'A'
retlw ' '
retlw 'O'
retlw 'P'
retlw 'R'
retlw 'I'
retlw 'M'
retlw 'I'
retlw 'D'
retlw 'A'
retlw ' '
retlw ':'
digito:
addwf PCL,f
retlw '0'
retlw '1'
retlw '2'
retlw '3'
retlw '4'
retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'
retlw 'A'
retlw 'B'
retlw 'C'
retlw 'D'
retlw 'E'
retlw 'F'
conf:
bsf STATUS,RP0 ;Banco 1
clrf TRISB ;Configurar Puerto B como salidas del dato/comando
clrf TRISA ;Confugurar Puerto A como salidas de bits de control del lcd
bcf STATUS, RP0 ;Banco 0
clrf PORTB ;Poner a cero el valor de salida del Puerto B
clrf PORTA ;Poner a cero el valor de salida del Puerto A
call pausa_500 ;R/S---->PIN_A0
;R/W---->PIN_A1
;E ---->PIN_A2
;D0..D7->PORTB[0..7]
call LCD_INICIO ;Inicializacion del LCD
clrf frase_1
clrf frase_2
clrf frase_3
clrf tecla
inicio:
movf frase_1,w
call mensaje_1
call LCD_ESCRITURA
incf frase_1,f
movlw .12
subwf frase_1,w
btfss STATUS,Z
goto inicio
clrf frase_1
call LCD_LINEA2A
msj_2:
movf frase_2,w
call mensaje_2
call LCD_ESCRITURA
incf frase_2,f
movlw .16
subwf frase_2,w
btfss STATUS,Z
goto msj_2
clrf frase_2
call LCD_HOME
call pausa_500
call pausa_500
call LCD_CLEAR
; goto ini_teclado
msj_3:
movf frase_3,w
call mensaje_3
call LCD_ESCRITURA
incf frase_3,f
movlw .16
subwf frase_3,w
btfss STATUS,Z
goto msj_3
clrf frase_3
ini_teclado:
clrf PORTB
call config_teclado
escaneo:
clrf tecla
movlw b'00001110'
movwf PORTB ;Comienzo de escaneo primera columna
btfss PORTB,4 ;Fue la tecla_1?
goto tecla_p ;si fue
incf tecla,f ;Incrementas contador
btfss PORTB,5 ;Fue la tecla_2?
goto tecla_p ;si fue
incf tecla,f
btfss PORTB,6 ;Fue la tecla_3?
goto tecla_p
incf tecla,f
btfss PORTB,7 ;Fue la tecla_4?
goto tecla_p
incf tecla,f
movlw b'00001101' ;Habilito la segunda columna
movwf PORTB
btfss PORTB,4 ;Fue la tecla_5?
goto tecla_p ;si fue
incf tecla,f ;Incrementas contador
btfss PORTB,5 ;Fue la tecla_6?
goto tecla_p ;si fue
incf tecla,f
btfss PORTB,6 ;Fue la tecla_7?
goto tecla_p
incf tecla,f
btfss PORTB,7 ;Fue la tecla_8?
goto tecla_p
incf tecla,f
movlw b'00001011' ;Habilito la tercera columna
movwf PORTB
btfss PORTB,4 ;Fue la tecla_9?
goto tecla_p ;si fue
incf tecla,f ;Incrementas contador
btfss PORTB,5 ;Fue la tecla_10?
goto tecla_p ;si fue
incf tecla,f
btfss PORTB,6 ;Fue la tecla_11?
goto tecla_p
incf tecla,f
btfss PORTB,7 ;Fue la tecla_12?
goto tecla_p
incf tecla,f
movlw b'00000111' ;Habilito la cuarta columna
movwf PORTB
btfss PORTB,4 ;Fue la tecla_13?
goto tecla_p ;si fue
incf tecla,f ;Incrementas contador
btfss PORTB,5 ;Fue la tecla_14?
goto tecla_p ;si fue
incf tecla,f
btfss PORTB,6 ;Fue la tecla_15?
goto tecla_p
incf tecla,f
btfss PORTB,7 ;Fue la tecla_16?
goto tecla_p
goto escaneo ;no se apreto ninguna tecla
tecla_p:
call pausa_20
call sin_oprimir
call pausa_20
call config_lcd
clrf PORTB
call LCD_LINEA2
movf tecla,w
call digito
call LCD_ESCRITURA
call config_teclado
goto ini_teclado
sin_oprimir:
movf PORTB,w
andlw 0xF0
sublw 0xF0
btfss STATUS,Z
goto sin_oprimir
return
config_lcd:
bsf STATUS,RP0 ;Banco 1
clrf TRISB ;Configurar Puerto B como salidas del dato/comando
bcf STATUS, RP0 ;Banco 0
return
config_teclado:
bsf STATUS,RP0 ;Banco_1
movlw b'11110000' ;POTRB[3..0]--->salidas PORTB[4..7]-->entradas
movwf TRISB
clrf OPTION_REG ;Habilito resistencias de pull-up
bcf STATUS,RP0 ;Banco_0
return
LCD_LINEA2:
call LCD_COMANDO
movlw 0xCF
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
return
LCD_LINEA2A:
call LCD_COMANDO
movlw 0xC0
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
return
LCD_HOME:
call LCD_COMANDO
movlw 0x02
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
return
LCD_CLEAR:
call LCD_COMANDO
movlw b'00000001' ;codigo para clear_display
movwf PORTB ;se pone en el puerto la se馻l de clear_display
call LCD_HAB ;Habilitar el LCD
call LCD_OCUPADO ;sigue ocupado el LCD
return
LCD_ESCRITURA:
call LCD_DATO
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
return
LCD_INICIO:
call LCD_CLEAR
movlw b'00111000' ;codigo del function set
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
movlw b'00001100' ;codigo display on/off control
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
movlw b'00000110' ;codigo entry mode set
movwf PORTB
call LCD_HAB
call LCD_OCUPADO
return
LCD_HAB:
bsf PORTA,2 ;pulso para habilitar el LCD
nop
nop ;duracion de 2 uS
bcf PORTA,2 ;deshabilita el LCD
return
LCD_OCUPADO:
; bsf PORTA,1 ;Poner LCD Modo Lectura
; bsf STATUS,RP0 ;Banco 1
; movlw 0xFF
; movwf TRISB
; bcf STATUS,RP0 ;Banco 0
; bsf PORTA,2 ;Habilitar LCD
; nop
;busy:
; btfsc PORTB,7 ;Preguntar si la LCD sigue ocupada
; goto busy
; bcf PORTA,2 ;Deshabilitar LCD
; bsf STATUS,RP0 ;Banco 1
; clrf TRISB
; bcf STATUS,RP0 ;Banco 0
; bcf PORTA,1 ;Poner LCD modo escritura
call pausa_20
call pausa_20
return
LCD_COMANDO:
bcf PORTA,0 ;R/S modo comando
bcf PORTA,1 ;R/W modo escritura
return
LCD_DATO:
bsf PORTA,0 ;R/S modo dato
bcf PORTA,1 ;R/W modo escritura
return
pausa_500:
PDelay:
movlw .239 ; 1 set number of repetitions (B)
movwf PDel0 ; 1
PLoop1:
movlw .232 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2:
clrwdt ; 1 clear watchdog
PDelL1:
goto PDelL2 ; 2 cycles delay
PDelL2:
goto PDelL3 ; 2 cycles delay
PDelL3:
clrwdt ; 1 cycle delay
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
PDelL4:
goto PDelL5 ; 2 cycles delay
PDelL5:
goto PDelL6 ; 2 cycles delay
PDelL6:
goto PDelL7 ; 2 cycles delay
PDelL7:
clrwdt ; 1 cycle delay
return ; 2+2 Done
pausa_20:
PDelay1:
movlw .21 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop11:
movlw .237 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop21:
clrwdt ; 1 clear watchdog
decfsz PDel1,1 ; 1 + (1) is the time over? (A)
goto PLoop21 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop11 ; 2 no, loop
PDelL11:
goto PDelL21 ; 2 cycles delay
PDelL21:
clrwdt ; 1 cycle delay
return ; 2+2 Done
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -