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

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

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

;$$$$变量定义区(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,     &nb

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值