作者evilvoice (Arting)
看板ASM
标题[问题] 8051组合语言语法
时间Tue Feb 10 00:38:17 2009
板上的高手们能帮小弟我看一下写的东西
小弟我刚接触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