??? 04/07/12 15:57 Read: times |
#187049 - [project]Calculator 4x4 keypad + 2x16LCD - Result |
Hi.
I am making a ASM code for calculator and i was trying for few days convert 2 digits from ascii to hex then add them and convert back to ascii but i cant get right result. Simply i mean if i type 2+3=, for example i was trying many ways. I checked did i not use same register or memory location twice but i can't find miss take. I checked are converters working when i put in Accumulator decimal value it was converted right and displayed. I am making assembling code in ASM51 and simulating in ISIS Pro. There is my question could somebody look the code and point me where the error is or tell me i am going right way. $Mod52 START: EN EQU P3.7 RS EQU P3.5 RW EQU P3.6 DAT EQU P2 TEMP0 EQU 60H TEMP1 EQU 61H INPUTNUM EQU 31H INPUTKEY EQU 32H INPUTNUMTWO EQU 33H FLAG EQU R7 ORG 00H MOV R3,#00H MOV R4,#00H MOV 35H,#00H cent equ R7 decc equ R6 unit equ R5 LCALL INIT_LCD ;MOV A,#'0' ;LCALL WRITE_TEXT MOV A,#00H ;MOV R1,#40H ;MOV R0,#45H ;MOV R5,#50H keyup: LCALL Keyboard CJNE A,#0FFH,keyup readkey: LCALL Keyboard CJNE A,#0FFH,keypressed SJMP readkey keypressed: LCALL GetKeyNum MOV 40h,A ;INC R1 CJNE A,#'C', ON CLEAR: LCALL CLEAR_LCD LJMP START ON: ;INC R3 CJNE R3,#02H,SNUM LJMP SIG SNUM: INC R3 CJNE A,#'+',PLUS LJMP SIG PLUS: CJNE A,#'-',MINUS LJMP SIG MINUS: CJNE A,#'x',MULTIPLY LJMP SIG MULTIPLY: CJNE A,#'/',SUBSTRACT LJMP SIG SUBSTRACT: ;MOV INPUTNUM,A LCALL WRITE_TEXT LJMP KEYUP SIG: LCALL Keyboard CJNE A,#0FFH,SIGN SJMP SIG SIGN: MOV INPUTKEY,A LCALL GetKeyNum CJNE A,#'C',SIGNN SJMP CLEAR SIGNN: CJNE A,#'+',NOTADD LCALL WRITE_TEXT MOV FLAG,#01H LCALL SECNUM NOTADD: CJNE A,#'-',NOTMIN LCALL WRITE_TEXT MOV FLAG,#02H ;LCALL MINUS NOTMIN: SJMP SIG SECNUM: LCALL Keyboard CJNE A,#0FFH,SECNUM SECNUMM: LCALL Keyboard CJNE A,#0FFH,SECNUMMM SJMP SECNUMM SECNUMMM: LCALL GetKeyNum MOV 41h, A ;INC R0 INC R4 CJNE A,#'C',SECNUMMMM SJMP CLEAR SECNUMMMM: CJNE A,#'=',ONEDIGI SJMP EQUALLLL ONEDIGI: LCALL WRITE_TEXT CJNE A,#'C',NEXT SJMP CLEAR NEXT: CJNE R4,#02H,SECNUM ;SJMP EQUAL EQUAL: LCALL Keyboard CJNE A,#0FFH,EQUAL EQUALL: LCALL Keyboard CJNE A,#0FFH,EQUALLL SJMP EQUALL EQUALLL: LCALL GetKeyNum ;MOV INPUTNUMTWO, A CJNE A,#'=',EQUAL EQUALLLL: LCALL WRITE_TEXT LCALL ADITION mov a, r5 add a,#'0' ;LCALL BIN_DEC ;lcall hextoascii ;mov a, unit lcall write_text FINISH: LCALL Keyboard CJNE A,#0FFH,FINISH FINCLR: LCALL Keyboard CJNE A,#0FFH,CLRFIN SJMP FINCLR CLRFIN: LCALL GetKeyNum CJNE A,#'C',FINISH LJMP CLEAR ;subrutinesss ADITION: ;CLR A ;CJNE FLAG,#01H,SUBSTRACTION MOV A,40h LCALL KEYTODEC MOV 40h,A MOV A,41h LCALL KEYTODEC ADD A,40h ;LCALL BIN_DEC LCALL hextoascii ;MOV 38H,A RET hextoascii: mov r7,#30h mov r6,#30h mov r5,#30h cjne a,#00h,c1_hextobcd ;//check if number is 0 if not then continue ret c1_hextobcd: MOV A,38h clr c mov b,#100 ;//divide by 100 div ab orl a,r7 ;LCALL WRITE_TEXT mov r7,a ;//save 100th place in R0 clr c mov a,b mov b,#10 ;//Divide by 10 div ab orl a,r6 ;LCALL WRITE_TEXT mov r6,a ;//Save 10th place in R1 mov a,b orl a,r5 ;LCALL WRITE_TEXT mov r5,a ;//Save units place in R2 ret BIN_DEC: MOV A,#025D mov b,#100 div ab add a,#'0' mov cent,a mov a,b mov b,#10 div ab add a,#'0' mov decc,a mov a,b add a,#'0' mov unit,a ret INIT_LCD: CLR RS MOV DAT,#38h SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#0Eh SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#06h SETB EN CLR EN LCALL WAIT_LCD RET WAIT_LCD: MOV DAT, #0FFh CLR EN CLR RS SETB RW SETB EN NOP MOV A, DAT CLR EN CLR RW JB ACC.7, WAIT_LCD RET CLEAR_LCD: CLR RW CLR RS MOV DAT,#01h SETB EN CLR EN LCALL WAIT_LCD RET WRITE_TEXT: SETB RS MOV DAT,A SETB EN CLR EN LCALL WAIT_LCD RET Keyboard: MOV P1,#0F0H LCALL ShortDelay MOV A,P1 CJNE A,#0F0H,scanrows MOV A,#0FFH SJMP ret_keyboard scanrows: MOV R0,#4 MOV R1,#11101111B; p2.4 is first row so we should start [scan] from first. nextrow: MOV A,R1 RR A MOV R1,A MOV P1,A LCALL ShortDelay MOV A,P1 ANL A,#0F0H CJNE A,#0F0H,findcol DJNZ R0,nextrow MOV A,#0FFH SJMP ret_keyboard findcol: MOV R2,#0 nextcol: CLR C RLC A JNC calculate INC R2 SJMP nextcol calculate: CLR C MOV A,#4 SUBB A,R0 MOV B,#4 MUL AB ADD A,R2 ; r=4(row)+(col) ret_keyboard: RET GetKeyNum: MOV DPTR,#key MOVC A,@A+DPTR RET key: DB '7','4','1','C','8','5','2','0','9','6','3','=','/','x','-','+' KEYTODEC: ;mov a, 40h CJNE A,#'0',ONE MOV A,#0d RET ONE: CJNE A,#'1',TWO MOV A,#01d RET TWO: CJNE A,#'2',THR MOV A,#2d RET THR: CJNE A,#'3',FOR MOV A,#3d RET FOR: CJNE A,#'4',FIV MOV A,#4d RET FIV: CJNE A,#'5',SIX MOV A,#5d RET SIX: CJNE A,#'6',SEV MOV A,#6d RET SEV: CJNE A,#'7',EIG MOV A,#7d RET EIG: CJNE A,#'8',NIN MOV A,#8d RET NIN: CJNE A,#'9',NONE MOV A,#9d RET NONE: RET ShortDelay: MOV TEMP0,#20 shortloop: MOV TEMP1,#20 DJNZ TEMP1,$ DJNZ TEMP0,shortloop RET ENDD: LCALL CLEAR_LCD END Thanks. Lukasz Stanowski |
Topic | Author | Date |
[project]Calculator 4x4 keypad + 2x16LCD - Result | 01/01/70 00:00 | |
wrong approach | 01/01/70 00:00 | |
LCD | 01/01/70 00:00 | |
Initialise it more than one time | 01/01/70 00:00 | |
Needing To Do Three Times Is A Kludge | 01/01/70 00:00 | |
Thanks | 01/01/70 00:00 | |
Intent Applied; But Verified?? | 01/01/70 00:00 | |
previous experiences | 01/01/70 00:00 | |
' Will see it again | 01/01/70 00:00 |