单片机2位加减乘除(参考实验范例)

合集下载

运用单片机进行加减乘除法的运算

运用单片机进行加减乘除法的运算

运用单片机进行加减乘除法的运算
单片机介绍 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器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位十进制四则运算器电路

2位十进制四则运算器电路

《电子设计自动化》课程设计题目: 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进行单步运行。

8279实现的两位数加减乘除计算器实验报告

8279实现的两位数加减乘除计算器实验报告

中国矿业大学计算机科学与技术学院硬件课程设计报告专业:计算机科学与技术班级:设计题目:简单计算器成员:指导教师:职称: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指令(双字节乘法)

实验三、熟悉51指令(双字节乘法)

实验三、熟悉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液晶屏上显示结果。

同时,计算器还具有清零、退格等功能,方便用户进行操作。

总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。

同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。

单片机多字节乘除法

单片机多字节乘除法

二,用减法做除法: 用减法做除法:
例2 如何用减法做除法计算十六进制89/2=44,余1。 如何用减法做除法计算十六进制89/2=44,余1 用一个空RAM0,RAM0位与除数最多用位数相同, 用一个空RAM0,RAM0位与除数最多用位数相同, 如除数2最多用4位,如除数是88最多用8 如除数2最多用4位,如除数是88最多用8位。 有下式: RAM1=1000 1001,RAM0=0000。和为一体为 1001,RAM0=0000。和为一体为 RAM= RAM=1000 1001 0000, RAM0最后保存的数为余数, RAM0最后保存的数为余数, 8位除以8位,多字节以此类推。 位除以8
直观如下:89( 直观如下:89(1000 1001)/2。结果为44,余1。 1001)/2。结果为44,余 RAM1 RAM0,RAM0为保存余数用。 RAM0,RAM0为保存余数用。 1000 1001 0000 1,0001 0010 0001 2,0010 0100 0010 0010 0101 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 3,0100 1010 0000 4,1001 0100 0000 5,0010 1000 0001 6,0101 0000 0010 0101 0001 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 7,1010 0010 0000 8,0100 0100 0001
步骤如下:
1,左移一位到C,结果 C=1,RAM= 0110 0000 1,左移一位到C 1,RAM= 2,C=1,则RAM0+2,RAM=0110 0010 2,C=1,则RAM0+2,RAM= 3,左移一位到C,结果 C=0,RAM=1100 0100 3,左移一位到C 0,RAM= 4,C=0,则RAM不加。 4,C=0,则RAM不加。 5,左移一位到C,结果 C=1,RAM= 1000 1000 5,左移一位到C 1,RAM= 6,C=1,则RAM0+2,RAM=1000 1010 6,C=1,则RAM0+2,RAM= 7,左移一位到C,结果 C=1,RAM= 0001 0100 7,左移一位到C 1,RAM= 8,C=1,则RAM0+2,RAM=0001 0110 8,C=1,则RAM0+2,RAM=

单片机按键加减报告

单片机按键加减报告

