Está en la página 1de 11

Reporte de práctica – Calculadora con

teclado matricial y pantalla Lcd.


PIEDRA MARTINEZ JESUS SEBASTIAN 1603099@itcelaya.edu.mx
JIMENEZ AGUIRRE MAGDA ALEJANDRA 16030665@itcelaya.edu.mx
PIEDRA MANDUJANO RICARDO 16030846@itcelaya.edu.mx
Resumen— ; __config 0xFFFF
el objetivo de esta práctica se realizó una calculadora __CONFIG _CONFIG2,
con su respetivo teclado matricial y su pantalla Lcd _BOR4V_BOR40V
con el software de programación de ensamblador & _WRT_OFF
donde pueda ejecutar operaciones básicas, tales
como: suma, resta, multiplicación y división.
De manera siguiente se utilizaron los
comandos de org, goto, bcf, clrf, movf, movwf,
INTRODUCCIÓN andlw para poder representar nuestros valores de
salida en nuestro display.
El objetivo es realizar un diagrama donde se
pueda realizar operaciones básicas por medio De manera que una vez que se comprobó y que
de un teclado matricial. al momento de verificar los posibles errores que
• Los resultados mostrar las operaciones arrojara el problema se pasó a la parte de la
realizadas en una pantalla lcd simulación.
• La metodología a seguir será la elaboración
del programa en MPLAB, una vez echo se
pasará a cargar al pic de proteos de manera A. Simulación
que si todo sale correcto se pasará a armarlo En la figura 1 se muestra el diagrama de
de manera física una vez realizado se conexión de la calcadora por medio de un
comprobará con la simulación los resultados. teclado matricial y donde se mostrará los
resultados n una pantalla LCD.
Lista de material:
MICROCONTROLADOR PIC16F887
Teclado Matricial
Pantalla LCD
Fuentes de voltaje
Resistencias (330 ohms)

DESARROLLO

Como lo primero que se realizo fue el programa se


obtuvo que realizar la configuración de nuestro pic
con lo que el profesor nos lo proporciono de manera Fig. 1 – Diagrama de Calculadora.
que quedo lo siguiente.
; CONFIG1
B. Resultados experimentales
; __config 0xE0D4
__CONFIG _CONFIG1,
_FOSC_INTRC_NOCLKOUT & _WDTE_OFF & Al momento de construir la calculadora en físico se
_PWRTE_OFF & _MCLRE_OFF & _CP_OFF & tuvo problemas con la conexión del teclado
_CPD_OFF & _BOREN_OFF & _IESO_OFF matricial, ya que, este no realizaba los valores que
& _FCMEN_OFF & _LVP_OFF estaba pospuesto en el programa al hacer algunas
; CONFIG2 modificaciones en el programa estos valores ya
fueron correctos, pero había problemas en la
pantalla Lcd ya que no hacía de manera correcta las
operaciones aritméticas. Tras un intenso análisis en Anexos:
el programa se encontró el error y agregaron nuevas
líneas de códigos para mejorar el funcionamiento
de esta, aunque se siguió desbordando y no se pudo
corregir este error.
LIST p=16F887

#include <p16f887.inc>

#include <Define.inc>

#include <LCD4bits.inc>

#include <Delaylibrary.inc>

#include <Keypad.inc>

__CONFIG _CONFIG1,
_FOSC_INTRC_NOCLKOUT & _WDTE_OFF &
_PWRTE_OFF & _MCLRE_ON & _CP_OFF &
_CPD_OFF & _BOREN_OFF & _IESO_OFF &
_FCMEN_OFF & _LVP_OFF

__CONFIG _CONFIG2,
_BOR4V_BOR40V & _WRT_OFF
Fig. 2 – Calculadora funcionando en forma de suma.

DISCUSIÓN CBLOCK H'20'

El propósito de esta práctica fue realizar una


calculadora que funcionara mediante un teclado
matricial, para esto se realizó la configuración del
teclado para que se pudiera interpretar los bits de
entrada, se pudo realizar las operaciones requeridas ;w_temp
ya sea suma, resta multiplicación y división.
;status_temp
CONCLUSIONES bandera
Al realizar la práctica tuvimos varios problemas
los resultados obtenidos ya que la calculadora se ENDC
desbordaba, se aprendió a realizar una
configuración para el teclado matricial, además
relacionar los valores para la interpretación de estos
a números decimales y estos aparecieran en la ;constant1 equ D'1'
pantalla de LCD.
cont1 equ H'71'
cont2 equ H'72' ; swapf w_temp,w ;Restore W

