产品选型

单片机 equ 单片机DIY简易计算器

小编 2024-11-24 产品选型 23 0

单片机DIY简易计算器

有小伙伴给我私信说老师让用单片机做一个简易计算器,让我帮帮他。

正好没事就用PROTEUS做了一个,希望对他有所帮助,也希望小伙伴看完后能有所收获。

单片机 计算器DIY 计算5+5请看以下连接视频

视频:单片机DIY简易计算器

编程语言参考源代码如下:

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里

;===============================================

;五位无符号显示子程序

DIS1: MOV R0,#30H ;把显示数据第一位放在R0里

MOV R2,#04H ;把显示的位码放在R2里

MOV R3,#05H ;把显示的长度放在R3里

DIS2: MOV A,@R0

ANL A,#0FH ;屏蔽显示数据的高四位

MOV B,A

MOV A,R2

ANL A,#0FH ;屏蔽位码的高四位

SWAP A

ORL A,B

MOV P0,A ;送总显示数据到P0显示

LCALL DELY4ms ;调用延时4ms

INC R0 ;取下一个显示数据

DEC R2

DJNZ R3,DIS2 ;四位显示完后重新开始显示

;===================================================

;键盘扫描子程序

WAIT: MOV P1,#0FFH ;P1口送高电平

CLR P1.0 ;第一行清零

MOV A,P1 ;读P1口

ANL A,#0F0H ;低位屏蔽

XRL A,#0F0H ;判断低位是否有低电平 ,即判断是否有按键按下

JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第二行去扫描

LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下

MOV A,P1 ;继续读P1口

ANL A,#0F0H ;判断低位是否有低电平

CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1

MOV KEYBUF,#0 ;否者判断为0号键

AJMP DK ;转DK1查表程序

NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2

MOV KEYBUF,#1 ;否者判断为1号键

AJMP DK ;转DK2查表程序

NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3

MOV KEYBUF,#2 ;否者判断为2号键

AJMP DK ;转DK3查表程序

NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H就转到NK4

LJMP SAN_CHU

NK4: NOP

NOKEY1: MOV P1,#0FFH ;和上面相同

CLR P1.1

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

LCALL DELY10MS

MOV A,p1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK5

MOV KEYBUF,#3

AJMP DK

NK5: CJNE A,#0D0H,NK6

MOV KEYBUF,#4

AJMP DK

NK6: CJNE A,#0B0H,NK7

MOV KEYBUF,#5

AJMP DK

NK7: CJNE A,#70H,NK8

MOV KEYBUF,#10 ;否者判断为3号键

AJMP DK ;转DK4查表程序

NK8: NOP

NOKEY2: MOV P1,#0FFH

CLR P1.2

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK9

MOV KEYBUF,#6

AJMP DK

NK9: CJNE A,#0D0H,NK10

MOV KEYBUF,#7

AJMP DK

NK10: CJNE A,#0B0H,NK11

MOV KEYBUF,#8

AJMP DK

NK11: CJNE A,#70H,NK12

LJMP DENG_HAO

NK12: NOP

NOKEY3: MOV P1,#0FFH

CLR P1.3

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK13

LJMP CHU

NK13: CJNE A,#0D0H,NK14

LJMP CHENG

NK14: CJNE A,#0B0H,NK15

LJMP JIAN

NK15: CJNE A,#70H,NK16

LJMP JIA

NK16: NOP

;=======================================================

;查表求键值程序

DK: MOV B,#00H

MOV A,KEYBUF ;查表程序 查对应的键号数据

MOV DPTR,#TABLE ;把表头地址放入DPTR

MOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据

MOV B,A ;把查到的数据送往显示单元

INC R1 ;取下一个显示单元

MOV A,R1

CJNE A,#36H,DKA1 ;判断显示单元是否已满

MOV R1,#35H ;35H,36H单元用于更好地控制五位显示

AJMP DKA

DKA1: MOV 34H,33H ;按键代码按左移显示,先按先显示

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,B

DKA: MOV A,P1 ;读P1口

ANL A,#0F0H ;屏蔽高四位

XRL A,#0F0H ;地位是有低电平

JNZ DKA ;如果有低电平继续读P1口,否者向下执行,查找第二行

NOKEY4: LJMP DIS1

;===================================

;功能按键功能设定

DENG_HAO:MOV DPTR,#JI_SUAN ;等号键功能通过加、减、乘、除设定的偏移量来调用子程序

MOV A,3CH ;3CH存放的为功能程序入口地址偏移量

JMP @A+DPTR ;转移到按键功能程序

JI_SUAN: AJMP JIA1 ;加计算子程序

AJMP JIAN1 ;减计算子程序

AJMP CHENG1 ;乘计算子程序

AJMP CHU ;除计算子程序

;=======删除键功能

SAN_CHU: ACALL QING_DIS

AJMP DKA

;=======加键功能

JIA: MOV 3CH,#00H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======减键功能

JIAN: MOV 3CH,#02H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======乘键功能

CHENG: MOV 3CH,#04H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======除键功能

CHU: MOV 3DH,#06H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=================================

;存被加(减、乘、除)数,存放在37H~3BH里

CUN_SHU: MOV 37H,30H ;36H存放的为最低位

MOV 38H,31H

MOV 39H,32H

MOV 3AH,33H

MOV 3BH,34H ;3AH存放的为最高位

RET

;================================

;清除显示单元

QING_DIS: MOV R1,#30H

QING1: MOV @R1,#00H

INC R1

MOV A,R1

CJNE A,#36H,QING1

MOV R1,#30H

LOP1: RET

;================================

;十进制加法子程序

JIA1:

MOV A,37H ;个位被加数

ADD A,30H ;个位被加数+加数

MOV B,#10 ;十六进制除10转换成BCD码

DIV AB

MOV 30H,B ;余数即个位存放在30H

MOV 37H,A ;商存放在37H

MOV A,38H ;十位被加数

ADD A,31H ;十位被加数+加数

ADD A,37H ;加上个位之和的进位

MOV 37H,#00H ;清除37H

MOV B,#10 ;十六进制除10转换成BCD码

DIV AB

MOV 31H,B ;余数即十位存放在31H

MOV 38H,A ;商存放在38H

MOV A,39H ;百位计算同十位

ADD A,32H

ADD A,38H

MOV 38H,#00H

MOV B,#10

DIV AB

MOV 32H,B

MOV 39H,A

MOV A,3AH ;千位计算同十位

ADD A,33H

ADD A,39H

MOV 39H,#00H

MOV B,#10

DIV AB

MOV 33H,B

MOV 3AH,A

MOV A,3BH ;万位计算同十位

ADD A,34H

ADD A,3AH

MOV 3AH,#00H

MOV B,#10

DIV AB

MOV 34H,B

MOV 3BH,#00H

AJMP DKA

;=====================

JIAN1: AJMP DKA

CHENG1: AJMP DKA

CHU1: AJMP DKA

;=============================================

;延时程序和查表表格

DELY4ms: MOV R6,#8 ;延时4毫秒

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

DELY10ms:MOV R6,#20 ;延时10毫秒

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

RET

TABLE: DB 07H, 04H, 01H ; / 本表格是以键盘为参考 7 8 9 /

DB 08H, 05H, 02H ; * 4 5 6 *

DB 09H, 06H, 03H ; - 1 2 3 -

DB 00H, 00H ;= + 清除 0 = +

END

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,

如果需要 程序完整的源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢!

感谢你的阅读,希望您有所收获,喜欢请点赞评论加关注!

跟电师傅学单片机(7):指令慨述

头条号:电工人家,专门请电师傅讲解单片机应用技术,倾力奉献,机会难得,力求做到图文并茂、通俗易懂。欢迎电工电子爱好者关注和阅读,留言讨论,共同学习与提高,分享和普及电知识。

课前一语:一个人至少拥有一个梦想,有一个理由去坚强。心若没有栖息的地方,到哪里都是在流浪。心若有牵挂,便有了目标,从此不再流浪...

一:单片机指令编程与运行流程

单片机编程与运行流程图

第一步:根据用户(电路)的软件要求和说明,编写软件指令,也就是单片机编程。

第二步:由专门的编译软件将指令转换成机器码格式文件(比如:后缀名为HEX的文件)存入程序存储器中。

第三步:由单片机CPU在程序存储器中去取指令,再一步一步去执行。

二:指令字节按长度分类

指令字节分类

三:指令的格式

指令格式

DELAY:延迟和延时

MOV:传送

R3:工作寄存器,R0-R7

#0FFH:操作数(数据)

标号:有标号的程序一般是作为子程序,方便主程序多次调用。标号的名称可以自由编写,方便程序识别就行了,一般是定义一些具有实际含义的标号,以便自己阅读。要注意不能用指令或伪指令及相关的保留字,如不能用ORG,MOV,EQU等等指令字符做为标号,标号内最好不要用加减号或等于号等,标号的格式是字符加冒号(:)。也可以不用标号。

注释:方便理解单片机指令程序,格式是注释前加分号(;)。也可以不用注释。

相关问答

单片机EQU (0SHL4)是什么意思?

EQU跟变量申请差不多,比如DISEQU30H就是定义变量DIS的地址是30H,以后DIS操作相当于对寄存器30H的操作。0SHL4好像没有什么实际意义,如果是1SHL4的话...

51 单片机 所有伪指令?

MCS-51单片机常用伪指令一)符号定义伪指令符号定义名用法说明EQU为常量,符号名...MCS-51单片机常用伪指令一)符号定义伪指令符号定义名...

单片机 中有DATA这个伪指令吗?

6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA表达式注:该指令与EQU指令相似,只是,可...6、数据地址赋值伪...

单片机 -80C514.下列程序段经汇编后,从1000H开始的各有关存储...

[最佳回答]首先TAB1EQU1234h它并不分配内存单元这里EQU是代表定义一个符号常量这点和C里面的预处理#define命令类似下面遇到TAB1,就会用1234H替换.db,dw...

单片机 定时器应用实验用80C51内部定时器1,按方式1工作,即作...

[最佳回答]完全一样的题目呀,真幸运,看我的吧(我的是8052的,没关系的):汇编程序:S1EQU30HS2EQU31HORG0000HAJMPMAIN&nb...完全一...

想问一下用汇编语言写 单片机 程序时,怎么定义一个数组变量?

严格的说,汇编语言不支持显式数组变量,就是说你想定义一个任意数组,然后用下标访问是不行的。但汇编语言支持隐式数组变量,其实就是对变量表间接寻址,使用...

汇编中D8255A EQU 8EFFH什么意思,解释下?

D8255A只是一个符号或者说相当于一个宏,它的值为8EFFH,一般在单片机应用程序里,常把某个硬件的端口地址用一个宏来表示,这样可以方便理解。其实汇编语言本...

单片机 编程实现0---20秒计时器,并用proteus软件设计硬件电路?

;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时;倒计时时间由四位拨码开关的1/2/3位来控制,;第2位表示5分钟,第3位表示15分钟,第4位表示30...

怎么用按键调整 单片机 的延时时间-ZOL问答

SECEQUP3.5;调秒按键接P3.5,另一端接地MINEQUP3.6HOUREQUP3.7...kS:LCALLDISPJBSEC,KM;未按下,转判调分按键LC...

宝山区gefran传感器厂家供应,gefran传感器款式多吗??

[回答]此程序是我做单片机课程设计的程序,PROTEL原理图在附件里程序经过了实验的测试,没有任何问题。一设计要求:1.以8031为主控器组成A/D,D/A转换系统。2...

猜你喜欢