单片机实验报告一、实验目的1、学习利用单片机设计简单加减计数,并学会定时/计数器T0/T1的使用.2、学习使用keil和proteus软件.3、熟悉汇编语言并能利用汇编语言编写程序.二、实验思路用T0、T1设计10位以内的按键加减计数:利用T0/T1计数功能实现每次按键的中断,且采用方式2,可以自动重载初值,较为方便.这里不考虑优先级的问题.再分别对T0、T1编写中断处理的程序.要注意的是,加法时, 9加1显示0的情况;减法时,0减1显示9的情况.三、实验原理〔以下不考虑T2的情况〕1、中断的概念CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理〔中断发生〕;CPU暂时中断当前的工作,转去处理事件B〔中断响应和中断服务〕;待CPU 将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A〔中断返回〕,这一过程称为中断.2、定时/计数器(1)中断控制寄存器〔TCON〕TCON的高4位用于控制定时/计数器的启动和中断申请.其格式如下:TF1<TCON.7>:T1溢出中断请求标志位.T1计数溢出时由硬件自动置TF1为1.CPU响应中断后TF1由硬件自动清0.T1工作时,CPU可随时查询TF1的状态.所以,TF1可用作查询测试的标志.TF1也可以用软件置1或清0,同硬件置1或清0的效果一样.TR1<TCON.6>:T1运行控制位.TR1置1时,T1开始工作;TR1置0时,T1停止工作.TR1由软件置1或清0.所以,用软件可控制定时/计数器的启动与停止.TF0<TCON.5>:T0溢出中断请求标志位,其功能与TF1类同.TR0<TCON.4>:T0运行控制位,其功能与TR1类同.本次试验要用到T0、T1,即TR0、TR1置1.(2)中断允许控制〔IE〕EX0<IE.0>,外部中断0允许位;ET0<IE.1>,定时/计数器T0中断允许位;EX1<IE.2>,外部中断1允许位;ET1<IE.3>,定时/计数器T1中断允许位;ES<IE.4>,串行口中断允许位;EA <IE.7>,CPU中断允许〔总允许〕位.以上都是为1时开启,为0时关闭.本次试验需要开启EA、ET1、ET0,即令IE 为8AH.(3)工作方式寄存器TMODGATE:门控位.GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作.C/T:定时/计数模式选择位.C/T=0为定时模式;C/T =1为计数模式.M1M0:工作方式设置位.定时/计数器有四种工作方式,由M1M0进行设置.这次试验需要计数模式且为方式二,所以,TMOD值设为66H.3、数码管在这里我们使用的是7SEG-COM-AN-GRN数码管,由7个发光管组成的8字形构成的,如下图所示,左边接线顺序下来分别命名为ABCDEFG数码管的接线为共阳接法,即低电平亮,高电平灭.实验中用P0.0-P0.6控制数码管的7段,P0口的八位与发光管的对应关系见下表所示.显示P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0HEX——G F E D C B A 0 0 1 0 0 0 0 0 0 40H 1 0 1 1 1 1 0 0 1 79H 2 0 0 1 0 0 1 0 0 24H 3 0 0 1 1 0 0 0 0 30H 4 0 0 0 1 1 0 0 1 19H 5 0 0 0 1 0 0 1 0 12H 6 0 0 0 0 0 0 1 0 02H 7 0 1 1 1 1 0 0 0 78H 8 0 0 0 0 0 0 0 0 00H 91118H四、设计流程N YYNYN<a>主程序 <b>中断响应 五、原理图存数寄存器初始化 中断初始化 开始 数码管显示等待中断按键扫描R0置0是否为加法R0是否为9R0是否为0R0加1R0加1 R0减1 中断返回运行后,初始如上图所示,当按一下第一个键时,数码管显示1,此后每按一次数码管显示数值加1,当数码管显示为9时,按下第一个键,显示为0;初始状态下,当按下第二个键时,数码管显示9,此后每按一次第二个键,数码管显示数值减1.说明实验成功六、汇编程序ORG 0000HJMP MAINORG 000BH //T0〔加法〕中断入口JMP T0_ADDORG 001BH //T1〔减法〕中断入口JMP T1_SUBMAIN: //主程序MOV TMOD,#66H //设置T1、T0方式2计数MOV TL1,#0FFH //为T1、T0设置初值MOV TH1,#0FFHMOV TL0,#0FFHMOV TH0,#0FFHMOV IE,#8AH //CPU、T0、T1开启中断SETB TR1 //启动T1计数器SETB TR0 //启动T0计数器MOV R0,#0 //设置显示的初始值与其地址MOV DPTR,#TABLOOP:MOV A,R0 //输出显示数值MOVC A,A+DPTRMOV P0,ASJMP LOOP //等待中断T0_ADD:CJNE R0,#9,T_END0 //是否需要进位MOV R0,#0RETIT1_SUB:CJNE R0,#0,T_END1 //是否需要借位MOV R0,#9RETIT_END0:INC R0 //加1RETIT_END1:DEC R0 //减1RETITAB: //选择0-9的输出DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18END七、小结这次实验中,我进一步加深了对单片机与其应用的了解.通过查找资料和老师的帮助,进一步熟练了对keil和proteus软件的操作.在编写程序的过程中也遇到了一些问题,一些语句的使用不够熟练,但现在对它们有了更深的记忆.在编写程序的过程中,我加深了对中断概念和对计数器工作原理的理解.同时,感受了设计程序的流程,为以后的实验积累了一定经验.。

单片机 课设 简易计算器设计(减、除)

单片机 课设  简易计算器设计(减、除)

第1章.设计原理本次课程设计我用8255完成了对开关和二极发光管的控制来实现简单计算器的运算。

首先是用开关来输入数据,然后使开关发光管的相应地亮灭。

8255接法:D0接系统的D0口;CS接系统的P27;WR接系统的WR;RD接系统的RD; A口接LED;A0A1口接系统的A0,A1;C口接开关。