cont3 equ H'73' ; retfie

cont4 equ H'74'

respaldo equ H'75'

respaldo2 equ H'76'

op equ H'77'

varC equ H'78'

varD equ H'79' conf

diez equ H'7A' banksel OSCCON


;Bank1
valor equ H'7B'

resul equ H'7C'


movlw b'01110101' ;Internal
varA equ H'7D'
Clock Configuration
varB equ H'7F'
1 = Internal
oscillator is used for system clock 0=
Clock source defined by FOSC<2:0> of the
ORG H'0' CONFIG1 register
goto conf movwf OSCCON
;8Mhz Internal oscillator clock

; ORG H'4' ;movlw b'00000000' ;Calibrate


internal clock
; movwf w_temp ;Save
W

; movf STATUS,W ;movwf OSCTUNE

; movwf status_temp ;Save STATUS


movlw b'00001111'

;endInterrupt movwf TRISB ;PORTB as


input(nibbleL) and output (nibbleH)
; movf status_temp,w
movlw b'11111000'
; movwf STATUS ;Restore
STATUS movwf TRISA ;A0, A1 and
A2 as output
; swapf w_temp,f
movlw b'00000000'
movwf TRISC call LCD_DisplayOnCursorOnBlinkOn

clrf TRISD movlw '1'

call LCD_SendCharacter

bcf OPTION_REG,7 movlw '0'

movlw b'11111111' call LCD_SendCharacter

movwf WPUB ;Pull up movlw '2'


resistor enabled
call LCD_SendCharacter

movlw '/'
banksel ANSEL
call LCD_SendCharacter
clrf ANSEL
movlw '0'
clrf ANSELH ;input as
call LCD_SendCharacter
digital

movlw D'1'

call LCD_PositionLine2
banksel PORTA ;Bank0

movlw 'I'
clrf PORTD
call LCD_SendCharacter

movlw 'N'

call LCD_SendCharacter
clrf PORTB
movlw 'F'

call LCD_SendCharacter
clrf bandera

call LCD_Inicialization
movlw d'10'

movwf diez

main

call Keypad_Check
;goto izquierda

btfsc Keypad_KeyCounter,4 ;goto derecha

goto main ;goto borrar

movf Keypad_KeyCounter,w

call KeyCharacter num0 clrw

btfss bandera,0 num00 addwf varA,w

call LCD_SendCharacter decfsz diez

bcf bandera,0 goto num00

goto main movwf varA

movlw d'10'

KeyCharacter movwf diez

addwf PCL,f retlw '0'

goto num7; '7' num1 clrw

goto num4; '4' num11 addwf varA,w

goto num1;'1' decfsz diez

goto borrar goto num11

goto num8; '8' addlw d'1'

goto num5; '5' movwf varA

goto num2;retlw '2' movlw d'10'

goto num0; '0' movwf diez

goto num9;retlw '9' retlw '1'

goto num6;retlw '6' num2 clrw

goto num3;retlw '3' num22 addwf varA,w

goto igual;retlw '=' decfsz diez

goto entre;retlw '/' goto num22

goto por;retlw '*' addlw d'2'

goto menos;retlw '-' movwf varA

goto mas;retlw '+' movlw d'10'


movwf diez num6 clrw

retlw '2' num66 addwf varA,w

num3 clrw decfsz diez

num33 addwf varA,w goto num66

decfsz diez addlw d'6'

goto num33 movwf varA

addlw d'3' movlw d'10'

movwf varA movwf diez

movlw d'10' retlw '6'

movwf diez num7 clrw

retlw '3' num77 addwf varA,w

num4 clrw decfsz diez

num44 addwf varA,w goto num77

decfsz diez addlw d'7'

goto num44 movwf varA

addlw d'4' movlw d'10'

movwf varA movwf diez

movlw d'10' retlw '7'

movwf diez num8 clrw

retlw '4' num88 addwf varA,w

num5 clrw decfsz diez

num55 addwf varA,w goto num88

decfsz diez addlw d'8'

goto num55 movwf varA

addlw d'5' movlw d'10'

movwf varA movwf diez

movlw d'10' retlw '8'

movwf diez num9 clrw

retlw '5' num99 addwf varA,w


decfsz diez entre movf varA,w

goto num99 movwf varB

addlw d'9' clrf varA

movwf varA movlw d'8'

movlw d'10' movwf op

movwf diez movlw '/'

retlw '9' return

