单片机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
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 程序完整的源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢!
感谢你的阅读,希望您有所收获,喜欢请点赞评论加关注!
单片机常见英文简写,都来看看,快速入门
MCS-51指令英语全简称
(1)数据传送类指令(7种助记符) 助记符 英文注释 功能
MOV Move 对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送
MOVC Move Code 读取程序存储器数据表格的数据传送 MOVX Move External RAM 对外部RAM的数据传送 XCH Exchange 字节交换
XCHD Exchange low-order Digit 低半字节交换 PUSH Push onto Stack) 入栈 POP Pop from Stack) 出栈
(2)算术运算类指令(8种助记符) ADD Addition 加法
ADDC Add with Carry 带进位加法 SUBB Subtract with Borrow 带借位减法 DA Decimal Adjust 十进制调整 INC Increment 加1 DEC Decrement 减1
MUL Multiplication、Multiply 乘法 DIV Division、Divide 除法
(3)逻辑运算类指令(10种助记符) ANL And Logic 逻辑与 ORL OR Logic 逻辑或
XRL Exclusive-OR Logic 逻辑异或 CLR Clear 清零 CPL Complement 取反 RL Rotate left 循环左移
RLC Rotate Left throught the Carry flag 带进位循环左移 RR Rotate Right 循环右移
RRC Rotate Right throught the Carry flag 带进位循环右移 SWAP Swap 低4位与高4位交换
(4)控制转移类指令(17种助记符)
ACALL Absolute subroutine Call 子程序绝对调用 LCALL Long subroutine Call 子程序长调用 RET Return from subroutine 子程序返回 RETI Return from Interruption 中断返回 JMP Jump Indirect 跳转指令 SJMP Short Jump 短转移
AJMP Absolute Jump 绝对转移 LJMP Long Jump 长转移
CJNE Compare and Jump if Not Equal 比较不相等则转移 DJNZ Decrement and Jump if Not Zero 减1后不为0则转移 JZ Jump if Zero 结果为0则转移
JNZ Jump if Not Zero 结果不为0则转移
JC Jump if the Carry flag is set 有进位则转移 JNC Jump if Not Carry 无进位则转移 JB Jump if the Bit is set) B 位为1则转移
JNB Jump if the Bit is Not set B 位为0则转移
JBC Jump if the Bit is set and Clear the bit 位为1则转移,并清除该位 NOP No Operation 空操作
(5)位操作指令(1种助记符) SETB Set Bit 置位 伪指令
助记符 英文注释 功能 ORG Origin 起始地址 DB Define Byte 定义字节 DW Define Word 定义字义
EQU Equal 赋值(右赋左) 等于 DATA Data 数据赋值(右赋左) XDATA External Data 外部数据赋值(右赋左) BIT Bit 位地址赋值 END End 汇编结束 DS Define storage 定义存储空间 51外部引脚
缩写 英文解释 中文解释
RST (9) Reset 复位信号引脚 RxD (10--P3.0) Receive Data 串口接收端 TxD (11--P3.1) Transmit Data 串口发送端
INT0(————)( 12--P3.2) Interrupt0 外部中断0信号输入引脚 INT1(————) (13--P3.3) Interrupt1 外部中断1信号输入引脚 T0 (14--P3.4) Timer0 定时/计数器0输入信号引脚 T1 (15--P3.5) Timer1 定时/计数器1输入信号引脚 WR(———) (16--P3.6) write 存储器的写信号 写信号引脚
RD(———) (17--P3.7) read 读信号引脚
PSEN(—————) (29) progammer saving enable 外部程序存储器读选通信号
ALE (30) Address Latch Enable 地址锁存允许信号 EA(———) (31) enable 外部ROM选择信号 51内部寄存器
SFR special funtion register 特殊功能寄存器 ACC accumulate 累加器A
PSW progammer status word 程序状态字
CY (PSW.7) carry 进位标志位
AC (PSW.6) assistant carry 辅助进位标志位 OV (PSW.2) overflow 溢出标志位 PC progammer counter 程序计数器
DPTR data point register 数据指针寄存器 SP stack point 堆栈指针
TCON timer control 定时器控制寄存器 TF1 (TCON.7) Timer1 flag T1中断标志位 TR1 (TCON.6) Timer1 Run T1运行控制位 TF0 (TCON.5) Timer0 flag T0中断标志位 TR0 (TCON.4) Timer0 Run T0运行控制位
IE1 (TCON.3) Interrupt1 exterior 外部中断1中断标志位 IT1 (TCON.2) Interrupt1 touch 外部中断1 触发方式选择位 IE0 (TCON.1) Interrupt0 exterior 外部中断0中断标志位 IT0 (TCON.0) Interrupt0 touch 0-电平触发 1-下降沿触发 IE (A8H) interrupt enable 中断允许寄存器 EA (IE.7) enable all interrupt 中断总允许位 ES (IE.4) enable serial 串行口中断允许位 ET1 (IE.3) enable timer 1 T1中断允许位
EX1 (IE.2) enable exterior 1 外部中断1中断允许位 ET0 (IE.1) enable timer 0 T0中断允许位
EX0 (IE.0) enable exterior 0 外部中断0中断允许位 IP (B8H) interrupt priority 中断优先级寄存器 PS (IP.4) priority serial 串口优先级标志位
PT1 (IP.3) priority timer 1 定时器1优先级标志位
PX1 (IP.2) priority exterior 1 外部中断1优先级标志位 PT0 (IP.1) priority timer 0 定时器0优先级标志位
PX0 (IP.0) priority exterior 0 外部中断0优先级标志位 PCON (87H) power control 电源控制和波特率选择 TMOD (89H) timer mode 定时器方式控制寄存器 MSB = most significant bit//最高有效位 LSB = last significant bit//最低有效位 OE = output enable //输出使能 PROG progamme 程序
XTAL:External Crystal Oscillator,外部晶体振荡器 CLKOUT:Clock out,时钟输出 BUSWDITH:总线宽度
Vref:参考电压(带ADC的单片机中有的) RESET:复位,重启 ACH:??
HSO:High Speed Output,高速输出 HSI:High Speed Input:高速输入 INST:Instruction,指令
READY:就绪,总线中的就绪信号或引脚
CY (PSW.7) carry 进位标志位
AC (PSW.6) assistant carry 辅助进位标志位 OV (PSW.2) overflow 溢出标志位 PC progammer counter 程序计数器
DPTR data point register 数据指针寄存器 SP stack point 堆栈指针
TCON timer control 定时器控制寄存器 TF1 (TCON.7) Timer1 flag T1中断标志位 TR1 (TCON.6) Timer1 Run T1运行控制位 TF0 (TCON.5) Timer0 flag T0中断标志位 TR0 (TCON.4) Timer0 Run T0运行控制位
IE1 (TCON.3) Interrupt1 exterior 外部中断1中断标志位 IT1 (TCON.2) Interrupt1 touch 外部中断1 触发方式选择位 IE0 (TCON.1) Interrupt0 exterior 外部中断0中断标志位 IT0 (TCON.0) Interrupt0 touch 0-电平触发 1-下降沿触发 IE (A8H) interrupt enable 中断允许寄存器 EA (IE.7) enable all interrupt 中断总允许位 ES (IE.4) enable serial 串行口中断允许位 ET1 (IE.3) enable timer 1 T1中断允许位
EX1 (IE.2) enable exterior 1 外部中断1中断允许位 ET0 (IE.1) enable timer 0 T0中断允许位
EX0 (IE.0) enable exterior 0 外部中断0中断允许位 IP (B8H) interrupt priority 中断优先级寄存器 PS (IP.4) priority serial 串口优先级标志位
PT1 (IP.3) priority timer 1 定时器1优先级标志位
PX1 (IP.2) priority exterior 1 外部中断1优先级标志位 PT0 (IP.1) priority timer 0 定时器0优先级标志位
PX0 (IP.0) priority exterior 0 外部中断0优先级标志位 PCON (87H) power control 电源控制和波特率选择 TMOD (89H) timer mode 定时器方式控制寄存器 MSB = most significant bit//最高有效位 LSB = last significant bit//最低有效位 OE = output enable //输出使能 PROG progamme 程序
XTAL:External Crystal Oscillator,外部晶体振荡器 CLKOUT:Clock out,时钟输出 BUSWDITH:总线宽度
Vref:参考电压(带ADC的单片机中有的) RESET:复位,重启 ACH:??
HSO:High Speed Output,高速输出 HSI:High Speed Input:高速输入 INST:Instruction,指令
READY:就绪,总线中的就绪信号或引脚
相关问答
单片机 里 EQU 是什么指令?作用?伪代码,即用EQU前面的符号来代替后面的地址、表达式、寄存器等。P0、P1本身有定义,你这样定义会出错。伪代码,即用EQU前面的符号来代替后面的地址、表达式、...
单片机 中有DATA这个伪指令吗?6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA表达式注:该指令与EQU指令相似,只是,可...6、数据地址赋值伪...
想问一下用汇编语言写 单片机 程序时,怎么定义一个数组变量?严格的说,汇编语言不支持显式数组变量,就是说你想定义一个任意数组,然后用下标访问是不行的。但汇编语言支持隐式数组变量,其实就是对变量表间接寻址,使用...
单片机 编程实现0---20秒计时器,并用proteus软件设计硬件电路?;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时;倒计时时间由四位拨码开关的1/2/3位来控制,;第2位表示5分钟,第3位表示15分钟,第4位表示30...
MCS-51 单片机 编程题.GREATEQU30HLESSEQU31HORG0000HLJMPMAIN:ORG0030HMAIN:MOVA,40HCJNEA,41H,MAIN1MOVGREAT...
在51 单片机 的外部RAM2000H至203FH区域的各单元存放一个字节的无符号数求出其中的最大值,存放在MAX单元中?MAXEQU30HMOVDPTR,#2000HMOVMAX,#00HMOVR5,#40HLOOP:MOVXA,@DPTR;1CALLMMA;2INCDPTRDJNZ...
51 单片机 多少位谁能告诉我_其他问答_系统粉MCS-51单片机的指令集1、数据传送类指令助记符功能说明字节数振荡周期MOVA,Rn寄存器内容送入累加器112MOVA,direct直接地址单元中的数据送...
求基于AT89C51 单片机 和DS18B20温度传感器和HS1101湿度传感器...[最佳回答]A_BITEQU20HB_BITEQU21HFLAGEQU38HDQEQUP3.3MAIN:ACALLRE_TEMPACALLTURNACALLDISPLAYJM...
朋友们,谁能给我说一下 实力厂家小袋全自动包装机费用情况...[回答]...现在重新了解了一下,还是觉得选自己信得过的最重要。现在也用了一年多了,效果挺好,我也把朋友拉开一起做了。感觉自己的眼光还是可以的。如果...
单片机 -80C514.下列程序段经汇编后,从1000H开始的各有关存储...首先TAB1EQU1234h它并不分配内存单元这里EQU是代表定义一个符号常量这点和C里面的预处理#define命令类似下面遇到TAB1,就会用1234H替换.db,...