设计分两大部分:减法程序和除法程序。

每一部分首先输入数据,然后由控制口控制相应的二极管发光并且延时显示一段时间,然后在数据显示时间内输入第二个数据,然后由系统控制显示,显示完毕后显示计算结果,依然延时显示一段时间。

在每次的计算之前都由系统控制将第一个数据保存,以便计算。

由此,我的程序实现了简单的减、法运算。

第2章.设计方案2.1硬件部分设计方案硬件系统是指构成微机系统的实际装置,通常是由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。

单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种拓展接口电路、外部设备等才能构成一个单片机应用系统。

2.1.1 单片机部分PC机一台,TD-NMC+实验教学系统一台。

2.1.2 输入部分采用开关控制输入,电路配置灵活,软件结构简单。

2.1.3 显示部分在单片机应用系统中,使用的显示器主要有LED(发光二极管显示器)、LCD 液晶显示亲以及CRT接口。

本实验采用8个发光二极管亮灭来表示数字。

2.2软件部分设计方案软件部分的设计思路时将整个程序划分为开关输入部分、显示部分、运算程序部分。

运算程序部分包括减、除2个子程序。

软件流程大致如下:开始,然后是进行开关输入数据,b口控制输入,然后a,b口相关,即把开关和LED二极数码发光管相关,使开关控制二极管。

接下来使输入数据延时显示一段时间,然后输入下一个数据,先保存第一个输入数据后进行算术运算。

然后延时显示结果。

程序流程图如下:开始输入被减/除数延时显示被减/除数输入减/除数延时显示减/除数保存被减/除数计算结果延时显示结果图1.1第3章系统元器件简介3.1 SST89E554RC 简介SST89E554RC 具有在系统可编程(ISP)和在应用可编程(IAP)技术,该器件是 SST 公司推出的 8 位微控制器 FlashFlex51 家族中的一员,内置仿真程序,完全取代传统的硬件仿真器和编程器。

单片机实验报告——加减法

单片机实验报告——加减法

单片机实验一一、实验目的1.学习多字节压缩BCD 码加减法运算的程序设计;2.学习单字节有符号数加减运算的程序设计。

二、实验设备统一电子开发平台三、实验要求1.编写通用4 字节压缩BCD 码的加、减法运算程序;2.编写通用单字节有符号二进制数加、减法运算程序;四、实验原理对于简单的8 位加减可以直接调用指令就可以了。

例如加法可以使用指令ADD 以及带进位加ADDC,但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。

该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。

1.多字节无符号压缩BCD 码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。

◆入口参数:R0:被加数地址指针;R1:加数地址指针;len:字节数。

◆出口参数:@R0:计算结果;rLen:计算结果字节数。

◆使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。

示例程序如下:;多字节无符号压缩BCD 码加法运算rlen data 30h; 存放计算结果字节数len data 31h; 存放相加字节数; r0 定位40h,r1 定位50h; 此处的程序的问题是前面字节的进位没有处理,; 只是对最后字节相加处理了进位ORG 0000h;ADDl: PUSH PSW ;保护标志寄存器内容CLR C ;进位位清0MOV rlen,#00H ;和的字节数先清0ADD: MOV A,@R0 ;取被加数ADD A,@R1 ;求和DA A ;十进制调整MOV @R0,A ;保存INC R0 ;地址增1INC R1INC rlen ;字节数增1DJNZ len,ADD ;所有字节未加完继续,否则向下执行JNC ADD20 ;和的最高字节无进位转ADD20MOV @R0,#01H ;和的最高字节地址内容为01HINC rlenADD20: POP PSWRETEND多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。

单片机实验-计算器

单片机实验-计算器

键盘功能示意:
四、实验代码 ORG 0000H SJMP START ORG 0030H START: CLR 00H CLR 01H CLR P3.0 MOV R7, #00H ; 按键次数计数器 LOOP: ACALL KEY CJNE R7, #01H, NEXT1 MOV R0, #30H ;存放第一个数的个位 MOV 31H, @R0 NEXT1: JB 00H,NEXT2 CJNE R7, #02H, NEXT2 MOV R0, #30H ;存放第一个数的十位 MOV A, #09H SUBB A, @R0 MOV32H,#00H ;异常处理 INC R7 JC NEXT2 DEC R7 MOV R2,31H MOV 31H, @R0 MOV 32H,R2 SETB 00H ;重来时要记得清 0 NEXT2: CJNE R7, #03H, NEXT3 MOV R0, #30H ; 存放操作数 有 “加减乘除”四 种情况 MOV 33H, @R0 NEXT3: CJNE R7, #04H, NEXT4 MOV R0, #30H ;存放第二个数的个位 MOV 34H, @R0 NEXT4: JB 01H,NEXT5 CJNE R7, #05H, NEXT5 MOV R0, #30H ;存放第二个数的十位 MOV A, #09H SUBB A, @R0 MOV 35H,#00H ;异常处理 INC R7 JC NEXT5 DEC R7 MOV R2,34H MOV 34H, @R0 MOV 35H,R2 SETB 01H ;重来时要记得清 0 NEXT5: CJNE R7, #06H, NEXT6 MOV R0, #30H ;存放操作数 等于号 0EH MOV 36H, @R0 NEXT6: LCALL DISPLAY CJNE R7, #06H, LOOP MOV R0, #36H CJNE @R0, #0EH, FU;存放开始计算的操作数 等待 等号 的键值 SJMP CK FU: DEC R7 LJMP LOOP ;开始计算 CK: MOV R7, #00H CLR 00H

单片机两数相加运算程序编写

单片机两数相加运算程序编写

单片机两数相加运算程序编写单片机是一种用于控制和操作电子设备的小型计算机芯片。

它通常用于嵌入式系统中,如家电、汽车和工业控制等领域。

单片机具有体积小、功耗低、成本低、可靠性高以及易于编程等特点,因此在各种应用中得到了广泛的应用。

在单片机中实现两个数的相加运算有多种方法。

下面我将介绍一种常见的方法,使用C语言编写。

首先,需要明确两个数的数据类型。

假设我们要相加的两个数为整数,可以选择int类型进行计算。

单片机上的整数类型通常为16位或32位,具体取决于所使用的单片机型号。

接下来,需要定义两个整数变量,并为其分配内存空间。

假设我们分别将两个数存储在变量a和变量b中。

```int a;int b;```然后,需要通过某种方式获取这两个数的值。

这可以通过外部输入设备(如按键、传感器)或通过代码直接赋值来实现。

以通过代码赋值为例,我们可以为变量a和b分别赋初值:```a=10;b=20;```接下来,我们需要定义一个变量来保存计算结果。

假设我们将结果存储在变量sum中。

```int sum;```然后,我们可以使用加法运算符将变量a和b相加,并将结果保存在变量sum中。

```sum = a + b;```最后,我们可以将计算得到的结果输出到单片机上的显示器或其他输出设备上,以便查看结果。

```display(sum);```上述代码展示了一个简化的单片机两数相加运算的程序。

在实际应用中,可能会涉及更多的变量和逻辑判断,以处理更复杂的计算和条件。

同时,还需要注意的是,不同的单片机型号和编程平台可能有不同的编程语言和指令集。

以上代码仅作为示例,具体实现可能会有所不同。

总结起来,单片机两数相加运算的程序编写包括定义变量、获取输入、进行运算和输出结果等步骤。

这里只是简单的示例,实际应用可能需要更复杂的代码逻辑和功能实现。

51单片机加减乘除程序

51单片机加减乘除程序

51单片机加减乘除程序#include //STC51单片机头文件#define uchar unsigned char#define uint unsigned intuint key;uchar code numbercode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //用于设置(共阴极)数码管的段选信号,从0~9共10个数值void delay(uint x) //延时{uchar t;while(x--) for(t=0;t<250;t++);}void display(uchar key) //数码管显示{P2=0x06; //在第7个数码管上显示个位P0=numbercode[key]|0x80;delay(10);}void display1(uchar key) //数码管显示{P2=0x00; //在第1个数码管上显示aP0=numbercode[key];delay(10);}void display2(uchar key) //数码管显示{P2=0x05; //在第6个数码管上显示十位P0=numbercode[key];delay(10);}void display3(uchar key) //数码管显示{P2=0x02; //在第3个数码管上显示b P0=numbercode[key];delay(10);}void display4(uchar key) //数码管显示{P2=0x07; //在第8个数码管上显示小数P0=numbercode[key];delay(10);}void main(){uchar key,temp,a,b;int k,k2,k1,k3,k4;while(1){P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xbe:key=0;a=1+a;if(a>9)a=0;break;case 0x7e:key=1;b=1+b;if(b>9)b=0;break; default:break;}delay(1000);}}P1=0xfd ;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0){temp=P1;if(temp==0xed){key=4;k=a+b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){k2=0; k1=k;k3=0;}} if(temp==0xdd){key=5;k=a-b;delay(1000);if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}if(k<0){P2=0x04;P0=0x40;delay(100);k2=0;k1=-k;k3=0;}} if(temp==0xbd){key=6;k=a*b; delay(1000);if(k>=10){ k2=k/10;k1=k%10;k3=0;}if((k>=0)&&(k<10)){ k2=0; k1=k;k3=0;}}if(temp==0x7d){key=7;k=a/b;k4=a%b; delay(1000);if(k<1){k1=0;k2=0;k3=(a*10)/b;}if((k>=0)&&(k<10)){k1=k;k2=0;if(k4!=0){k3=(a*10)/b;}if(k4==0){k3=0;}}}}display(k1); //个位display2(k2); //十位display1(a); //数1display3(b); //数2display4(k3);}}}。