igual btfsc op,0

mas movf varA,w goto suma

movwf varB btfsc op,1

clrf varA goto resta

movlw d'1' btfsc op,2

movwf op goto multi

movlw '+' goto divi

return

menos movf varA,w suma movlw '='

movwf varB btfss bandera,0

clrf varA call LCD_SendCharacter

movlw d'2' bcf bandera,0

movwf op movf varB,w

movlw '-' addwf varA,w

return movwf resul

por movf varA,w goto resultados

movwf varB

clrf varA resta movlw '='

movlw d'4' btfss bandera,0

movwf op call LCD_SendCharacter

movlw '*' bcf bandera,0

return movf varA,w


subwf varB,w goto resdiv

movwf resul contdi incf cont3,1

movf resul,1 goto diviop

btfsc STATUS,C resdiv movf cont3,w

goto resultados movwf resul

goto negativo goto resultados

multi movlw '=' rescero movlw D'0'

btfss bandera,0 call LCD_PositionLine2

call LCD_SendCharacter movlw 'N'

bcf bandera,0 call LCD_SendCharacter

clrw ;movlw ' ' ;space

patras addwf varA,w ;call LCD_SendCharacter

decfsz varB movlw 'o'

goto patras call LCD_SendCharacter

movwf resul movlw 'S'

goto resultados call LCD_SendCharacter

divi movlw '=' movlw 'e'

btfss bandera,0 call LCD_SendCharacter

call LCD_SendCharacter ;movlw b'00100111' ;'

bcf bandera,0 ;call LCD_SendCharacter

clrw movlw 'P'

clrf cont3 call LCD_SendCharacter

movf varA,f movlw 'u'

btfsc STATUS,Z call LCD_SendCharacter

goto rescero movlw 'e'

diviop movf varA,w call LCD_SendCharacter

subwf varB,1 movlw 'd'

btfsc STATUS,C call LCD_SendCharacter

goto contdi movlw 'e'


call LCD_SendCharacter movf cont2,f

movlw ':' btfss STATUS,z

call LCD_SendCharacter goto result2

movlw 'c' checar2 movf respaldo2,f

return btfss STATUS,Z

goto dos101

resultados clrw goto resultado

movf resul,w contador incf cont1,1

btfsc STATUS,Z goto cien

goto zeros contador2 incf cont2,1

cien movf resul,w goto diez10

movwf respaldo uno movf respaldo2,w

movlw d'100' iorlw b'00110000'

subwf resul,1 return

btfsc STATUS, dos101 movf cont1,f

goto contador btfsc STATUS,Z

movf cont1,1 goto uno

btfsc STATUS,Z movf cont1,w

goto diez10 iorlw b'00110000'

checar movf respaldo,f call LCD_SendCharacter

btfsc STATUS,Z movlw b'00110000'

goto show call LCD_SendCharacter

diez10 movf respaldo,w movf respaldo2,w

movwf respaldo2 iorlw b'00110000'

movf contador,f return

movlw d'10' resultado movf cont1,1

subwf respaldo,1 btfss STATUS,Z

btfsc STATUS,C ;goto tres

goto contador2 movf cont2,w


iorlw b'00110000' call LCD_SendCharacter

btfss bandera,0 movlw b'00110000'

call LCD_SendCharacter return

bcf bandera,0 zeros retlw '0'

movf respaldo2,w negativo comf resul,1

iorlw b'00110000' movlw d'1'

return addwf resul,1

result2 movf cont1,f movlw b'00101101'

btfsc STATUS,Z call LCD_SendCharacter

goto resultado2 goto resultados

movf cont1,w

iorlw b'00110000'

call LCD_SendCharacter

movf cont2,w borrar

iorlw b'00110000' clrf cont1

call LCD_SendCharacter clrf cont2

movf respaldo2,w clrf cont3

iorlw b'00110000' clrf cont4

return clrf respaldo

resultado2 movf cont2,w clrf respaldo2

iorlw b'00110000' clrf op

call LCD_SendCharacter clrf varC

movf respaldo2,w clrf varD

iorlw b'00110000' clrf valor

return clrf resul

show movf cont1,w clrf varA

iorlw b'00110000' clrf varB

call LCD_SendCharacter call LCD_ClearDisplay

movlw b'00110000' bsf bandera,0


return

izquierda

call LCD_DisplayShiftLeft

bsf bandera,0

return

derecha

call LCD_DisplayShiftRight

bsf bandera,0

return

end

También podría gustarte