⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_teclado.asm

📁 how to control a LCD with keypad in a pic 16f84a
💻 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 + -