单片机做的计算器完成了!

  2006-06-08


这次用的是单片机的实验板做的。
一些设备介绍:
[HR][/HR]
单片机:AT89S52
键盘:4×4键盘,一个中断按键,一个复位按键。
显示:4位LED数码管显示。
声音:普通蜂鸣器。
[HR][/HR]
程序主要思想:
用有限的按键显示16进制的简单计算器,实现16位的16进制数的加减乘除计算。要求可以连续计算,把结果做为下一次计算的初值。
要点:
键盘:线反转法键盘扫描,并用查表法获取对应键值。
显示:用多位循环显示来完成多位LED的显示。
声音主要用来做操作提示用。
[HR][/HR]
程序详解:
加法子程序:
` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ADD16: ;16位加法,在本例里,全部的加法都用16位加法完成,超过16位的进位直接丢弃 MOV A,NUM2 ADD A,NUM4 MOV RES2,A ;低位相加 ;;;;;;;;;;;;;;;;;;;;;;; MOV A,NUM1 ADDC A,NUM3 MOV RES1,A ;高位相加 RET

减法子程序:
` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB16: ;16位减法

乘法子程序:
` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MUL16: ;16位乘法。注:这里要用大数乘以小数!也就是如果有16位的数出现时,用8×16位,不能用16×8位

除法子程序:
(十六位除以八位的)
<br /> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /> DIV16:<br /> ;八位八位的来(NUM1 NUM2)除(NUM4)<br /> ;先高八位除<br /> MOV A,NUM1<br /> MOV B,NUM4<br /> DIV AB<br /> MOV R1,A ;1<br /> ;;;;;;;;;;;;;;;;;;<br /> MOV A,#0F0H<br /> ANL A,NUM2 ;取高四位<br /> ORL A,B ;余数与低八位的高四位合并<br /> SWAP A<br /> MOV R6,A<br /> ;;;;;;;;;;;;;;;;;;<br /> MOV A,R6<br /> MOV B,NUM4<br /> DIV AB<br /> MOV R2,A ;2<br /> ;;;;;;;;;;;;;;;;;;;<br /> MOV A,#0FH<br /> ANL A,NUM2 ;取低四位<br /> SWAP A<br /> ORL A,B ;余数与低八位的低四位再合并!<br /> SWAP A<br /> MOV R7,A<br /> ;;;;;;;;;;;;;;;;;;;<br /> MOV A,R7<br /> MOV B,NUM4<br /> DIV AB<br /> MOV R3,A ;3<br /> ;;;;;;;;;;;;;;;;;;;;;;<br /> MOV A,R2<br /> SWAP A<br /> ORL A,R3<br /> ;;;;;;;;;;;;;;;;;;;;;;;;<br /> MOV RES1,R1 ;商的高八位<br /> MOV RES2,A ;商的低八位<br /> RET<br />

(十六位除以十位的)
` DIV16: MOV A,R5 JNZ BEGIN MOV A,R4 JZ OVER

显示:
<br /> DISPLAY: MOV R0,IS_OP<br /> CJNE R0,#0H,BACK<br /> MOV A,LED1 ;函数功能: 显示一位<br /> ACALL GETLED_CODE<br /> MOV P0 ,A<br /> CLR P2.7<br /> ACALL DLMS<br /> SETB P2.7<br /> ;<br /> MOV A,LED2<br /> ACALL GETLED_CODE<br /> MOV P0 ,A<br /> CLR P2.6<br /> ACALL DLMS<br /> SETB P2.6<br /> ;<br /> MOV A,LED3<br /> ACALL GETLED_CODE<br /> MOV P0,A<br /> CLR P2.5<br /> ACALL DLMS<br /> SETB P2.5<br /> ;<br /> MOV A,LED4<br /> ACALL GETLED_CODE<br /> MOV P0 ,A<br /> CLR P2.4<br /> ACALL DLMS<br /> SETB P2.4<br /> RET<br />

键盘检测:
`

完整的程序:
` ;定义一些程序保留的内存地址 NUM1 EQU 30H ;高 NUM2 EQU 31H ;低 NUM3 EQU 32H ;高 NUM4 EQU 33H ;低 ;;;;;;;;;;;;;;; RES1 EQU 34H RES2 EQU 35H ;;;;;;;;;;;;;;; DISP1 EQU 36H DISP2 EQU 37H ;;;;;;;;;;;;;;; KEY1 EQU 38H KEY2 EQU 39H KEY3 EQU 40H KEY4 EQU 41H ;;;;;;;;;;;;;;;;;;; LED1 EQU 42H LED2 EQU 43H LED3 EQU 44H LED4 EQU 45H ;;;;;;;;;;;;;;;;;;;;;; TEMP_KEY EQU 46H OP EQU 47H IS_OP EQU 48H