这次用的是单片机的实验板做的。
一些设备介绍:
[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