怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦可

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦可相关的知识,希望对你有一定的参考价值。

怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦可以写一下备注吗?现在有的程序是按键并显示

这是一个用汇编做的计算器,是数码管显示的。
KEYVAL EQU 30H
KEYTM EQU 31H
KEYSCAN EQU 32H
DAT EQU 33H
SCANLED EQU 37H
S_DAT EQU 38H
D_DAT EQU 39H
R_DATL EQU 3AH
R_DATH EQU 3BH
CALFLAG EQU 3CH
FLAG BIT 00H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV KEYVAL,#0
MOV P2,#00H
MOV SCANLED,#0
MOV 33H,#0H
MOV 34H,#0H
MOV 35H,#0H
MOV 36H,#0H
MOV S_DAT,#0
MOV D_DAT,#0
CLR FLAG
SETB EA
SETB ET0
SETB TR0
LOOP:
LCALL KEYSEL
MOV A,KEYVAL
CJNE A,#0FFH,LOOP1
SJMP LOOP
LOOP1:
CJNE A,#11,LOOP2 ;“=”
MOV A,33H
MOV B,#10
MUL AB
ADD A,34H
MOV D_DAT,A
LCALL DEALDAT
LCALL HB2
MOV A,R5
ANL A,#0FH
MOV 34H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOV 33H,A
MOV A,R4
ANL A,#0FH
MOV 36H,A
MOV A,R4
SWAP A
ANL A,#0FH
MOV 35H,A
SJMP LOOP
LOOP2:
CJNE A,#15,LOOP3 ;“+”
LCALL GETDAT
SJMP LOOP
LOOP3:
CJNE A,#14,LOOP4 ;“-”
MOV CALFLAG,#1
LCALL GETDAT
SJMP LOOP
LOOP4:
CJNE A,#13,LOOP5 ;“*”
MOV CALFLAG,#2
LCALL GETDAT
SJMP LOOP
LOOP5:
CJNE A,#12,LOOP6 ;"/"
MOV CALFLAG,#3
LCALL GETDAT
SJMP LOOP
LOOP6:
CJNE A,#10,LOOP7 ;数字键
LOOP7:
JC LOOP8
LJMP LOOP
LOOP8:
MOV 33H,34H
MOV 34H,KEYVAL
LJMP LOOP
;------------------
HB2:
MOV R6,R_DATH
MOV R7,R_DATL
CLR  A   ;BCD码初始化
MOV  R3,A
MOV  R4,A
MOV  R5,A
MOV  R2,#10H   ;转换双字节十六进制整数
HB3:
MOV  A,R7   ;从高端移出待转换数的一位到 CY 中
RLC  A
MOV  R7,A
MOV  A,R6
RLC  A
MOV  R6,A
MOV  A,R5   ;BCD码带进位自身相加,相当于乘2
ADDC  A,R5
DA  A   ;十进制调整
MOV  R5,A
MOV  A,R4
ADDC  A,R4
DA  A
MOV  R4,A
MOV  A,R3
ADDC  A,R3
MOV  R3,A   ;双字节十六进制数的万位数不超过6,不用调整
DJNZ  R2,HB3   ;处理完16bit
RET
;------------------
GETDAT:
MOV A,33H
MOV B,#10
MUL AB
ADD A,34H
MOV S_DAT,A
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV 36H,#0
RET
;------------------
DEALDAT:
MOV A,CALFLAG
JNZ DEAL01
DEAL00: ;+
MOV A,S_DAT
ADD A,D_DAT
MOV R_DATL,A
CLR A
ADDC A,#0
MOV R_DATH,A
RET
DEAL01: ;=
DEC A
JNZ DEAL02
CLR C
MOV A,S_DAT
SUBB A,D_DAT
MOV R_DATL,A
SUBB A,#0
MOV R_DATH,A
RET
DEAL02: ;*
DEC A
JNZ DEAL03
MOV A,S_DAT
MOV B,D_DAT
MUL AB
MOV R_DATL,A
MOV R_DATH,B
RET
DEAL03: ;/
MOV A,S_DAT
MOV B,D_DAT
DIV AB
MOV R_DATL,A
MOV R_DATH,#0
RET
;------------------
KEYSEL:
MOV KEYVAL,#0
MOV KEYSCAN,#0EFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS1
MOV KEYVAL,A
SJMP KEYRTN
KEYS1:
MOV KEYSCAN,#0DFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS2
CLR C
ADD A,#4
MOV KEYVAL,A
SJMP KEYRTN
KEYS2:
MOV KEYSCAN,#0BFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS3
CLR C
ADD A,#8
MOV KEYVAL,A
SJMP KEYRTN
KEYS3:
MOV KEYSCAN,#7FH
LCALL GETKEY
MOV A,KEYTM
JZ KEYRTN
CLR C
ADD A,#12
MOV KEYVAL,A
KEYRTN:
LCALL CHGKEY
RET
;--------------------
GETKEY:
MOV KEYTM,#0
MOV A,KEYSCAN
MOV P3,A
NOP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV R2,#10
LCALL DELAY
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV A,P3
ANL A,#0FH
MOV R7,A
SF:
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ SF
MOV A,R7
CJNE A,#0EH,NK1
MOV KEYTM,#1
SJMP NOKEY
NK1:
CJNE A,#0DH,NK2
MOV KEYTM,#2
SJMP NOKEY
NK2:
CJNE A,#0BH,NK3
MOV KEYTM,#3
SJMP NOKEY
NK3:
CJNE A,#07H,NOKEY
MOV KEYTM,#4
NOKEY: RET
;--------------------
DELAY:
MOV R3,#50
DELAY1:
MOV R4,#100
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
;--------------------
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0
MOV DPTR,#LEDTAB
T000: ;数字显示
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T001
MOV P2,#01H
SJMP T0DIS
T001:
DEC A
JNZ T002
MOV P2,#02H
SJMP T0DIS
T002:
DEC A
JNZ T003
MOV P2,#04H
SJMP T0DIS
T003:
MOV P2,#08H
T0DIS:
MOV A,@R0
MOVC A,@A+DPTR
; CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
ANL A,#03H
MOV SCANLED,A
POP ACC
RETI
;--------------------
CHGKEY:
MOV A,KEYVAL
JZ KV16
DEC A
JNZ KV01
MOV KEYVAL,#7
RET
KV01:
DEC A
JNZ KV02
MOV KEYVAL,#4
RET
KV02:
DEC A
JNZ KV03
MOV KEYVAL,#1
RET
KV03:
DEC A
JNZ KV04
MOV KEYVAL,#10
RET
KV04:
DEC A
JNZ KV05
MOV KEYVAL,#8
RET
KV05:
DEC A
JNZ KV06
MOV KEYVAL,#5
RET
KV06:
DEC A
JNZ KV07
MOV KEYVAL,#2
RET
KV07:
DEC A
JNZ KV08
MOV KEYVAL,#0
RET
KV08:
DEC A
JNZ KV09
MOV KEYVAL,#9
RET
KV09:
DEC A
JNZ KV10
MOV KEYVAL,#6
RET
KV10:
DEC A
JNZ KV11
MOV KEYVAL,#3
RET
KV11:
DEC A
JNZ KV12
MOV KEYVAL,#11 ;=
RET
KV12:
DEC A
JNZ KV13
MOV KEYVAL,#12 ;/
RET
KV13:
DEC A
JNZ KV14
MOV KEYVAL,#13 ;*
RET
KV14:
DEC A
JNZ KV15
MOV KEYVAL,#14 ;-
RET
KV15:
DEC A
JNZ KV16
MOV KEYVAL,#15 ;+
RET
KV16:
MOV KEYVAL,#0FFH
RET
;--------------------
LEDTAB:
DB 0C0H ;"0" 00H
DB 0F9H ;"1" 01H
DB 0A4H ;"2" 02H
DB 0B0H ;"3" 03H
DB 99H ;"4" 04H
DB 92H ;"5" 05H
DB 82H ;"6" 06H
DB 0F8H ;"7" 07H
DB 80H ;"8" 08H
DB 90H ;"9" 09H
DB 88H ;"A" 0AH
DB 83H ;"B" 0BH
DB 0C6H ;"C" 0CH
DB 0A1H ;"D" 0DH
DB 86H ;"E" 0EH
DB 8EH ;"F" 0FH
DB 0FFH ;" " 10H
;--------------------
END
参考技术A KEYBUF EQU 40H ;键号存放单元
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值
MOV R0,#30H ;显示首地址
MOV R2,#0CH ;计算数据存放单元个数
CLR A
QING: MOV @R0,A ;将数据存放单元清零
INC R0
DJNZ R2,QING
MOV P0,#8FH ;关闭显示
MOV R1,#30H ;将显示首地址存放R1里

