单片机2位加减乘除(参考实验范例)
- 格式:doc
- 大小:49.50 KB
- 文档页数:13
运用单片机进行加减乘除法的运算
单片机介绍 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示
驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处
理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯
片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
看到这个题目,呵呵,可能好多人要打石头哥的板子;7+5等于几啊?
这还用你教?但是单片机里,数字是用二进制来表示的:这个就有一点拗口啦/ 虽然我们的教材到这里你可能还没有学会一个指令。
但是我的意思是首先作几个试验,提高大家对单片机的兴趣。
具体的指令太多了,不过还好,一般我们只需要记住常用的10-20条就够了。
OK,现在开始动手。
我们写入以下两条指令
MOV P1,#23H
END
这个程序大家想必看得懂,就是把23H这个16进制数送往P1口(即P1.0--P1.7)汇编得到HEX烧写后然后把芯片插入实验卡座;可以看到P1.0-1.7的状态为;。
题目:基于单片机的两位数“ +、-、*、/专业:___________ 电气工程及其自动化____________ 班级:___________________________________________ 姓名:___________________________________________ 学号:___________________________________________ 指导老师:________________________________________ 成绩:___________________________________________2012-11-1目录第一章引言...........................................1.1 简述电子密码锁 (3)1.2 本设计主要任务 (3)1.3 系统主要功能 (4)第二章系统主要硬件电路设计 (5)2.1 系统的硬件构成及功能 (5)3.2第三章系统软件设计 (9)3.13.2第四章调试第五章结束语 (13)参考文献 (14)附录源程序第一节引言1.1 简述电子密码锁随着社会物质财富的日益增长和人们生活水平的提高,安全成为居民最为重视的问题。
而锁自古以来就是把守门的铁将军,人们对它的要求十分高,既要求可靠的防盗,又要求简单方便,这也是制锁者长久以来亘古不变研究的主题。
传统的门锁需要涉及大量的钥匙,又要担心钥匙丢失后的麻烦。
另外,如:宾馆、办公大楼、仓库、保险柜等,由于装修施工等人住时也要把原有的锁胆更换,况且钥匙随身携带也诸多便。
随着单片机的问世,出现了带微处理器的密码锁,它除具有电子密码锁的功能外,还引入了智能化、科技化等功能。
从而使密码锁具有很高的安全性、可靠性。
目前西方发达国家已经大量应用智能门禁系统,可以通过多种的更加安全更加方便可靠的方法来实现大门的管理。
但电子密码锁在我国的应用还不广泛,成本还很高,希望通过不断地努力使电子密码锁能够在我国及居民日常生活中得到广泛应用,这也是一个国家生活水平的体现。
《电子设计自动化》课程设计题目: 2位十进制四则运算器电路摘要本次设计的目的是通过QuartusII软件实现输入两个2位十进制数(0~99),输出它们的四则运算(加减乘除)结果(发光二极管显示运算模式;调用LPM_MULT、LPM_CONSTANT及LPM_DIVIDE模块)。
实现的方法是利用四则运算的规律进行初步设计,然后进行调整和修改。
最终结果要求:随机的输入两个数,经过加法、减法、乘法和除法的运算,可以得到正确的运算结果。
主要分为4大部分:一、2位十进制数模块;二、加减乘除四则运算四个小模块;三、加减乘除四则运算的选择模块;四、处理输出结果的模块。
目录1 系统设计 (4)2 单元电路设计 (5)3 软件设计 (5)4 系统测试 (14)5 结论 (14)6 参考文献 (14)1、系统设计一、设计要求:输入两个2位十进制数(0~99),输出它们的四则运算(加减乘除)结果;发光二极管显示运算模式;可调用LPM_MULT及LPM_DIVIDE模块。
二、系统设计方案:(1)系统设计思路要完成2位十进制四则运算器电路,首先,需要生成2个两位的十进制数,其次,需要加减乘除四个运算,然后,四种运算的选择,最后,对输出结果的处理。
2个2位十进制模块:法一,用两个100进制计数器构成;法二,用4个10进制计数器构成。
因为add1模块(后面详细介绍)只有两个输入口,所以选择法一比较方便。
加减乘除四则运算:①加法:写一个加法程序,制成模块,再分别取出它的各位、十位、百位。
②减法:写一个减法程序,用调用LPM的方法制成一个模块,在分别取出它的各位、十位和符号位。
③乘法:直接调用内部LPM,制成乘法模块。
④除法:直接调用内部LPM,制成除法模块。
加减乘除运算的选择:写一个4路选择器,分别选择加减乘除。
对输出结果的处理:写一个程序,对应不同选择下的不同输出,注意位数(加法:输出在0~198之间,需3个LED灯来显示;减法:输出在0~99之间,需3个LED灯(其中一个符号位);乘法:输出在0~9801之间,需4个LED灯;除法:输出在0~99之间,需2个LED灯。
实验二实现多字节加(减)法一、 实验目的:a)熟悉单片机指令系统,b)学会用汇编语言编写计算程序二、 实验内容:(一)实验要求:正确建立工程文件、编写程序,会利用keil进行程序调试并观察运行结果。
z基本要求:编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相加,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和222222H。
z提高要求:将基本要求中的“相加”改成“减法”,其它要求与基本要求相同,数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和223344H。
编写相应的程序并给予适当的注释。
(二)实验基本步骤:1.打开Keil,新建工程:Project/New Project,输入工程名,并保存2.选项选择器件:Atmel 的89C513.新建程序文本,并另存为该文件为汇编文件格式: (1)“File/New”,(2) File/Save As/键入欲使用的文件名及后缀名,即“文件名.asm”。
再单击“保存”4.添加该文件该工程:回到编辑界面后,单击“Target 1”前面的“+”号,然后在“SourceGroup 1”上单击右键,单击“Add File to Group ‘Source Group 1’”选择刚才新建的汇编文件。
5.在keil的汇编文件中输入程序代码,并编译,调试。
(1)写完代码后单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),编译成功后(0个errors),(每次修改程序后都要重新编译下,才能生效)。
(2)再单击“Debug”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快捷键Ctrl+F5),点击RUN进行运行,或者按F11进行单步运行。
中国矿业大学计算机科学与技术学院硬件课程设计报告专业:计算机科学与技术班级:设计题目:简单计算器成员:指导教师:职称:2012年10月12日简单计算器目录1.设计任务与要求………………………….2. 8279可编程设置型键盘/显器介绍………1 8279特点………………………………………………………………..2 8279引脚说明……………………………………………………………3 8279结构…………………………………………………………………..4 8279的控制字………………………………………………………………3.硬件连接及初级设计说明……………1 硬件连接……………………………………………………………………2 计算功能…………………………………………………………………..3 输入功能…………………………………………………………………4 三个模块…………………………………………………………………..5 LED发光显示…………………………………………………………….4.程序流程图…………………………………1 键盘读数流程图……………………………………………………………..2 程序处理流程图……………………………………………………………..3 显示程序流程图……………………………………………………………..4 计算过程流程图………………………………………………………………5 总程序流程图………………………………………………………………..5.程序设计…………………………………..1 代码…………………………………………………………………………6.收获与会…………………………………..7.参考文献……………………………………硬件课程设计总体报告选题:电子计算器1.设计任务与要求1.1设计概况1设计人员:2设计目标:通过汇编语言编程,再利用硬件课程实验箱实现计算器功能。
包括带符号的两位数的加减乘除运算。
3主要工具:硬件课程设计实验箱(8279),HK88TE软件等。
实验三、熟悉51指令(双字节乘法)一、实验目的:1.了解MULAB指令的使用方法。
2.了解双字节乘法的程序设计方法。
二、实验设备:TDS-MD微机教学实验系统一台MP-51单片机开发系统一片三、实验重点指令:MULAB是乘法指令,其机器码A4。
该指令是将累加器A和寄存器B中的二个8位无符号整数进行相乘,16位乘积的低8位存入A中,高8位存入B中,如果乘积大于255(0FFH),即B的内容不为0时,则置位溢出标志位OV,否则OV清“0”。
进位标志位Cy总是清0。
四、实验内容:编程指南:由于MULAB指令完成的是单字节乘法,所以对于双字节乘法,首先将双字节分解为:(aX256+b)(cX256+d)的乘法形式进行计算,其积依次放在内部RAM20H起始的连续四个单元,(R2R3)=乘数,(R4R5)=被乘数。
运算算法为:acHacLadHadLbcHbcLbdHbdL其中H、L分别表示积的高8位和低8位,参考程序如下:地址机器码助记符────────────────────────────────20007A0FMOVR2,#0F20027BFFMOVR3,#FF20047C0FMOVR4,#0F20067DFFMOVR5,#FF20087823MOVR0,#23200AEBMOVA,R3200B8DF0MOVF0,R5200DA4MULAB200EF6MOV@R0,A200FE5F0MOVA,F0201118DECR02012F6MOV@R0,A2013EAMOVA,R220148DF0MOVF0,R52016A4MULAB201726ADDA,@R02018F6MOV @R0,A201918DECR0201AE5F0MOVA,F0201C3400ADDCA,#00201EF6MOV@R0,A201F08INCR02020EBMOVA,R320218CF0MOVF0,R42023A4MULAB202426ADDA,@R02025F6MOV@R0,A2026E5F0MOVA,F0202818DECR0202936ADDCA,@R0202AF6MOV@R0,A202B18DECR0202CE4CLRA202D3400ADDCA,#00202FF6MOV@R0,A2030EAMOVA,R220318CF0MOVF0,R42033A4MULAB203408INCR0203526ADDA,@R02036F6MOV@R0,A2037E5F0MOVA,F0203918DECR0203A36ADDCA,@R0203BF6MOV@R0,A203C80FESJMP203C──────────────────────────────────五、实验步骤:1.将上述程序装入开发机,并做认真检查;2.在203CH处设置断点,运行程序,在断点处检查结果;3.自己送乘数0011H和被乘数0011H,通过键盘送入R2,R3,R4,R5中,从2008开始运行程序,检查结果。
在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现、因此,学习乘法运算方法不仅有助于乘法器的设计,也有助于乘法编程。
下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。
(1)分析笔算乘法:设A=0.1101,B=0.1011,求A×B。
笔算乘法时乘积的符号由两数符号心算而得:正正得正;其数值部分的运算如下:所以A×B=+0.10001111可见,这里包含着被乘数4的多次左移,以及四个位积的相加运算。
若计算机完全模仿笔算乘法步骤,将会有两大困难:其一,将四个位积一次相加,机器难以实现;其二,乘积位数增长了一倍,这将造成器材的浪费和运算时间的增加。
为此,对笔算乘法做些改进。
(2)笔算乘法的改进:将A?B= A?0.1011=0.1A+0.001?A+0.0001?A=0.1A+0.00?A+0.001(A+0.1A)=0.1A+0.01[0?A+0.1(A+0.1A)]=0.1{A+0.1[0?A+0.1(A+0.1A)]}=2-1{A+2-1 [0?A+2-1 (A+2-1A)]}=2-1{A+2-1 [0?A+2-1 (A+2-1(A+0))]}由上式可见,两数相乘的过程,可视作加法和移位(乘2-1相当于做一位右移)两种运算,这对计算机来说是非常容易实现的。
从初始值为0开始,对上式作分步运算,则第一步:被乘数加零A+0=0.1101+0.0000=0.1101第二步:右移一位,得新的部分积2-1 (A+0)=0.01101第三步:被乘数加部分积A+2-1(A+0)=0.1101+0.01101=1.00111第四步:右移一位,得新的部分积2-1 A+2-1 (A+0)=0.100111第五步:0?A +2-1 [A+2-1 (A+0)] =0.100111第六步:2-1{0?A+2-1 [A+2-1 (A+0)]}=0.0100111第七步:A+2-1{0?A+2-1 [A+2-1 (A+0)]}=1.0001111第八步:2-1 {A+2-1[0?A+2-1 (A+2-1 (A+0))]}=0.10001111上述运算过程可归纳为:①乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。
两位计算器设计报告一、实验任务:1.利用单片机控制来制作一个按键计算器2.开机时,显示“0000”3.单片机能对按键进行识别并处理相对应的键4.要能够计算两位数的加、减、乘、除。
5.单片机对计得的数值要能进行数码显示。
二、思路:由于此计算器最重要的是软件部分,所以我们一开始先把程序编出来,然后用仿真软件进行仿真,在软件上仿真成功后,再在硬件上调试,这样避免在硬件上试程序时,损坏硬件。
数码管选用共阴,因为不需要再接驱动。
三、硬件及仿真1、系统板上硬件连线:1).把“单片机系统“区域中的P1.0-P1.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上;2). 把74LS164作为8位LED的段码输出口,用P3.3-3.6作为4位数码显示的位选;2、硬件制作过程:我们一开始使用protel99绘制了PCB图,由于电路元件不多,连线也不是很复杂,于是采用了手工布线,手工布线比较工整,做出的PCB板也比较美观。
其PCB板如图:3、仿真:在这次制作过程中,我们用软件对程序进行了改革,先在仿真软件上仿真、调试,成功后再把程序写入单片机中,进行显示。
仿真软件原理图如下:三、原理介绍及电路原理图:利用AT89S51单片机来制作一个按键计数器,在AT89S51单片机的P1。
0-1。
7处接上16个按键,作为0-9及等于号、清零、加、减、乘、除等的输入键。
用单片机的P3.3-P2.6接一个共阴数码管,作为两位计算数的结果的显示。
用单片机的P3.0、P3.1接一个74LS164来扩展并行IO口,作为数码管串行输入并行输出的移位寄存器,以节约单片机资源。
将数从键盘读入后送到数码管后从低位至高位从右到左显示出来.电路原理图如下:四、相关程序设计内容1).行列式键盘输入及按键功能设定;2).动态数码显示;3).数码显示方式处理;4).加、减、乘、除的计算及结果的显示;五、程序的流程图如下:六、程序ORG 0000HLJMP MAINORG 0100HMAIN: MOV R1,#40HMAIN1: SETB P3.3 ;送数并显示SETB P3.4SETB P3.5CLR P3.6MOV R0,#50HLCALL XSSETB P3.3SETB P3.4CLR P3.5SETB P3.6INC R0LCALL XSSETB P3.3CLR P3.4SETB P3.5SETB P3.6INC R0LCALL XSCLR P3.3SETB P3.4SETB P3.5SETB P3.6INC R0LCALL XSDELAY1: MOV P1,#11101111B ;扫描MOV A,P1ANL A,#0FHORL A,#11100000BCPL ACJNE A,#00010000B,JJDELAY2: MOV P1,#11011111B MOV A,P1ANL A,#0FHORL A,#11010000BCPL ACJNE A,#00100000B,JJDELAY3: MOV P1,#10111111BMOV A,P1ANL A,#0FHORL A,#10110000BCPL ACJNE A,#01000000B,JJDELAY4: MOV P1,#01111111BMOV A,P1ANL A,#0FHORL A,#01110000BCPL ACJNE A,#10000000B,JJLJMP MAIN1JJ: LCALL YS2;按键去抖CJNE A,#10000001B,TT1;除LJMP TT6TT1: CJNE A,#01000001B,TT2;乘LJMP TT6TT2: CJNE A,#00100001B,TT3;减LJMP TT6TT3: CJNE A,#00010001B,TT4;加LJMP TT6TT4: CJNE A,#00011000B,TT5;清零LJMP CLLTT5: CJNE A,#00010010B,KEY1;等于LJMP CLLLTT6: MOV R4,AMOV R2,#99;判断按键赋值时的入口地址的标志MOV R1,#42HTT7: LJMP MAIN1KEY1: MOV B,A;扫描0-9的数字值MOV DPTR,#TABLEMOV R3,#0FFHKEY2: INC R3MOV A,R3MOVC A,@A+DPTRCJNE A,B,KEY3 ;判键码,求顺序码MOV A,R3;存并显示键值MOV @R1,ACJNE R2,#99,CCMOV 50H,42H;被运算数存值MOV 51H,#0INC R1CJNE R1,#44H,DD;执行两位的运算MOV 51H,42HMOV 50H,43HMOV R1,#42H;两位输入结束自己重新输入DD: MOV 62H,50HMOV 63H,51HLCALL YS1LJMP MAIN1CC: MOV 50H,40H;运算数存值MOV 51H,#0INC R1CJNE R1,#42H,BBMOV 51H,40HMOV 50H,41HMOV R1,#40H;两位输入结束自己重新输入BB: MOV 60H,50HMOV 61H,51HLCALL YS1LJMP MAIN1KEY3: CJNE A,#82H,KEY2;判是否查完LJMP MAIN1CLL:CJNE R2,#99,EE;判断是结果清零还是输入清零MOV R1,#42HLJMP FFEE: MOV R1,#40HFF: MOV 52H,#0MOV 53H,#0MOV 50H,#0MOV 51H,#0LJMP MAIN1;*******等于后的程序运算处理*********** CLLL: MOV R2,#0MOV A,R4CJNE A,#10000001B,TT11;除MOV B,#10;将两位数的除数十进制数送到78H MOV B,#10MOV A,61HMUL AB ;将两位数的除数十进制化ADD A,60HMOV 78H,A;将除数暂存在78MOV B,#10;MOV A,63HMUL AB;将两位数的被除数十进制化ADD A,62HMOV 79H,A;将被除数暂存在78MOV A,78H MOV B,79HDIV AB ;进行除法运算MOV B,#10DIV AB ;将结果分成两位MOV 50H,B;将结果分成的结果送去显示MOV 51H,A;高位LCALL LIANYSTT11: CJNE A,#01000001B,TT22;乘MOV A,60HMOV B,62HMUL ABMOV B,#10DIV AB;分离出个位和十位MOV 70H,B;个位数据暂存地址MOV 71H,A;十位数据暂存地址MOV A,61HMOV B,62HMUL AB;十位和个位相乘MOV B,#10DIV AB;分离出十位和百位MOV 72H,B;十位数据暂存地址MOV 73H,A;百位数据暂存地址MOV A,60HMOV B,63HMUL AB;个位和被乘数的十位相乘MOV B,#10DIV AB ;分离相乘结果MOV 74H,B;十位数据暂存地址MOV 75H,A;百位数据暂存地址MOV A,61HMOV B,63HMUL AB ;十位和被乘数的十位相乘MOV B,#10DIV AB ;分离相乘结果MOV 76H,B;百位数据暂存地址MOV 50H,70H ;将个位送出MOV A,71H ; 将暂存的十位进行累加ADD A,72HADD A,74HMOV B,#10DIV AB;分离相加结果MOV 51H,B ; 得到十位ADD A,73H;将暂存的百位进行累加ADD A,75HADD A,76HMOV B,#10DIV AB ;分离百位相加结果MOV 52H,B ;将百位送出ADD A,77H;累加千位MOV 53H,A ;将千位送出LCALL LIANYSTT22: CJNE A,#00100001B,TT33;减XM: MOV A,60HADD A,#10;借位SUBB A,62H;个位相减MOV B,#10DIV AB;分离出个位和十位MOV 50H,B;存个位ADD A,61H;存十位并与减数的十位相加作下一个的减数ADD A,#10DEC ASUBB A,63H;十位相减MOV B,#10DIV AB;分离出十位MOV 51H,BCJNE A,#0, LIANYS;如果为负从新运算MOV B,60HMOV 60H,62HMOV 62H,BMOV B,61HMOV 61H,63HMOV 63H,BMOV 53H,#10;53H显示为负LJMP XMTT33: CJNE A,#00010001B,TT44;加MOV A,60HADD A,62H;个位相加MOV B,#10DIV AB;分离出个位和十位MOV 50H,B;存个位MOV 51H,A;存十位MOV A,61HADD A,63HADD A,51H;十位相加MOV B,#10DIV AB;分离出十位和百位MOV 51H,BMOV 52H,AMOV 53H,#0LCALL LIANYS;实现连加运算TT44: LJMP MAIN1XS: MOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TILCALL YSRETLIANYS: LCALL YS1MOV 60H,50HMOV 61H,51HLJMP MAIN1RETYS1: MOV R5,#20D2: LCALL YSDJNZ R5,D2RETYS2: MOV R5,#26D3: MOV R7,#66LCALL YSDJNZ R7,$DJNZ R5,D3RETYS: MOV R6,#36D1: MOV R7,#66DJNZ R7, $DJNZ R6,D1RETTAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FE H,0F6H,02H;0-9及负号对应的段码表TABLE:DB 14H,28H,24H,22H,48H,44H,42H,88H,84H,82H;按键对应的码值END七、问题分析:1. 软件部分:首先是.其次是也致使进程变慢.再次是计算的结果,一位数的计算还好,没有出现大问题,都是一些需要注意的细节.到两位数时,加、减、乘、除都出现了问题,当减法出现负号时,显示总是不行,后来请教同学,仔细看书,终于可以了,可以说是松了1)开始编译时把程序的入口地址设为了1000H,造成了程序过大,后改为0100H,效果好了许多。
单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。
在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。
实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。
本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。
具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。
程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。
在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。
在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。
同时,计算器还具有清零、退格等功能,方便用户进行操作。
总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。
同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。
first_ge equ 60h ;伪指令first_shi equ 61hsecond_ge equ 62hsecond_shi equ 63hresult_ge equ 64hresult_shi equ 65hresult_bai equ 66hresult_qian equ 67hal equ 68hp_can bit 40hc_can bit 41hover bit 42horg 0000hljmp startorg 0050hstart:mov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0main: lcall xianshimov p0,#0f0hmov a,p0cjne a,#0f0h,next ;判断是否有键按下ljmp mainnext: lcall delay ;延时去斗mov p0,#0f0hmov a,p0cjne a,#0f0h,key_num ;确定有键按下ljmp mainlcall xianshikey_num:mov p0,#0f0h ;取键值mov a,p0mov 20h,amov p0,#0fhmov a,p0add a,20hmov 10h,await: mov P0,#0f0h ;等键放开mov a,P0cjne a,#0f0h,waitmov a,10hlcall displaylcall xianshiljmp main;============================== display: ;判断键值cjne a,#0eeh,next1ljmp display0next1:cjne a,#0edh,next2ljmp display1next2:cjne a,#0ebh,next3ljmp display2next3:cjne a,#0e7h,next4ljmp display3next4:cjne a,#0deh,next5ljmp display4next5:cjne a,#0ddh,next6ljmp display5next6:cjne a,#0dbh,next7ljmp display6next7:cjne a,#0d7h,next8ljmp display7next8:cjne a,#0beh,next9ljmp display8next9:cjne a,#0bdh,nextaljmp display9nexta:cjne a,#0bbh,nextbljmp displayanextb:cjne a,#0b7h,nextcljmp displaybnextc:cjne a,#7eh,nextdljmp displaycnextd:cjne a,#7dh,nexteljmp displaydnexte:cjne a,#7bh,nextfljmp displayenextf:cjne a,#77h,wrongljmp displayfwrong:ret;===================================display0: ;1jb c_can,d_0_0jb p_can,d_0_1mov first_ge,#1setb p_canretd_0_1: mov 61h , 60hmov 60h,#1retd_0_0:jb p_can,d_0_2mov second_ge,#1setb p_canretd_0_2:mov 63h , 62hmov 62h,#1retdisplay1: ;4jb c_can,d_1_0jb p_can,d_1_1mov first_ge,#4setb p_canretd_1_1: mov 61h , 60hmov 60h,#4retd_1_0:jb p_can,d_1_2mov second_ge ,#4setb p_canretd_1_2: mov 63h , 62hmov 62h,#4retdisplay2: ;7jb c_can,d_2_0jb p_can,d_2_1mov first_ge,#7setb p_canretd_2_1: mov 61h , 60hmov 60h,#7retd_2_0:jb p_can,d_2_2mov second_ge,#7setb p_canretd_2_2:mov 63h , 62hmov 62h,#7setb p_canretdisplay3: ;clrmov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0retdisplay4: ;2jb c_can,d_4_0jb p_can,d_4_1mov first_ge,#2setb p_canretd_4_1: mov 61h , 60hmov 60h,#2retd_4_0:jb p_can,d_4_2mov second_ge,#2setb p_canretd_4_2:mov 63h , 62hmov 62h,#2setb p_canretdisplay5: ;5jb c_can,d_5_0jb p_can,d_5_1mov first_ge,#5setb p_canretd_5_1: mov 61h , 60hmov 60h,#5retd_5_0: jb p_can,d_5_2mov second_ge,#5setb p_canretd_5_2:mov 63h , 62hmov 62h,#5setb p_canretdisplay6: ;8jb c_can,d_6_0jb p_can,d_6_1mov first_ge,#8setb p_canretd_6_1: mov 61h , 60hmov 60h,#8retd_6_0:jb p_can,d_6_2mov second_ge,#8setb p_canretmov 62h,#8setb p_canretdisplay7: ;0jb c_can,d_7_0jb p_can,d_7_1mov first_ge,#0setb p_canretd_7_1: mov 61h , 60hmov 60h,#0retd_7_0:jb p_can,d_7_2mov second_ge,#0setb p_canretd_7_2:mov 63h , 62hmov 62h,#0setb p_canretdisplay8: ;3jb c_can,d_8_0jb p_can,d_8_1mov first_ge,#3setb p_canretd_8_1: mov 61h , 60hmov 60h,#3retd_8_0:jb p_can,d_8_2mov second_ge,#3setb p_canretd_8_2:mov 63h , 62hmov 62h,#3setb p_canretdisplay9: ;6jb c_can,d_9_0jb p_can,d_9_1mov first_ge,#6setb p_canretmov 60h,#6retd_9_0:jb p_can,d_9_2mov second_ge,#6setb p_canretd_9_2:mov 63h , 62hmov 62h,#6setb p_canretdisplaya: ;9jb c_can,d_a_0jb p_can,d_a_1mov first_ge,#9setb p_canretd_a_1: mov 61h , 60hmov 60h,#9retd_a_0:jb p_can,d_a_2mov second_ge,#9setb p_canretd_a_2:mov 63h , 62hmov 62h,#9setb p_canretdisplayb: ;=setb overmov a,al;````````````````cjne a,#0,d_b_0 ;加法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_geadd a,45hda ajnc bai_no_addmov result_bai,#1bai_no_add:mov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````````````````d_b_0:cjne a,#1,d_b_1 ;减法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_gemov 46h,amov a,#9ah ;取补码9ahsubb a,46hadd a,45hda amov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````d_b_1:cjne a,#2,tiao ;乘法程序sjmp chengtiao:ljmp d_b_2;-----------------;十进制个位与个位相乘cheng:mov a,first_gemov b,second_gemul ab ;结果不大于81,存放于a中mov b,#10div ab ;十位数存于a,个位数存于bmov result_ge,b ;求出个位数mov 35h,a ;存十位寄35h;-----------------;个位与十位相乘mov a,first_shimov b,second_gemul abmov b,#10div abmov 36h,a ; 存百位寄存36hmov a,badd a,35hmov 35h,a ;clr csubb a,#10jc bai_no_jin_1inc 36h;如有进位,加一mov 35h,abai_no_jin_1:mov a,36hclr csubb a,#10jc qian_no_jin_1inc 37hmov 36h,aqian_no_jin_1: ;----------------------;十位与个位相乘mov a,first_gemov b,second_shimul abmov b,#10div abmov 33h,a ;结果寄放clr cmov a,badd a,35hmov 35h,a ;十位处理clr csubb a,#10jc bai_no_jin_2inc 36hmov 35h,abai_no_jin_2:mov a,33hadd a,36hmov 36h,a ;百位处理clr csubb a,#10 ;千位处理jc qian_no_jin_2inc 37hmov 36h,aqian_no_jin_2:;--------------------------;十位与十位相乘mov a,first_shimov b,second_shimul abmov b,#10div abmov 33h,aclr cmov a,badd a,36hmov 36h,aclr csubb a,#10jc qian_no_jin_3inc 37hmov 36h,aqian_no_jin_3:mov a,33hadd a,37hmov 37h,a ;--mov result_shi,35hmov result_bai,36hmov result_qian,37hret;```````````````````````````d_b_2:cjne a,#3,d_b_3 ;除法程序mov a,first_shiswap aorl a,first_gemov 45h,a ;第一个bcd码数字存放mov a,second_shiswap aorl a,second_gemov 46h,a ;第二个bcd码数字存放recom:mov a,45hclr csubb a,46hjc xiaomov a,#9ahsubb a,46hadd a,45hda amov 45h,ainc 38hjmp recomxiao:mov a,38hmov b,#10div abmov result_shi,amov result_ge,bret;d_b_3:retdisplayc: ;+mov al,#0setb c_canclr p_canretdisplayd: ;-mov al,#1setb c_canclr p_canretdisplaye: ;*mov al,#2setb c_canclr p_canretdisplayf: ;/mov al,#3setb c_canclr p_canret;========================delay:mov r7,#10loop0:mov r6,#08fhloop1:djnz r6,loop1djnz r7,loop0ret ;===================================xianshi:mov dptr,#TABjb over,over_loopjb c_can,c_loopmov a,first_ge ;显示第一个数movc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhret;-----------------------;显示第二个数c_loop:mov a,second_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,second_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhretover_loop: ;显示运算结果mov a,result_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_baimovc a,@a+dptrmov P1,amov P2,#0fbhlcall delaymov P2,#0ffhmov a,result_qianmovc a,@a+dptrmov P1,amov P2,#0f7hlcall delaymov P1,#0ffhmov P2,#0ffhretTAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4, DB 92H,82H,0F8H,80H,90H ;5,6,7,8,9,DB 88H,83H,0C6H,0A1H,86H ;A,B,C,D,E,DB 8EH;f。