基于单片机的整数的加减乘除运算计算器设计毕业论文

基于单片机的整数的加减乘除运算计算器设计毕业论文

基于单片机的整数的加减乘除运算计算器设计毕业论文课题基于单片机的整数的加减乘除运算计算器设计学生姓名学号专业机电一体化班级院,系, 机械与电子信息工程学院指导教师职称2014年12月12日目录摘要 (1)Abstract..................................................1 设计要求..................................................2 1方案.....................................................2 2系统和主要功能...........................................2 第一章计算器的硬件设计.................................3 1.1位数码管动态显电路........................................3 1.2 LED数码显示器...........................................4 1.3 8255接口芯片..........................................4 1.4 数码管显示模块........................................5 1.5 按键模块..............................................6 1.6 4×4矩阵键盘识别处理电路.................................7 第二章计算器的软件设计................................7 2.1 主程序流程及模块设计.....................................8 2.2 总程序模块............................................9 第三章调试结果及分析.................................10 参考文献.................................................11 附录一:总体原理图.......................................12 附录二:总程序...........................................13 致谢.. (14)摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

南邮51单片机软件实验程序2----加减法运算

南邮51单片机软件实验程序2----加减法运算

二、加减法运算1.实验目的(1)正确使用单片机的加减运算指令(2)掌握不同指令对于程序状态字的影响及程序状态字的意义、用处(3)掌握ADD,ADDC,SUBB和DA A等指令的用法(4)学习模块化程序设计方案2.实验内容(1)编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。

需考虑有进位和无进位情况。

程序入口为:加数:22H,21H,20H三字节,22H为最高位被加数:32H,31H,30H三字节,32H为最高位程序出口为:23H,22H,21H,20H四字节,23H为最高位ORG 0000HLJMP MAINORG 0030HMAIN: MOV 20H,#0f0HMOV 21H,#0F0HMOV 22H,#0FFHMOV 30H,#02MOV 31H,#09MOV 32H,#05ACALL JIAFASJMP $JIAFA:MOV R0, #20H ;加数1地址、和的地址MOV R1, #30H ;加数2地址CLR CMOV R2, #3 ;循环3次A_LOOP:MOV A, @R0 ;取ADDC A, @R1 ;加MOV @R0, A ;存INC R0INC R1DJNZ R2, A_LOOPCLR AADDC A, #0 ;得到进位MOV 23H, A ;保存RETEND(2)编写3字节二进制减法子程序,用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。

入口:被减数:52H,51H,50H,50H为最低位减数:42H,41H,40H,40H为最低位出口:差:外部数据存贮器2003H~2000H(2003H为最高位)ORG 0000HLJMP MAINORG 0030HMAIN:MOV 50H,#02MOV 51H,#09MOV 52H,#05MOV 40H,#30HMOV 41H,#30HMOV 42H,#30HACALL JIANFASJMP $JIANFA:MOV DPTR,#2000HMOV R0, #50H ;被减数地址MOV R1, #40H ;减数地址CLR CMOV R2, #3 ;循环3次A_LOOP:MOV A, @R0 ;取SUBB A, @R1 ;减MOVX @DPTR, A ;存INC R0INC R1INC DPTRDJNZ R2, A_LOOPCLR ASUBB A, #0 ;得到借位MOV DPTR,#2003HMOVX @DPTR, A ;保存RETEND(3)编写10位十进制加法子程序(十进制数采用压缩BCD码存放)入口:加数:24H-20H,低地址放低字节被加数: 29H-25H,低地址放低字节要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档