完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

#!/bin/usr/env python
#coding=utf-8
‘‘‘
完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
‘‘‘
try:
a=int(raw_input("please input a number:"))
except ValueError:
print("第一个运算数字输入非数字")


try:
b=int(raw_input("please input another number:"))
except ValueError:
print("第二个运算数字输入非数字")

print("打印两个数的和为:%d"%(a+b))
print("打印第一个数减去第二个数的差为:%d"%(a-b))
try:
print("打印第一个数除以第二个数的差商为:%d"%(a/b))
except ZeroDivisionError:
print("除数为0,请正确输入!")

print("打印两个数的乘积为:%d"%(a*b))

以上是关于怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦可的主要内容,如果未能解决你的问题,请参考以下文章

51单片机,用c语言,如何用矩阵键盘为一个变量char a赋值?已设计出一个函数,使得每按一个矩阵

求。用89C51单片机设计4*4矩阵式键盘计算器程序

单片机简易计算器的设计要求用2*8矩阵键盘,程序如下,求大神把下面4*4键盘程序改成2*8的,可追加分数

需要单片机的四位计算器的程序图和电路图,仿真图。4X4键盘。能计算加减乘除。

在Linux下,用shell编写一个简单的计算器,要实现加减乘除4个功能就行了

单片机计算器四位数的加减乘除的结果用啥数据类型