Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- RS EQU P3.5 ;SE CAMBIO
- RW EQU P3.6 ;SE CAMBIO
- E EQU P3.7 ;SE CAMBIO
- DBUS EQU P1
- CURSOR EQU 7FH
- COLUMN EQU 7EH
- BUFFER EQU 7DH
- SEND EQU P3.4
- TEMP EQU 7CH
- ORG 0000H
- JMP PRINCIPAL
- ORG 0003H
- JMP EX0ISR ;INT0 VECTOR ORG 0003H
- ORG 0013H
- JMP EX1ISR
- ORG 0023h
- JMP UART
- ORG 0040H
- PRINCIPAL:
- ACALL INIT ;inicializa LDC
- ACALL INITUART
- MOV 20H, #'0'
- MOV 21H, #'1'
- MOV 22H, #'2'
- MOV 23H, #'3'
- MOV 24H, #'4'
- MOV 25H, #'5'
- MOV 26H, #'6'
- MOV 27H, #'7'
- MOV 28H, #'8'
- MOV 29H, #'9'
- MOV 2AH, #'A'
- MOV 2BH, #'B'
- MOV 2CH, #'C'
- MOV 2DH, #'D'
- MOV 2EH, #'E'
- MOV 2FH, #'F'
- MOV TMOD, #20H ; (0010 0000) TIMER 1, MODE 2
- MOV TH1,#-3h ;9600 BAUD
- SETB TR1 ; START TIMER 1
- MOV SCON,#40H ;
- SETB PX0
- CLR PSW.5
- MOV IE, #10010101B ;INTERRUPCION GLOBAL , INTERRUPCION EXTERNA 0,1, INTERRUPCION PS
- SETB IT0 ;ACTIVA EL FLANCO DE BAJADA DE LA INTERRUPCION 0
- SETB IT1 ;ACTIVA EL FLANCO DE BAJADA DE LA INTERRUPCION 1
- MOV P2, #11110000B;INICIALIZA LOS RENGLONES EN 0 Y LAS COLUMANAS EN 1
- MOV CURSOR, #00H ;SE LIMPIA EL CONTEO DE LCD
- LOOP: JB SEND, LOOP
- ACALL DELAY_10MS ;SE MANDA A LLAMAR A UNA SUBRUTINA QUE ESPERE 10MS
- MOV TEMP, #00H
- SETB TI
- JNB SEND, $
- ACALL DELAY_10MS ;SE MANDA A LLAMAR A UNA SUBRUTINA QUE ESPERE 10MS
- JMP LOOP
- INITUART:
- MOV R5,#32D
- MOV R0,#30H
- LOOPUART: MOV @R0,#00H
- INC R0
- DJNZ R5,LOOPUART
- RET
- UART:
- CLR TI
- MOV A,TEMP
- CJNE A, CURSOR,NEXT
- RETI
- NEXT: ADD A,#30H
- MOV R0,A
- MOV SBUF, @R0
- INC TEMP
- RETI
- EX1ISR:
- CLR EX1
- SETB PSW.5
- MOV BUFFER, #00H
- ACALL DELAY_10MS
- JNB P3.3 , $
- ACALL DELAY_10MS
- MOV A, BUFFER
- ACALL SAVE
- ACALL CURSOR_POS
- ACALL PRESENTA
- CLR PSW.5
- SETB EX1
- RETI
- DELAY_10MS:
- MOV R5, #20D ; SE VUELVE A CAREGAR EL REGISTRO R5 QUE SE OCUPA PARA EL DELAY
- DELAY_10MS_2: MOV R6, #250D
- DJNZ R6, $
- DJNZ R5, DELAY_10MS_2
- RET
- CURSOR_POS:
- MOV TEMP, A
- INC CURSOR
- MOV R0,CURSOR
- CJNE R0,#17D,CURSOR_POS_1
- MOV A, #0C0H ;cursor: linea 2, pos. 1
- CLR RS ;prepara comando de salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que LCD este libre
- MOV A, TEMP
- RET
- CURSOR_POS_1:
- CJNE R0,#33D,CURSOR_POS_2
- MOV CURSOR,#00H
- MOV A, #01H ;limpia LCD
- CLR RS ;perpara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ; espera a que el LCD este libre
- MOV A, #80H ;cursor: linea 1, pos. 1
- CLR RS ;prepara comando de salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que LCD este libre
- ACALL INITUART
- MOV A, TEMP
- RET
- CURSOR_POS_2:
- RET
- EX0ISR:
- CLR EX0 ; SE DESABILITA LA INTERRUPCION EXTERNA
- ACALL DELAY_10MS ;SE MANDA A LLAMAR A UNA SUBRUTINA QUE ESPERE 10MS
- ACALL READ_KEYPAD ;SE LLAMA A ALA SUBRUTINA PARA ENCOTRAR QUE TELCA SE PRESIONO
- ACALL DELAY_10MS
- WAIT_BUTTON: MOV A, #11110000b ;Initial state for Keypad
- MOV P2, A ;Initial state for keypad t capture INT0, needs a 4 input AND gate
- MOV A, P2
- CJNE A, #11110000b, WAIT_BUTTON ;wait till button matrix is released
- SETB EX0 ;Enable interrupt INT0
- RETI
- READ_KEYPAD: ;SUBRUTINA PARA ALGO
- MOV COLUMN, #00H
- MOV A, #11111110b ;SE BARREN LAS FILAS
- SCAN_ROW: MOV P2, A
- JNB P2.7, FOUND_KEY1 ;CHECA SI SE PRESIONO LA COLUMNA 1
- JNB P2.6, FOUND_KEY2 ;CHECA SI SE PRESIONO LA COLUMNA 2
- JNB P2.5, FOUND_KEY3 ;CHECA SI SE PRESIONO LA COLUMNA 3
- JNB P2.4, FOUND_KEY4 ;CHECA SI SE PRESIONO LA COLUMNA 4
- RL A ;NO SE ENCONTRO LA LLAVE POR LO QUE SE BARRE TODO, EJEMPLO: 1111 1110 -> 1111 1101
- INC COLUMN ;SE INCREMETA EL CONTEO DE LA LLAVE QUE CREO QUE SON LAS COLUMNAS
- MOV R0, COLUMN ;SE CARGA EL VALOR DEL CONTEO AL REGISTRO 0
- CJNE R0, #4D, SCAN_ROW ; SI EL REGISTRO DOS ES IGUAL A 0 ENTONCES NO SE ENCONTRO NADA POR LO QUE SE MANDA UN ERROR
- RET
- FOUND_KEY1: ;LA COLUMNA 0 FUE PRECIONADA
- MOV A, COLUMN ; SE MONTA LA COLUMNA EN LA QUE ESTAS
- RL A
- RL A ;SE MULTIPLIA POR 4
- ADD A,#00H ;SE LE AÑADE 1 POR ESTAR EN LA FILA 1
- JB PSW.5, BUFFERIN
- ADD A ,#20H
- MOV R1 ,A
- MOV A, @R1
- ACALL SAVE
- ACALL CURSOR_POS
- ACALL PRESENTA
- RET
- FOUND_KEY2:
- MOV A, COLUMN
- RL A
- RL A
- ADD A,#01H
- JB PSW.5, BUFFERIN
- ADD A ,#20H
- MOV R1 ,A
- MOV A, @R1
- ACALL SAVE
- ACALL CURSOR_POS
- ACALL PRESENTA
- RET
- FOUND_KEY3:
- MOV A, COLUMN
- RL A
- RL A
- ADD A,#02H
- JB PSW.5, BUFFERIN
- ADD A ,#20H
- MOV R1 ,A
- MOV A, @R1
- ACALL SAVE
- ACALL CURSOR_POS
- ACALL PRESENTA
- RET
- FOUND_KEY4:
- MOV A, COLUMN
- RL A
- RL A
- ADD A,#03H
- JB PSW.5, BUFFERIN
- ADD A ,#20H
- MOV R1 ,A
- MOV A, @R1
- JB PSW.5, BUFFERIN
- ACALL SAVE
- ACALL CURSOR_POS
- ACALL PRESENTA
- RET
- SAVE:
- MOV TEMP,A
- MOV A, CURSOR
- ADD A, #30H
- MOV R0,A
- MOV @R0,TEMP
- MOV A,TEMP
- RET
- BUFFERIN:
- MOV R7, A
- MOV A, BUFFER
- MOV B , #10D
- MUL AB
- ADD A, R7
- MOV BUFFER, A
- RET
- ;******************************
- ;inicialización de la LCD *
- ;******************************
- INIT:
- MOV R2, #32D;
- ESPARA15MS: MOV R3, #250D;
- DJNZ R3, $
- DJNZ R2, ESPARA15MS
- MOV A, #38H ;2 lineas, matriz ;de 5 x 7
- CLR RS ;prepara comando para salida
- ACALL SALIDA ;envíalo
- MOV R2, #10D
- ESPERA4_1MS: MOV R3, #250D;
- DJNZ R3, $
- DJNZ R2, ESPERA4_1MS
- MOV A, #38H ;LCD encendida, cursor encendido
- CLR RS ;prepara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA
- MOV A, #38H ;LCD encendida, cursor encendido
- CLR RS ;prepara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA
- MOV A, #0EH ;LCD encendida, cursor encendido
- CLR RS ;prepara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que la LCD este libre
- MOV A, #01H ;limpia LCD
- CLR RS ;perpara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ; espera a que el LCD este libre
- MOV A, #03H ;MODO DEL CURSOR
- CLR RS ;perpara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA
- MOV A, #02H ;poscicion inicial DE LA RAM
- CLR RS ;perpara comando para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que el LCD este libre
- MOV A, #80H ;cursor: linea 1, pos. 1
- CLR RS ;prepara comando de salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que LCD este libre
- RET
- ;******************************
- ; Presenta datos en LCD *
- ;******************************
- PRESENTA:
- SETB RS ;prepara dato para salida
- ACALL SALIDA ;envíalo
- ACALL ESPERA ;espera a que la LCD este libre
- RET
- ;*****************************
- ; Espera q que LCD este libre *
- ;*****************************
- ESPERA:
- MOV R2, #255D
- DJNZ R2, $
- RET
- ;*****************************
- ;Salida a LCD *
- ;*****************************
- SALIDA: MOV DBUS, A
- CLR RW
- SETB E
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR E
- RET
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement