51单片机的完整计算器汇编语言程序

这篇博客详细介绍了如何使用汇编语言编写51单片机的完整计算器程序,包括变量定义、扫描按键、LED显示、输入处理、运算功能(加、减、乘、除)等关键步骤,展示了51单片机实现计算器功能的实现过程。
摘要由CSDN通过智能技术生成

;$$$$变量定义区(30H-)$$$$$

OUTBIT EQU P2 ; 位控制口

OUTSEG EQU P0 ; 段控制口

ROW_COLUMN EQU P1 ; 读键盘行线口

VARIABLE_DELAY1 EQU 30H        ;延时变量

VARIABLE_DELAY2 EQU 31H

VARIABLE_STORE1        EQU 32H        ;存储第一个输入数

VARIABLE_STORE2 EQU 33H

VARIABLE_STORE3 EQU 34H        ;存储第二个输入数

VARIABLE_STORE4 EQU 35H

VARIABLE_STORE5 EQU 36H        ;存储最后结果

VARIABLE_STORE6 EQU 37H

VARIABLE_INPUT1A EQU 38H        ;第一个输入数保存地址

VARIABLE_INPUT1B EQU 39H

VARIABLE_INPUT1C EQU 3AH

VARIABLE_INPUT1D EQU 3BH

VARIABLE_INPUT2A EQU 3CH        ;第二个输入数保存地址

VARIABLE_INPUT2B EQU 3DH

VARIABLE_INPUT2C EQU 3EH

VARIABLE_INPUT2D EQU 3FH

VARIABLE_REPLACE_POINT EQU 40H        ;结果显示位置指针

;VARIABLE_RESULTB EQU 41H

;VARIABLE_RESULTC EQU 42H

;VARIABLE_RESULTD EQU 43H

VARIABLE_SIGN1 EQU 44H        ;保存第一个符号位

VARIABLE_SIGN2 EQU 45H        ;保存第二个符号位

VARIABLE_INPUT1_POINT EQU 46H ;第一个输入数状态指针,记录输入的位数

VARIABLE_INPUT2_POINT EQU 47H ;第二个输入数状态指针,记录输入的位数

VARIABLE_RESULT_POINT EQU 48H ;第二个输入数状态指针,记录输入的位数

VARIABLE_PLACE1_POINT EQU 49H        ;第一个输入数位置指针

VARIABLE_PLACE2_POINT EQU 4AH        ;第一个输入数位置指针

VARIABLE_LEDBUF_POINT EQU 4BH        ;第一个输入数位置指针

VARIABLE_LEDBUF EQU 4CH ; 显示缓冲

S1 EQU 50H        ;自定义数字电路入口与出口

S2 EQU 51H        ;功能1实现:将分离个位数字(S1-S5),转化为十进制,存储在S6,S7

S3 EQU 52H        ;功能2实现:将十进制位数字(S6-S7),转化为个位数字,存储在(S1-S5)

S4 EQU 53H        ;S1(最高位),S5(最低位)

S5 EQU 54H

S6 EQU 55H

S7 EQU 56H

KEY1 BIT P3.2

KEY2 BIT P3.3

KEY3 BIT P3.4

KEY4 BIT P3.5

;****************************************************进入主程序*****************************************************************************

ORG 0000H

AJMP STABLE

ORG 0100H

; *****************************************************键码定义和键值定义*******************************************************************

LEDMAP: ; 八段管显示码(共阳极)

DB 0C0h, 0F9h, 0A4h, 0B0h, 099h, 092h, 082h, 0F8h,080h, 090h, 088h, 083h,0C6H

KEYTABLE:

DB 00h, 04h, 08h

DB 01h, 05h, 09h

DB 02h, 06h, 0Ah

DB 03h, 07h, 0Bh

;$$$$子程序区$$$

$$$

;****************************************************延时程序(30H,31H)**********************************************************************

DELAY:

MOV VARIABLE_DELAY1,#10H

DE1:

MOV VARIABLE_DELAY2,#06FH

DE:

DJNZ VARIABLE_DELAY2,DE

DJNZ VARIABLE_DELAY1 ,DE1

RET

;***************************************************扫描按键程序*****************************************************************************

SCANNING:

JNB KEY1,FUNCTION1_SIGN1

JNB KEY2,FUNCTION2_SIGN1

JNB KEY3,FUNCTION3_SIGN1

JNB KEY4,FUNCTION4_SIGN1

RET

;****************************************************第一个符号位保存程序*****************************************************************

FUNCTION1_SIGN1:

MOV VARIABLE_SIGN1,#1

SJMP SCANNING

FUNCTION2_SIGN1:

MOV VARIABLE_SIGN1,#2

SJMP SCANNING

FUNCTION3_SIGN1:

MOV VARIABLE_SIGN1,#3

SJMP SCANNING

FUNCTION4_SIGN1:

MOV VARIABLE_SIGN1,#4

SJMP SCANNING

;****************************************************LED显示程序****************************************************************************

DISPLAYLED:

MOV R0, #VARIABLE_LEDBUF

MOV R1, #4 ; 共4个八段管

MOV R2, #11111110B ; 从左边开始显示

LOOP:

MOV OUTBIT, #0FFH        ; 关所有八段管

MOV OUTSEG, @R0

MOV OUTBIT, R2 ; 显示一位八段管

ACALL DELAY        ;

MOV A, R2 ; 位选选中下一位

RL A        ;

MOV R2, A        ;

INC R0

DJNZ R1, LOOP

RET

;**************************************************行值局部程序*****************************************************************************

GET_ROW1:

MOV A,ROW_COLUMN ; 读入键状态

ORL A, #0f8h ; 高5位不用,变为11111

CPL A        ;11111110->00000001,11111101->00000010,11111011->00000100,        1,2,4

RET

;*******************************得到行值程序,出口参数R3(行值)**********************************************************************************

GET_ROW:

MOV ROW_COL

根据提供的引用内容,我可以为您介绍基于51单片机计算器汇编语言的实现方法。 1. 首先,我们需要编写一个程序来输入第一个数。下面是一个示例程序: ```assembly ORG 00H MOV P1, #0FFH ; 设置P1口为输入模式 MOV P2, #00H ; 设置P2口为输出模式 MOV A, #00H ; 初始化A寄存器为0 MOV R0, #0AH ; 初始化R0寄存器为10,用于后面的十进制转换 MOV R1, #00H ; 初始化R1寄存器为0,用于存储输入的数 CLR C ; 清除进位标志位 LOOP: ; 循环读取输入的数 MOV P2, #01H ; 将P2口设置为高电平,表示等待输入 ACALL DELAY ; 延时一段时间,等待按键稳定 MOV A, P1 ; 读取P1口的值 CJNE A, #0FFH, READ ; 判断是否有按键按下,如果有则跳转到READ SJMP LOOP ; 如果没有按键按下,则继续等待输入 READ: ; 读取输入的数 MOV B, A ; 将输入的数保存到B寄存器 ANL B, #0FH ; 取出B寄存器的低4位,即输入的数值 MOV A, R1 ; 将R1寄存器的值保存到A寄存器 MOV C, #0 ; 清除进位标志位 ADD A, B ; 将输入的数加到A寄存器中 JC CARRY ; 如果有进位,则跳转到CARRY MOV R1, A ; 将A寄存器的值保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器 MUL AB ; 将A寄存器和B寄存器的值相乘 MOV B, R0 ; 将R0寄存器的值保存到B寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 DIV AB ; 将A寄存器和B寄存器的值相除 MOV R1, A ; 将商保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 MOV P2, #00H ; 将P2口设置为低电平,表示输入结束 SJMP LOOP ; 继续等待输入 CARRY: ; 处理进位 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 ADD A, #06H ; 加上6,得到正确的数值 MOV R1, A ; 将A寄存器的值保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 MOV P2, #00H ; 将P2口设置为低电平,表示输入结束 SJMP LOOP ; 继续等待输入 DELAY: ; 延时函数 MOV R2, #0FFH DELAY1: DJNZ R2, DELAY1 MOV R2, #0FFH DELAY2: DJNZ R2, DELAY2 RET ``` 2. 接下来,我们需要编写一个程序来输入第二个数。下面是一个示例程序: ```assembly ORG 00H MOV P1, #0FFH ; 设置P1口为输入模式 MOV P2, #00H ; 设置P2口为输出模式 MOV A, #00H ; 初始化A寄存器为0 MOV R0, #0AH ; 初始化R0寄存器为10,用于后面的十进制转换 MOV R1, #00H ; 初始化R1寄存器为0,用于存储输入的数 CLR C ; 清除进位标志位 LOOP: ; 循环读取输入的数 MOV P2, #02H ; 将P2口设置为高电平,表示等待输入 ACALL DELAY ; 延时一段时间,等待按键稳定 MOV A, P1 ; 读取P1口的值 CJNE A, #0FFH, READ ; 判断是否有按键按下,如果有则跳转到READ SJMP LOOP ; 如果没有按键按下,则继续等待输入 READ: ; 读取输入的数 MOV B, A ; 将输入的数保存到B寄存器 ANL B, #0FH ; 取出B寄存器的低4位,即输入的数值 MOV A, R1 ; 将R1寄存器的值保存到A寄存器 MOV C, #0 ; 清除进位标志位 ADD A, B ; 将输入的数加到A寄存器中 JC CARRY ; 如果有进位,则跳转到CARRY MOV R1, A ; 将A寄存器的值保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 MUL AB ; 将A寄存器和B寄存器的值相乘 MOV B, R0 ; 将R0寄存器的值保存到B寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 DIV AB ; 将A寄存器和B寄存器的值相除 MOV R1, A ; 将商保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 MOV P2, #00H ; 将P2口设置为低电平,表示输入结束 SJMP LOOP ; 继续等待输入 CARRY: ; 处理进位 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 ADD A, #06H ; 加上6,得到正确的数值 MOV R1, A ; 将A寄存器的值保存到R1寄存器中 MOV A, R1 ; 将R1寄存器的值保存到A寄存器中 MOV P2, #00H ; 将P2口设置为低电平,表示输入结束 SJMP LOOP ; 继续等待输入 DELAY: ; 延时函数 MOV R2, #0FFH DELAY1:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值