[問題] 8051組合語言語法

看板ASM (組合語言)作者 (Arting)時間16年前 (2009/02/10 00:38), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
板上的高手們能幫小弟我看一下寫的東西 小弟我剛接觸8051,所以概念可能不太好,希望能不吝於指教 內容:利用指撥開關 四個單鍵與文字形LCD來設計簡單的計算機,其中乘法以連加表示,除 法已連減表示 指撥開關輸入a值與b值 模式鍵:乘除法轉換 出題鍵:在LCD上顯示出乘法或除法算式 ex:a*b或a/b 解答鍵:每計算一次顯示一次 清除鍵:全部清除 問題:跑的出東西但只能控制a值跟部分的單鍵功能 我想可能是我有邏輯的錯誤 但自己寫的東西不容易找出來,希望高手能給我一些指點 如果問題很大的話,那我在砍掉重練 感謝你們 板大如果這篇不允許的話,我在自D吧! 以下為程式碼 ;模式鍵P1.3 出題鍵P1.4 解答鍵P1.5 清除鍵P1.6 指撥開關P2 E REG P1.2 RS REG P1.0 RW REG P1.1 ;**********************************主程式******************************** ;初始設定 SETTING: MOV R0,#0 ;被乘數 被除數 MOV R1,#0 ;乘數 除數 MOV R2,#0 ; MOV R3,#0 ; MOV R4,#0 ; MOV A,#0 ; ;出題鍵P1.4 START: JB P1.4,$ ;判斷出題鍵是否按下 ;指撥題目顯示於LCD SHOWQUESTION: MOV DPTR,#DATA MOV A,P2 CPL A ;取A的補數=1 ANL A,#0F0H SWAP A ;高低四位元互換 MOV R0,A ANL A,#0OFH MOV R1,A ACALL LCDFIRST ;顯示於LCD第一行 MOV A,R0 ;顯示被乘數 被除數 ACALL LOOP ACALL DIVMODE ;顯示乘 除 ACALL LOOP MOV A,R1 ;顯示乘數 除數 ACALL LOOP MOV A,#18 ;顯示 = ACALL LOOP MOV A,#19 ;顯示 ? ACALL LOOP ACALL LCDSECOND ;換至LCD第二行 ACALL ANSWER ;解答鍵P1.5 ANSWER: JB P1.5,$ MOV A,R0 MOV B,R1 DIV AB MOV R4,A INC R4 JNB P1.3,DIV0 MUL0: CLR A ACALL LOOP ACALL SDATA MUL1: MOV A,R0 JZ CLEAR MOV A,R1 JZ CLEAR MUL2: ACALL LCDSECOND MOV A,R3 ADD A,R0 MOV R3,A ANL A,#11110000B SWAP A ACALL LOOP MOV A,R3 ANL A,#00001111B ACALL LOOP DJNZ R1,MUL2 ACALL DELAY5MS AJMP CLEAR DIV0: MOV A,R1 JZ ERROR DIV1: MOV A,R3 ACALL LOOP ACALL DOT MOV A,R0 ACALL LOOP MOV A,R0 SUBB A,R1 MOV R0,A ACALL LCDSECOND INC R3 DJNZ R4,DIV1 ACALL DELAY5MS AJMP CLEAR ERROR: ACALL LCDSECOND MOV A,#14 ACALL LOOP MOV A,#22 ACALL LOOP MOV A,#22 ACALL LOOP MOV A,#21 ACALL LOOP MOV A,#22 ACALL LOOP AJMP CLEAR ;清除鍵P1.6 CLEAR: JB P1.6,$ ;判斷是否有按 MOV A,#1 ;清除全螢幕 ACALL COMMAND AJMP SETTING END ;***********************************以下為副程式****************************** ;模式鍵P1.3 DIVMODE: JB P1.3,MULMODE MOV A,#16 ;除號 RET MULMODE: MOV A,#17 ;乘號 RET DOT: MOV A,#20 MOVC A,@A+DPTR ACALL SDATA ACALL SDATA ACALL SDATA RET ;顯示LCD第一行 LCDFIRST: MOV A,#10000000B ACALL COMMAND RET ;顯示LCD第二行 LCDSECOND: MOV A,#11000000B ACALL COMMAND RET ;從DATA讀取後寫入 LOOP: MOVC A,@A+DPTR ACALL SDATA RET ;LCD顯示重複寫入 COMMAND: MOV P0,A SETB E CLR RW CLR RS CLR E ACALL DELAY2MS RET ;LCD顯示不重複寫入 SDATA: MOV P0,A SETB E CLR RW SETB RS CLR E RET ;延遲副程式 DELAY5MS: ACALL DELAY1MS ACALL DELAY2MS ACALL DELAY2MS RET DELAY2MS: ACALL DELAY1MS ACALL DELAY1MS RET include delay.inc DATA: DB "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" DB "/","*","=","?",".","O","R" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.143.64.76
文章代碼(AID): #19a5lw0a (ASM)
文章代碼(AID): #19a5lw0a (ASM)