51单片机实现4位BCD码乘法
单片机汇编4位有符号位加法
单片机汇编4位有符号位加法首先,我们需要了解有符号位加法的基本原理。
在计算机中,有符号数通常使用补码表示。
补码是一种能够同时表示负数和正数的编码方式,其计算方式如下:- 对于正数,其补码和原码相同;- 对于负数,其补码是其绝对值的原码取反后加1。
在单片机中,我们可以利用这种补码表示的特性来实现有符号位加法。
下面将介绍一种基于补码的有符号位加法实现算法。
首先,我们需要准备两个有符号数,分别表示为A和B。
这两个有符号数以补码的形式存储在内存中。
我们首先需要将这两个有符号数加载到通用寄存器中,以便进行加法运算。
接下来,我们使用通用寄存器进行加法运算。
在单片机汇编中,通用寄存器可以直接执行加法指令,因此我们不需要额外的算法实现来进行加法运算。
在加法运算完成后,我们得到了两个有符号数的和,存储在通用寄存器中。
接着,我们需要检查加法结果是否溢出。
在有符号位加法中,溢出是一个很重要的问题。
当两个有符号数相加时,可能会产生溢出,导致结果不准确。
在单片机汇编中,我们可以通过检查进位和溢出标志位来判断是否发生了溢出。
如果发生溢出,我们需要进行相应的处理,例如输出错误信息或者进行溢出处理。
最后,我们将加法结果存储回内存中,以便后续程序使用。
在存储结果时,需要注意将补码转换回原码,以确保结果的正确性。
在实际开发中,有符号位加法的实现还可能涉及其他问题,如数据类型转换、数据对齐、运算精度等。
针对这些问题,我们需要设计合理的算法和代码实现来保证程序的正确性和效率。
综上所述,实现单片机汇编4位有符号位加法需要一定的算法设计和代码实现。
只有通过合理的结构设计和精确的算法实现,才能确保有符号位加法的准确性和可靠性。
在实际开发中,我们需要充分了解有符号数的特性和补码表示法,以确保实现的正确性和稳定性。
基于单片机的四位BCD编码器电路设计
基于单片机的四位BCD编码器电路设计1 引言BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的工作,检验硬件电路的正确性,例如锁相频率合成集成电路MC145163P带有4位BCD编码接口,用于设置环路N分频器,通过本文介绍而制作完成后的BCD发生器可以提供4位BCD编码输出,方便地控制每位BCD输出,可以快速地得到BCD编码而完成测试或输出BCD编码接到集成电路的BCD编码接口,无需频繁跳线。
另外,BCD编码有8421码、2421码、余3码等多种形式,本文以常见的8421码为例介绍电路的实现和程序的编写。
如果对程序略加修改则可以很方便地实现其他类型的编码方式(如2421码)。
本电路以AT89C2051为核心设计了4×4的矩阵键盘(S0-S15),这样只需在键盘上按下相应的按键(S0-S9)即可以产生一个对应(十进制0-9)的BCD码,通过设置切换按键(S10-S13)可以随意地控制4位中任意的一位,期间用数码管实时地显示当前BCD码对应的十进制数。
电路功能和特点:4位BCD编码输出,利用单片机口线可以扩展位数。
改变软件中键号0-键号9(即S0-S9对应功能)的程序可以实现其他编码形式(如2421码)。
参见软件部分。
电路以常用的8421码为例,并有数码显示出对应的十进制数(也可以省略)。
完整的4×4的矩阵键盘扫描执行程序,可以移植到其他应用电路中。
BCD编码由锁存器实现信号锁存,并引出接口,方便连接其他电路。
“位”控制和0-9编码输出互不影响,直接按下功能键就可以得到需要的BCD 编码输出和“位数”选择。
2 电路框图电路原理图如图1所示。
3 电路分析AT89C2051的P1口组成4×4矩阵键盘(S0-S15),其中P1.0-P1.3作为行线,P1.4-P1.7作为列线,设计键盘扫描程序可以达到预先设想的功能(见软件设计部分)。
基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真
单片机原理及接口技术课程设计报告设计题目:计算器设计学号:100230205姓名:费博文指导教师:张扬信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。
是一种特殊器件,需经过专门学习方能掌握应用,应用中要设计专用的硬件和软件。
近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。
与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。
影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。
其中系统的抗干扰性能是系统可靠性的重要指标。
数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的出现可以大大解放人在设计计算过程中的工作量,使计算的精度、速度得到改善,通过msc51单片机,矩阵键盘和LED数码管可以实现简单的四位数的四则运算和显示,并当运算结果超出范围时予以报错。
注:这一部分主要描述题目的背景和意义,对设计所采取的主要方法做一下简要描述。
字数不要太多,300-500字。
另注:本文要当做模板使用,不要随意更改字体、字号、行间距等,学会使用格式刷。
文中给出的各项内容都要在大家的报告中体现,可采用填空的方式使用本模板。
1. 设计任务结合实际情况,基于AT89C51单片机设计一个计算器。
该系统应满足的功能要求为:(1) 实现简单的四位十进制数字的四则运算;(2) 按键输入数字,运算法则;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。
主要硬件设备:AT89C51单片机、LED数码管、矩阵键盘。
注:这一部分需要写明系统功能需求,用到的主要硬件(参考实验箱的说明书)。
2. 整体方案设计计算器以AT89C51单片机作为整个系统的控制核心,应用其强大的I/O功能和计算速度,构成整个计算器。
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
毕业设计(论文)-基于AT89C51单片机的简易计算器设计
计算器(Calculator)是微型电子计算机的一种特殊类型。
它与一般通用计算机的主要区别在于程序输入方式的不同。
计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。
现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。
目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。
等调试成功后,其它运算子程序的问题将迎刃而解。
引言 (1)目录 (2)1.简易计算器的设计方案 (3)1.1硬件部分设计方案 (3)1.2软件部分设计 (3)1.3 硬件设计原理图 (4)2. 简易计算器部分电路设计 (5)2.1 AT89C51常用指令 (5)2.2 显示及显示接口 (11)2.3 键盘、液晶显示的组合接口 (15)2.4 算术逻辑运算处理 (18)3.总设计电路及调试 (19)致谢 (21)参考文献 (22)1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。
51单片机指令
MCS-51共有111条指令,可分为5类:[1].数据传送类指令(共29条)[2].算数运算类指令(共24条)[3].逻辑运算及移位类指令(共24条)[4].控制转移类指令(共17条)[5].布尔变量操作类指令(共17条)一些特殊符号的意义Rn——当前选中的寄存器区的8个工作寄存器R0—R7(n=0-7)。
Ri——当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1)direct—内部数据存储单元的8位地址。
包含0—127(255)内部存储单元地址和特殊功能寄存地址。
#data—指令中的8位常数。
#data16—指令中的16位常数。
addr16—用于LCALL和LJMP指令中的16目的地地址,目的地址的空间为64kB程序存储器地址。
#addr11—用于ACALL和AJMP指令中的11目的地地址,目的地址必须放在与下条指令第一个字节同一个2kB程序存储器空间之中。
rel—8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节对于下条指令的第一个字节开始的-128——+127范围内。
@—间接寄存器寻址或基址寄存器的前缀。
/—为操作的前缀,声明对该位操作书取反。
DPTR—数据指针。
bit—内部RAM和特殊功能寄存器的直接寻址位。
A—累加器。
B—累加器B。
用于乘法和除法指令中。
C—进位标志位。
(x)—某地址单元中的内容。
((x))—由X寻址单元中的内容。
MCS-51的寻址方式[1].直接寻址指令中操作数直接以单元地址形式出现,例如:MOV A,68H这条指令的意义是把内部RAM中的68H单元中的数据内容传送到累加器A中。
值得注意的是直接寻址方式只能使用8位二进制地址,因此这种寻址方式仅限于内部RAM进行寻址。
低128位单元在指令中直接以单元地址的形式给出。
对于特殊功能寄存器可以使用其直接地址进行访问,还可以以它们的符号形式给出,只是特殊功能寄存器只能用直接寻址方式访问,而无其它方法。
单片机乘法运算(汇编)
在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现、因此,学习乘法运算方法不仅有助于乘法器的设计,也有助于乘法编程。
下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。
(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上述运算过程可归纳为:①乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。
51单片机实现的简易计算器
51单片机实现的简易计算器1. 4X4键盘输入,点阵字符型液晶显示。
2. 由于所采用的浮点程序库的限制(MCU平台只找到这个……),浮点运算采用3字节二进制补码表示,有效数字6位。
对于输入输出,采用3字节BCD码浮点数格式,有效数字只有4位,因此最终有效数字只有4位。
3. 可进行连续输入,例如:1.23+4.56*8.23/234.8 ,但是运算结果为从左到右,这也是8位简易计算器的方式。
4. 可进行错误判断,溢出、除零等错误将显示一个字符 E 。
5. 由于键盘只有16个按键,安排如下: +---------------+ | 7 | 8 | 9 | + | | 4 | 5 | 6 |- | | 1 | 2 | 3 | * | | 0 | . | = | / | +---------------+6. 按键的缺少导致取消了一些特殊函数,即开根号,三角函数(sin, cos, tan, ctg)的实现,由于这些函数在浮点程序库中均已提供,如果硬件允许,在原来的框架上添加这些附加功能是很容易的(可以看作和+, -, *, /等价的按键操作,调用不同的子程序进行运算即可)7. 按两次 = 等于清灵。
因为按键实在太少,才采用了这个做法。
8. 相应举例:按键结果说明- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --123+= 123 按下等号而没有第二个操作数,保留第一个操作数并认为此次运算结束(等号的功能)123+321/111 4.0 等价于(123+321) / 1112.3+5.4=/0.1+ 77 等号后直接按 / ,则将前面的运算结果作为第一个操作数1/0= E 错误显示 9. 不足使用3字节的浮点数表示,不可避免的带来了数表示的不精确,加上有效数字比较少,因此计算结果很容易产生误差,尤其是进行连续多次运算后,结果和精度较高的科学计算器的误差会很快达到0.01以上,当然这个差距和所测试的用例也有关系,4位有效数字导致了数字123456只能表示为123400,最后两位有效数字被摒弃了。
单片机编程题练习
乙机发送,甲机接收。
请画出电路图并写出初始化发送(查询)和接收(中断方式)程序。
2、口线P1.0接一个发光二极管,由定时器0控制,用于演示1秒钟亮、1秒钟暗的效果。
3、给80C51单片机扩展一片6116,0809和8155,要求0809采用中断方式,8通道工作;采用138译码选择芯片。
请画出系统连接图,写出各芯片的地址范围并写出8155内各口及其内部的RAM地址范围。
4、已知系统的连接如图所示,试编写程序实现下列功能:(1).编写上电显示程序,显示“123456”。
(2).编写主程序,功能为:当有键按下(0~7号)时,都显示键号;无键按下,保持原有显示状态。
5、选用DAC0832芯片产生一个三角波,要求幅值为0~2.5V。
1200bps,甲机发送数据88H(查询方式),乙机接收(中断方式)。
请画出电路图并编程实现上述功能。
7、已知一单片机应用系统如下图所示。
试回答问题并编写显示程序,以1秒为间隔,亮暗相间,显示“88888888”。
(1).写出各口的地址和控制字A口地址:B口地址:C口地址:控制口地址:控制字:(2).显示程序8、已知ADC0809单片机的连接如下图所示,试写出启动0809第3通道A/D转换的程序段。
(1)、把外部2000H内容送到内部RAM的20H单元。
(2)、找出20H~22H三个单元中的最大数,放在A累加器中。
9、编写程序完成以下功能:每响应一次外部中断,发光二极管亮一秒钟。
六、简单编程题:(1)、用间接寻址方式,把外部20H内容送到内部RAM的20H单元。
(2)、依据第四题接线图,写出启动0809第3通道A/D转换的程序段。
(3)、编写串行口方式1串行发送初始化程序。
(省略波特率发生器初始化)。
10、假定甲乙机以方式1进行串行数据通信,晶振=6MHz,要求波特率为1200。
甲机发送,乙机接收。
请画出电路图并计算出波特率,写出初始化发送和接收程序。
11、当系统选用12MHz晶体振荡器时,由定时器0控制产生周期为4ms(脉冲宽度为2ms)的方波序列(采用中断方式),并由P1.0输出,请编写实验程序。
第4章 MCS-51单片机汇编语言程序设计(2)
XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1
基于51单片机的LED电子时钟的设计与实现
基于51单片机的LED电子时钟的设计与实现刘战峰【摘要】利用AT89S52芯片为核心对电子时钟进行开发,实现日期、时间、定时闹铃、环境温度以及温度报警等功能,详细对软件编程流程进行说明.采用单片机技术为核心,4位数码管进行显示,使用时钟日历芯片完成时钟、日历的基本功能,同时利用温度传感器测量环境温度.利用这种方法实现的优点是电路简单、编程容易,而且温度和时间的精确度高.【期刊名称】《山西电子技术》【年(卷),期】2018(000)006【总页数】5页(P56-59,96)【关键词】单片机;电子时钟;AT89S52;环境温度【作者】刘战峰【作者单位】太原科技大学,山西太原030024【正文语种】中文【中图分类】TP311.1电子时钟是一种应用数字电路技术实现计时的装置,主要基于51单片机,通过延时程序产生一定的中断,用于一秒的计时,采用满60秒,分钟进一,秒清零,满六十分,时进一,分清零,满二十四小时,时清零,从而达到计时的功能。
单片机技术已经深入到国民经济的各个领域,几乎每一个智能产品都集成了至少一片单片机,对每个行业的技术改造和产品更新换代起到了非常重要的作用[1]。
数字式电子时钟采用集成电路,通过译码编译,数码管显示来实现计时功能,代替了指针机械式转动显示,减小了计时误差,提升了时钟的精准度,而且我们可以对时、分进行校对,片选的灵活度高。
在51单片机应用系统中,通过时钟芯片设计的时钟不仅时间精度高,而且还易控制,适用于精度要求高的场合[2];电子时钟拥有体积小、功能多、实时性好、可扩展性强等优点,受到人们的高度青睐,被广泛地应用于生活和工作中。
本文主要介绍通过DS1302时钟芯片实现电子时钟的设计,本设计由硬件电路设计和C语言软件设计两部分组成,其中硬件设计以AT89S52单片机为核心,加上电源、数码管、温度检测器、蜂鸣器为辅助电路,构成一个简单的数字时钟系统。
1 系统总体设计本设计利用AT89S52单片机设计电子时钟,由LED四位共阴极数码管[3]显示时钟的日期、小时和分钟,周围的LED灯轮显实现秒的显示,温度检测器控制温度,蜂鸣器实现闹铃功能,用功能键(MODE)、加法键(PLUS)、复位键(REST)进行时间的调整和闹钟温度的设置。
51单片机4×4矩阵按键程序汇编
51单片机4×4矩阵按键程序(汇编)ORG 0000HLJMP MAIN ;跳转至主程序ORG 0100HMAIN: LCALL KEY_INMOV P0,ALCALL DELAJMP MAIN;======================;判断有无按键,无按键直接返回;KEY_IN: MOV P1,#0F0H ;置行线为低电平,读列线状态(在高4位,无按键则全为1); MOV A,P1; ANL A,#0F0H ;屏蔽低四位; MOV B,A; MOV P1,#0FH ;置列线为低电平,读行线状态(在低4位,无按键则全为1); MOV A,P1; ANL A,#0FH; ORL A,B ;高四位与低四位重新组合; CJNE A,#0FFH,KEYSCAN ;0FFH为末按键; RET;==========================================;//=============键盘扫描程序============================================== ;KEYSCAN:KEY_IN: MOV R1,#0 ;初始化列地址MOV R3,#11110111B ;初始化扫描码LOOP:MOV A,R3RL AMOV R3,A ;保留扫描码MOV P1,A ;送扫描码MOV A,P1 ;读键盘ORL A,#0F0H ;屏蔽高四位CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作INC R1 ;列地址加1,准备扫描下一列CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列SJMP EXIT ;没有按键,退出;//=============按键判断对应位等于零,说明该行有按键按下==================NEXT31:JB ACC.0,NEXT32MOV R2,#0 ;第0行有按键SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1 ;第1行有按键SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2 ;第2行有按键SJMP NEXT5NEXT34:MOV R2,#3 ;第3行有按键NEXT5: ;计算按键地址MOV A,R1RL ARL A ;列地址乘4(每列对应4行) ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTREXIT:; MOV P1,#0FFH ;置键盘接口高电平RET;延时子程序,1s延时DEL: MOV R7,#10DEL1: MOV R6,#200DEL2: MOV R5,#248HERE: DJNZ R5,HEREDJNZ R6,DEL2DJNZ R7,DEL1RET;//=============按键名称表================================================ KEYTAB:DB 3fH ;扫描码0*****************************************DB 06H ;扫描码1 **DB 5bH ;扫描码2 I/O口 P1.0 P1.1 P1.2 P1.3 ** DB 4fH ;扫描码3 **DB 66H ;扫描码4 P1.4 0 1 2 3 **DB 6dH ;扫描码5 **DB 7dH ;扫描码6 P1.5 4 5 6 7 **DB 07H ;扫描码7 **DB 7fH ;扫描码8 P1.6 8 9 A B **DB 6fH ;扫描码9 **DB 77H ;扫描码A P1.7 C D E F **DB 7cH ;扫描码B **DB 39H ;扫描码C***************************************** DB 5eH ;扫描码DDB 79H ;扫描码EDB 71H ;扫描码FDB 00HDB 00HEND。
《单片机原理及接口技术》(第二版)余锡存著-课后习题答案
第二章51、87C51、80C51和80C31单片机的主要区别在那里?答:相同之处是:制造工艺都为CHMOS,都有128字节片内RAM、两个定时/计数器、4个8位I/O并行口,一个串行口和5个中断源。
主要区别:①89C51片内4K字节FLASHROM;②87C51片内4K字节EPROM;③80C51片内4K字节掩膜ROM;④80C31片内无程序存储器。
2.MCS-51单片机引脚有多少I/O线?它们和单片机对外的地址总线和数据总线有何关系?答:4个8位I/O并行口,一个串行口;其中P0口为外接程存和数存的地址低8位和数据总线的时分复用接口;其中P2口为外接程存和数存的地址高8位总线接口;其中P1口为真正的用户口线;其中P3口有第2功能;以上4个口线在没有专用功能时,也可以做通用I/O口线用。
3.简述8031片内RAM区地址空间的分配特点。
答:MCS-51 单片机片内RAM 为 256 字节, 地址范围为00H ~FFH, 分为两大部分: 低 128 字节(00H ~7FH )为真正的RAM 区; 高 128 字节(80H ~FFH )为特殊功能寄存器区SFR 。
在低 128 字节RAM 中, 00H ~1FH 共 32 单元是 4 个通用工作寄存器区。
每一个区有 8 个通用寄存器R0~R7。
4. MCS-51单片机由哪几个部分组成。
答:① 一个8位CPU ;② 4KB ROM or EPROM(8031无ROM);③ 128字节RAM 数据存储器;④ 21个特殊功能寄存器SFR ;⑤ 4个8位并行I/O 口,其中P0、P2为地址/数据线,可寻址64KB 程序存储器和64KB 数据存储器;⑥ 一个可编程全双工串行口;⑦ 具有5个中断源,两个优先级,嵌套中断结构;⑧ 两个16位定时器/计数器;⑨ 一个片内振荡器及时钟电路。
5. MCS-51单片机的,,EA ALE PSEN 信号各自的功能是什么?答:都是控制总线① PP V EA /:访问内部程序存储器的控制信号/编程电压输入端。
单片机双字节BCD码乘法知识讲解
单片机双字节B C D码乘法集美大学计算机工程学院实验报告课程名称单片机应用技术实验名称双字节BCD码乘法以及数据排序实验实验类型设计型姓名学号日期地点成绩教师1. 实验目的与要求1.进一步熟悉51汇编指令,掌握汇编语言的设计和调试方法。
2.设计十进制乘法程序,了解如何调用系统提供的内置数码显示,键盘输入子程序。
3.熟悉如何高效方法对数据排序2. 实验设备STAR系列实验仪、PC机、星研集成软件环境3. 实验内容1.从键盘上输入4位被乘数,乘数,实现4位十进制数的乘法,结果显示在数码管上。
2.调试状态下借助星研集成软件直接修改RAM30H-3FH的单元,数值任意,然后对其排序,检查排序结果。
4. 实验硬件电路及接线E5区:A0——A3区:A0E5区:A、B、C、D——G5区:A、B、C、D5,程序流程图6,程序源代码EXTRN CODE(DISPLAY8,GETBCDKEY)BUFFER1 DATA 30H ;键盘输入缓冲区BUFFER2 DATA 40H ;8字节显示缓冲区BUFFER3 DATA 50H ;结果地址BUFFER4 DATA 60H ;栈缓冲区ORG 0000HLJMP MAINORG 0100HMAIN:CLR PSW.1MOV R0,#BUFFER1MOV A,#04HLCALL GetBCDKeyMOV R0,#BUFFER4+3MOV A,BUFFER1LCALL DECOMPDEC R0MOV A,BUFFER1+1LCALL DECOMPMOV R0,#BUFFER4+3LCALL BCD2BMOV R6,BUFFER3 ;BUFFER3为低4位MOV R7,BUFFER3+1 ;BUFFER3+1为高4位CLR PSW.1MOV R0,#BUFFER1MOV A,#04HLCALL GetBCDKeyMOV R0,#BUFFER4+3MOV A,BUFFER1LCALL DECOMPDEC R0MOV A,BUFFER1+1LCALL DECOMPMOV R0,#BUFFER4+3LCALL BCD2BMOV R5,BUFFER3+1MOV R4,BUFFER3MOV R0,#BUFFER3LCALL MLTYMOV R3,BUFFER3MOV R2,BUFFER3+1MOV R1,BUFFER3+2MOV R0,BUFFER3+3LCALL B2BCDMOV R0,#BUFFER2+7MOV A,R4LCALL DECOMPDEC R0MOV A,R5LCALL DECOMPDEC R0MOV A,R6LCALL DECOMPDEC R0MOV A,R7LCALL DECOMPMOV R0,#BUFFER2+7CLR CMOV A,@R0SUBB A,#00JNZ SHOWMOV BUFFER2+7,#10HSHOW: MOV R0,#BUFFER2LCALL DISPLAY8SJMP $DECOMP: ;A中压缩BCD码转化成非压缩BCD码,结果存放在R0结束的两个字节,高位放H位BCD低位放L位BCDPUSH ACCSWAP AANL A,#0FHMOV @R0,APOP ACCANL A,#0FHDEC R0MOV @R0,ARETBCD2B: ;R0结束的4位BCD码转化成二进制存在BUFFER3开始的两个字节MOV BUFFER3,#00HMOV BUFFER3+1,#00HMOV R3,#4 ;四个字节LOOP: CLR CMOV A,BUFFER3RLC AMOV BUFFER3,AMOV BUFFER3+2,AMOV A,BUFFER3+1RLC AMOV BUFFER3+1,A ;结果左移一位MOV BUFFER3+3,AMOV R2,#2LOOP1: CLR CMOV A,BUFFER3RLC AMOV BUFFER3,AMOV A,BUFFER3+1RLC AMOV BUFFER3+1,A ;结果左移一位DJNZ R2,LOOP1 ;整体左移2位CLR CMOV A,BUFFER3+2 ;取移一位的值 ADD A,BUFFER3MOV BUFFER3,AMOV A,BUFFER3+3ADDC A,BUFFER3+1MOV BUFFER3+1,A ;结果*10MOV A,@R0 ;先取12的1后取2 DEC R0CLR CADD A,BUFFER3MOV BUFFER3,AMOV A,#00HADDC A,BUFFER3+1MOV BUFFER3+1,A ;结果*10+1 DJNZ R3,LOOPRETMLTY:MOV A,R6MOV B,R4MUL ABMOV @R0,AMOV R3,BMOV A,R7MOV B,R4MUL ABADD A,R3MOV R3,AMOV A,BADDC A,#00HMOV R2,AMOV A,R6MOV B,R5MUL ABADD A,R3INC R0MOV @R0,AMOV A,R2ADDC A,BMOV R2,AMOV R1,#00HJNC NEXTINC R1NEXT:MOV A,R7MOV B,R5MUL ABADD A,R2INC R0MOV @R0,AMOV A,BADDC A,R1INC R0MOV @R0,ARET;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码B2BCD: CLR AMOV R4,AMOV R5,AMOV R6,AMOV R7,AMOV B,#32LOOPB2: CLR CMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R7ADDC A,R7DA AMOV R7,AMOV A,R6ADDC A,R6DA AMOV R6,AMOV A,R5ADDC A,R5DA AMOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,ADJNZ B,LOOPB2RETEND2.冒泡排序ORG 1000HBUBBLE: MOV R0,#30HMOV R2,#64CLR 7FHDEC R2BULOOP: MOV 20H,@R0MOV A,@R0INC R0MOV 21H,@R0CJNE A,21H,LOOPLOOP: JC BUNEXTMOV @R0,20HDEC R0MOV @R0,21HINC R0SETB 7FHBUNEXT: DJNZ R2, BULOOP JB 7FH,BUBBLESJMP $END。
双字节BCD乘法单片机1
MM 大学MMMMMMM 学院实验报告课程名称单片机原理及其接口技术实验名称双字节BCD码乘法及数据排序实验实验类型设计型姓名00学号00日期00 地点00成绩教师00评语:一、实验目的1.进一步熟悉51汇编指令,掌握汇编语言的设计和调试方法。
2.设计十进制乘法和程序,了解如何通过调用系统提供的内置数码显示,键盘输入子程序。
3.熟悉如何使用高效方法对数据排序。
二、实验内容1.从键盘上输入4位被乘数、乘数,实现4位十进制的乘法,结果显示在数码管上。
其中键盘输入和数码显示可调用星研集成软件的内置函数实现,说明和参考实例见3.6节。
说明:可分步走,先省略键盘输入和数码显示,直接设定被乘数和乘数进行乘法,在验证乘法功能正确之后,在增加键盘输入和数码显示的功能。
2.调试状态下借助星研集成软件直接修改片内RAM30H~3FH单元,数值任意,然后对其冒泡排序,检查排序结果。
三、实验仪器STAR ES598PCI试验仪、PC机一台四、实验原理图A3区:JP51的p1口---G6区:LED五、设计思路1.双字节4位BCD码乘法开始初始化栈设定“先清LED再接收键盘输入”标志通过键盘获得4位十进制被乘数转换成二进制数并压栈暂存置位“接收到第一个键后,才清除LED”标志通过键盘获得4为十进制乘数转换成二进制数(R2R3)被乘数出栈(R0R1)双字节十六进制乘法子程序十六进制结果转十进制压缩BCD码转非压缩BCD码将高位0消隐显示2.冒泡排序开始初始化堆栈将待排序数组转移到内部30H开始的RAM中数据-1->R7,数据交换标志bSort=0PUSH 07H被比较数地址R0=30H比较数地址R1=R0+1DEC R7@R0>@R1?@R0与@R1互换1->bSortINC R0INC R1R7=R7-1R7=0?POP R7bSort=0?结束YNYNNY六、实验程序1.双字节4位BCD码乘法EXTRN CODE(Display8, GetBCDKey)BUFFER2 DATA 70H;8字节显示缓冲区BUFFER DATA 30HBLOCK data 50HRESULT DATA 40HF1 BIT 0D1H ;PSW.1ORG 0000HLJMP STARTORG 0100HSTART: MOV SP,#60HCLR F1 ;先清除显示,再接收键输入START1:MOV R0,#BUFFERMOV A,#4 ;按键次数LCALL GetBCDKey ;得到双字节十进制数(乘数)MOV R0,#BUFFERACALL BCD2B ;转换成二进制数MOV BLOCK,R3MOV BLOCK+1,R4SETB F1 ;接收到第一个键,才清除显示MOV R0,#BUFFERMOV A,#4 ;按键次数LCALL GetBCDKey ;得到双字节十进制数(减数)MOV R0,#BUFFERACALL BCD2BMOV BLOCK+2,R3MOV BLOCK+3,R4MOV R4,BLOCK ;四个BCD入口参数MOV R5,BLOCK+1MOV R6,BLOCK+2MOV R7,BLOCK+3MOV R0,#RESULTlCALL MLTYMOV R3,RESULTMOV R2,RESULT+1MOV R1,RESULT+2MOV R0,RESULT+3ACALL B4toD4 ;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码MOV A,R7ANL A,#0FHMOV BUFFER2,AMOV A,R7ANL A,#0F0HSWAP AMOV BUFFER2+1,AMOV A,R6ANL A,#0FHMOV BUFFER2+2,AMOV A,R6ANL A,#0F0HSWAP AMOV BUFFER2+3,AMOV A,R5ANL A,#0FHMOV BUFFER2+4,AMOV A,R5ANL A,#0F0HSWAP AMOV BUFFER2+5,AMOV A,R4ANL A,#0FHMOV BUFFER2+6,AMOV A,R4ANL A,#0F0HSWAP AMOV BUFFER2+7,AMOV R0,#BUFFER2LCALL Display8sjmp $BCD2B:MOV R1,#BUFFERMOV R2,#2S:MOV A,@R1PUSH ACCANL A,#0FHMOV R0,APOP ACCJNB ACC.4,NEXT1 ;分别判断4,5,6,7位是否为1,分别加上10,20,40,80XCH A,R0ADD A,#10XCH A,R0NEXT1:JNB ACC.5,NEXT2XCH A,R0ADD A,#20XCH A,R0NEXT2:JNB ACC.6,NEXT3XCH A,R0ADD A,#40XCH A,R0NEXT3:JNB ACC.7,NEXT4XCH A,R0ADD A,#80XCH A,R0NEXT4:MOV A,R0PUSH ACCINC R1DJNZ R2,SPOP ACCMOV R0,APOP ACCMOV B,#100 ;高2位(千位、百位)乘以100MUL ABADD A,R0MOV R3,A ;转换成的二进制数放在R4R3中MOV A,BADDC A,#0MOV R4,ARET;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码;;;;;;;;该子程序也可以模仿书上(胡汉才)例4.22,采用除以10、其余数为个位数字,其商继续除以10得十位数字,依次类推B4toD4: CLR AMOV R4,AMOV R5,AMOV R6,AMOV R7,AMOV B,#32LOOP: CLR CMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R7 ;算法举例:例如数据为0010 0100(36),则过程为ADDC A,R7 ; A R7DA A ; 0 0MOV R7,A ; 0 0MOV A,R6 ; 1 1ADDC A,R6 ; 2 2DA A ; 4 4MOV R6,A ; 9 9MOV A,R5 ; 18 18ADDC A,R5 ; 36 36DA AMOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,ADJNZ B,LOOPRETMLTY: MOV A,R6MOV B,R4MUL ABMOV @R0,AMOV R3,BMOV A,R7MOV B,R4MUL ABADD A,R3MOV R3,AMOV A,BADDC A,#00HMOV R2,AMOV A,R6MOV B,R5MUL ABADD A,R3INC R0MOV @R0,AMOV A,R2ADDC A,BMOV R2,AMOV R1,#00HJNC NXT1INC R1NXT1: MOV A,R7MOV B,R5MUL ABADD A,R2INC R0MOV @R0,AMOV A,BADDC A,R1INC R0MOV @R0,ARETend2.冒泡排序SIZE EQU 8 ;数据个数ARRAY EQU 30H ;数据起始地址CHANGE EQU 0 ;交换标志SORT: MOV R0,#ARRAYMOV R7,#SIZE-1CLR CHANGEGOON: MOV A,@R0MOV R2,AINC R0MOV B,@R0CJNE A,B,NOTEQUALSJMP NEXTNOTEQUAL:JC NEXT ;前小后大,不交换SETB CHANGE ;;前大后小,置交换标志XCH A,@R0 ;交换DEC R0XCH A,@R0INC R0NEXT:DJNZ R7,GOONJB CHANGE ,SORTSJMP $END八、实验小结1、感觉这次实验还是有难度的,BCD码转化二进制,以及二进制转化BCD码算法,还无法融会贯通。
51单片机加减乘除程序
#include<stc12c5a60s2.h> //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个数码管上显示bP0=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);}}}。
第MCS-5单片机指令系统
3.1 单片机指令系统概述
MCS-51单片机指令系统的特点: • (1)指令执行快。 • (2)指令短,约有一半的指令为单字节指令。 • (3)用一条指令即可实现2个一字节的相乘或相除。 • (4)具有丰富的位操作指令。 • (5)可直接用传送指令实现端口的输入输出操作。
;direct(A) ;direct(Rn) ;direct1(direct2) ;direct((Ri)) ;direct#data ;(Ri(A) ;(Ri)(direct) ;(Ri)data ;DPTRdata16
第 3 章 MCS - 51单片机指令系统
片内数据RAM及寄存器的数据传送指令 MOV、PUSH和POP共18条。
(2)半字节交换指令
XCHD A,@Ri SWAP A
;A0~3<=>(Ri)0~3 ;A0~3<=>A4~7
第 3 章 MCS - 51单片机指令系统
第 3 章 MCS - 51单片机指令系统
【例】 将片内RAM 30H单元与40H单元中的内容互换。
• 方法1(直接地址传 送法):
• MOV 31H,30H • MOV 30H,40H • MOV 40H,31H
INC 60H
;将地址60H单元中的内容自加1。
第 3 章 MCS - 51单片机指令系统
3. 寄存器寻址
在该寻址方式中, 参加操作的数存放在寄存器里。寄存 器包括8个工作寄存器R0~R7, 累加器A, 寄存器B、数据指 针DPTR和布尔处理器的位累加器C。 MOV A,Rn ;A(Rn) 其中n为0~7之一,
第 3 章 MCS - 51单片机指令系统
5. 这种寻址方式用于访问程序存储器中的数据表格, 它以 基址寄存器DPTR或PC的内容为基本地址, 加上变址寄存器 A的内容作为操作数的地址, 例如: MOVC A, @DPTR+A JMP @A+DPTR MOVC A, @ PC+A
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV B,#10
DIV AB ;A...B
MOV 7AH,B
MOV 7BH,A
MOV A,54H ;将54H乘51H送7CH,进位送7DH
MOV B,51H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 7CH,A
MUL AB
ADD A,6AH
DA A
MOV B,#10
DIV AB ;A...B
MOV 6AH,B
MOV 6BH,A
MOV A,56H ;将56H乘51H送6CH,进位送6DH
MOV B,51H
MUL AB
MOV R0,A
ADD A,66H
DA A
MOV B,#10
D
IV AB ;A...B
MOV 66H,B
MOV 67H,A
MOV A,56H ;将56H乘53H送68H,进位送69H
MOV 69H,A
MOV A,56H ;将56H乘52H送6AH,进位送6BH
MOV B,52H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 6AH,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MOV R0,#BUFFER2
MOV A,@R0 ;保存输入的乘数
MOV R4,A ;R4R5
INC R0
MOV A,@R0
MOV R5,A
;...........................................................
MOV 6FH,A
MOV A,55H ;将55H乘53H送70H,进位送71H
MOV B,53H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 70H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,70H
MOV 7ห้องสมุดไป่ตู้H,A
MOV A,54H ;将54H乘52H送7AH,进位送7BH
MOV B,52H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 7AH,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,7AH
MOV A,R2 ;将输入的被乘数、乘数从千位到各位依次以非压缩型BCD码形式
MOV R1,#51H ;存入50H~53H(被乘数千位—各位)、54H~57H(乘数千位—各位)
MOV @R1,#00H ; 50 51 52 53
XCHD A,@R1 ;*54 55 56 57
MOV B,53H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 68H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,68H
DA A
MOV B,#10
DIV AB ;A...B
MOV 68H,B
MOV B,53H
MUL AB ;BA
MOV R0,A
ANL A,#0FH
MOV 60H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,60H
DA A
MOV B,#10
DIV AB ;A...B
MUL AB
MOV R0,A
ANL A,#0FH
MOV 64H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,64H
DA A
MOV B,#10
DIV AB ;A...B
MOV 64H,B
MOV 65H,A
EXTRN CODE (Display8)
EXTRN CODE (GetBCDKey)
PBUFFER DATA 20H
BUFFER DATA 30H
BUFFER2 DATA 40H
FLAG DATA 10H
MOV B,51H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 74H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,74H
DA A
MOV B,#10
DIV AB ;A...B
MOV 74H,B
LCALL GetBCDKey
MOV R0,#BUFFER
MOV A,@R0 ;保存输入的被乘数
MOV R2,A ;R2R3
INC R0
MOV A,@R0
MOV R3,A
CLR PSW.1
MOV R0,#BUFFER2
MOV A,#04H
LCALL GetBCDKey
;..........................................................
MOV R7,60H ;..........................................................
MOV FLAG,#00H
MOV 60H,B
MOV 61H,A
MOV A,57H ;将57H乘52H送62H,进位送63H
MOV B,52H
MUL AB ;BA
MOV R0,A
ANL A,#0FH
MOV 62H,A
MOV B,#16
MOV A,R0
DA A
MOV B,#10
DIV AB ;A...B
MOV 76H,B
MOV 77H,A
MOV A,54H ;将
54H乘53H送78H,进位送79H
ANL A,#0FH
MOV 6CH,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,6CH
MOV B,#10
DIV AB ;A...B
MOV 6CH,B
MOV 6DH,A
MOV A,56H ;将56H乘50H送6EH,进位送6FH
MUL AB
MOV R0,A
ANL A,#0FH
MOV 7EH,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,7EH
DA A
MOV B,#10
DIV AB ;A...B
MOV 7EH,B
MOV 7FH,A ;..........................................................
SWAP A ;
MOV 50H,A ;
;
MOV A,R3 ;
MOV R1,#53H
MOV @R1,#00H
XCHD A,@R1
SWAP A
MOV 52H,A
MOV A,R4
MOV R1,#55H
MOV @R1,#00H
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,72H
DA A
MOV B,#10
DIV AB ;A...B
MOV 72H,B
MOV 73H,A
MOV A,55H ;将55H乘51H送74H,进位送75H
MOV B,53H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 78H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,78H
DA A
MOV B,#10
DIV AB ;A...B
MOV 78H,B
MOV 75H,A
MOV A,55H ;将55H乘50H送76H,进位送77H
MOV B,50H
MUL AB
MOV R0,A
ANL A,#0FH
MOV 76H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
ADD A,76H
MOV A,57H ;将57H乘50H送66H,进位送67H
MOV B,50H
MUL AB ;BA
MOV R0,A
ANL A,#0FH
MOV 66H,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV B,#16
MUL AB
PORT DATA 11H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:CLR PSW.1 ;...........................................................