课程设计报告之收银机.doc_第1页
课程设计报告之收银机.doc_第2页
课程设计报告之收银机.doc_第3页
课程设计报告之收银机.doc_第4页
课程设计报告之收银机.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海电力学院微处理器综合设计实践报告题目: 收银机的设计 院系: 计算机与信息工程学院 专业: 电子科学与技术 年级 2008级 姓名: 钱阿权 学号: 20082677 指导老师: 杨芳 阮颖 一、课程设计目的: 综合应用所学的微处理器原理,汇编语言及相关硬件知识,设计一个具有一定功能的电路。熟练掌握仿真器和编程器的使用。二、课程设计要求: 要求:以单片机为核心器件,组成一个收银机系统,能通过44键盘的“0”“9”键实现商品单价和商品数量的输入,“A”、“B”、“C”、“D”键作为功能键,完成“”、“”、“”和清零的功能,并通过LED显示结果。三、系统组成与工作原理: 1、电路原理图 本电路原理图由基本的单片机系统组成,其中P1口与4*4键盘相连,行线与P1.0P1.3相连,列线与P1.4P1.7相连;P0口分别与七段数码管的字线a,b,c,d,e,f,g,ph相连,P0口作为输出口时外接上拉电阻;P2.0P2.3分别控制七段数码管的位线ABCD,每根线上加三极管作为驱动;P2.7控制一个蜂鸣器;最小系统包括晶振,上电自动复位电路,电源等。 2、工作原理课程设计的基本要求是要通过键盘输入商品单价和数量,运算出结果并显示到七段数码管上。以此要求,本程序应该主要包括三个方面:键盘输入单元、逻辑运算单元以及结果显示单元。总体流程图如下:开始程序初始化键盘扫描逻辑运算结果显示单片机上电初始化之后始终处于键盘扫描,将扫描到的信息进行处理并将处理结果通过七段数码管显示出来的循环之中。下面来分析各个模块的功能实现以及其中注意的问题:1、 键盘扫描 本设计使用的是一个4*4的矩阵式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4*4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。下图是矩阵键盘的电路图,行线接P1.0P1.3,列线接P1.4P1.7。P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0当某一个按键按下时,该键所在的行与列相连,也就是在读取该键所在行的状态时就是该列的状态,读取该键所在列的状态时就是该行的状态,以此原理可以设计出键盘扫描程序,并得到各个按键的特征编码。先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态;再从P1口的高四位输出高电平,低四位输出低电平,从P1口的高四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。各数字特征编码如下:其余ABCD*#特征码分别是7EH,7DH,7BH,77H,B7H,E7H。未有键按下的特征码是FFH,部分扫描子程序如下:MOV P1,#0FHMOV A,P1ANL A,#0FHMOV B,AMOV P1,#0F0HMOV A,P1ANL A,#0F0HORL A,BYNNYYYNYYYNN扫描子程序开始键按下?清零?+?=?*?#?清零子程序主程序乘号判定#判定加号判定*判定等号判定存储操作数NN最终累加器A中存储的是扫描到的特征码,随后可以通过建表查表的方式得到具体按键值。扫描程序的流程图如下:扫描子程序的流程为:先判断有无按键按下,若无则返回主程序,若有按键按下则判断是否为各功能键,若为功能键则跳转到相应的功能键子程序完成相应功能,最终返回主程序。若非功能键则通过查表方式得到相应的数字,存储后转到主程序。2、 结果显示本设计运算的结果是通过四个七段数码管来显示,为了节省单片机的I/O口,采用了动态显示的方法。数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。需要显示的运算结果会分别存在千位单元QW,百位单元BW,十位单元SW以及个位单元GW,因此结果显示子程序只需要读取各单元的内容,转换成七段数码管的特征码输出即可。其流程图可表示如下:结果显示子程序取数查表转换为特征码赋P0口移至下一位延时5MS显示完成?主程序YN七段数码管的各特征码如下:3、 逻辑运算本设计最重要的就是中间的逻辑运算部分。收银机主要会是以两种运算进行,第一是乘法,第二是加法。其中乘法用来计算单价乘以数量,加法用来表示各个商品的总价格的和。这样就会有两种类型的公式:一种是A*B+C*D+,另一种是当数量为1的时候A*B+C+D。所以在各个功能键的子程序中需要判断上一次按下的功能键。例如A*B+C*D+,当按下D后面的加号的时候要判断上一次的符号,若是乘法则直接相乘并与第一次相乘得到的结果相加得出最终结果,若是加法则将前两个数相加。本设计中使用了三个操作数存储单元,分别是X,Y,Z。流程图如下:程序初始化功能键判定上次+?上次+?上次?Z标识有效?设置Z标识存储符号主程序XY*Z+XXX*YXX+Y*+/=清零YNNYYYNN4、 各子模块具体的子模块又分为加法子程序,乘法子程序,错误处理子程序,延时子程序,显示器中间清零子程序等。加法子程序:加法就是将第一操作数X(高八位为XX)与第二操作数Y(高八位为YY)相加,并将结果高位存至XX,低位存到X,注意将YY清零。再将结果的每一位依次存至QW、BW、SW、GW。这里需要注意的地方是存储的操作数以及显示数据均为BCD码,在进行加法指令之后需要调用十进制转换指令DA来进行调整。乘法子程序:乘法有两种情况,一种是X与Y相乘,另一种是Y与Z相乘,不管是哪种情况,具体的思路都是一样的。由于存储的操作数都是以BCD码的形式存储的,所以在使用乘法指令MUL之前,需要将BCD码均转化成等值的十六进制数,因此此处会有BCDH的子程序。将转化完成的数相乘之后,需要将十六进制结果转换成能够显示并存储的BCD码,因此此处会有HBCD的子程序。若是X*Y则将结果的高位存至XX,低位存到X;若是Y*Z则将结果的高位存至YY,低位存到Y。再将结果的每一位依次存至QW、BW、SW、GW。错误处理子程序:当输出的结果超过9999时就会发生溢出错误。因为每次最大的乘法是99*99=9801(本程序设计的是操作数最多是两位数)未溢出,所以只有加法才会出现溢出的情况,当发生溢出时,七段数码管显示“EEEE”,并且蜂鸣器报警,此时只有按下“清零”才能继续工作。显示器中间清零子程序:在每次输入数据的时候,显示器会实时显示对应的数字,但是在按下符号键之后输入另一个数据的时候,需要将原先显示的数据进行清零操作以实时显示另一数据的输入,因此也就有了中间清零的子程序。该程序只在下一操作数按下时执行。5、 数据存储单元的设置及说明ZANCUN EQU 25H;暂存输入数据GW EQU 30H;输出显示的个位SW EQU 31H;输出显示的十位BW EQU 32H;输出显示的百位QW EQU 33H;输出显示的千位FLAG EQU 34H;判断是否松开键盘的标识CHENG_ZANCUN EQU 35H;乘法暂存BCDH_ZANCUN EQU 36H;BCD码转16进制暂存DISPH EQU 37H;暂存输出显示的高八位DISPL EQU 38H;暂存输出显示的低八位ERROR_FLAG EQU 39H;错误标识位X1 EQU 40H;第一操作数的第一位输入X2 EQU 41H;第一操作数的第二位输入X EQU 42H;第一操作数的结果Y1 EQU 43H;第二操作数的第一位输入Y2 EQU 44H;第二操作数的第二位输入Y EQU 45H;第二操作数的结果Z1 EQU 46H;第三操作数的第一位输入Z2 EQU 47H;第三操作数的第二位输入Z EQU 48H;第三操作数的结果XX EQU 49H;第一操作数运算过程中产生的进位YY EQU 4AH;第二操作数运算过程中产生的进位需要具体说明的标识如下: FLAG:判断是否松开键盘的标识。其原理是在初始化程序中将其置1以保证在第一次正确扫描。在主程序循环中,当无按键按下时将其置1,有按键按下后将其置0。在每次扫描按键之后会判断FLAG中的值,若为0则表示按键按下后没有松开,输入无效,不执行数据存储,功能键判断等操作,直接返回主程序;若为1则表示中间有检测到松开键盘,输入有效,执行数据存数,功能键判断等操作。 ERROR_FLAG:错误标识位。初始化程序中将其置0,在发生溢出的情况下将其置1,在每一次扫描键盘后有一个判定,若ERROR_FLAG为0,则程序继续执行,若ERROR_FLAG为1则只判断扫描的特征码是否为“清零”的特征码,若是则转至清零程序,若不是则直接返回主程序。 X1,X2,Y1,Y2,Z1,Z2:三组分别是X,Y,Z的第一位输入和第二位输入。以操作数X为例,当输入的是第一位时,即R2=1时,将ZANCUN单元(扫描到的数据存在ZANCUN单元)中的值给X1以及X;若有第二位输入,即R2=2时,将ZANCUN单元中的值给X2,此时X1中的值代表的是十位上的数,X2中的值代表的是个位上的数,因此需要将X1乘以10H并加上X2,结果存至X。R2、R3、R4:分别用来对操作数X,Y,Z的计数。本设计中操作数最高为两位数,因此需要设置这样的标识来判断输入数目的个数。这三个寄存器在初始化程序均清零。以操作数X的输入为例,当输入第一位的时候,R2=1,当输入第二位的时候,R2=2;当再有连续的数据输入即R22时,程序选择忽略。这些标志位在有功能键按下后进行清零。R5:R5用来存储符号,若按下“+”则将其置1;若按下“*”则将其置2;在初始化,按下“=”及“清零”时将其置0。R6:R6用来标识乘号所在的位置,即标识是否等待第三操作数。R5、R6的状态将影响到操作数的存储,当R5=0时,则说明还没有符号被按下过,操作数存至X;当R5=1时,则说明上一次按下的符号是“+”,操作数存至Y;当R5=2时,则说明上一次按下的符号是“*”,此时需要检测“*”前面的符号,当R6=1时,则说明前面是“+”,需要等待第三操作数Z的输入,此时操作数存至Z;当R6=0时,则说明前面没有符号,此时操作数存至Y。四、总结1、电路设计过程中的问题及解决。在电路设计过程中,由于硬件电路主要以单片机最小系统的基础上进行的外扩,所以基本电路的搭建没有什么大的问题。在此过程中,又重新熟悉了DXP 2004软件,比如说基本的工程项目的建立,原理图的建立以及元件库的建立等等。电路设计过程中比较重要的是电阻大小的选择以及七段数码管的公共段是阳极还是阴极的测定。2、 面包板搭建过程中的问题及解决。在搭建面包板的过程中,我遇到的第一个问题就是面包板上各行各列的关系,这个问题最终用万用表简单地搞定了;第二个问题就是各个部分在板子上的分布状况,只有合理地分配才能搭建出正确而又紧凑的电路。刚拿到板子的时候都不知道单片机该怎么摆,但只要稍微注意下面包板的结构再思考一下就知道该怎么放了,在电路的搭建过程中学到了很多的技巧,虽然在电路图上只是一根线简单地接到另一根线,但在面包板上却可以很灵活地变通。遇到的一个比较大的问题是限流电阻与三极管的位置摆放,特别是电阻,若横着摆放会浪费很大的空间,但只要类比一下单片机的摆法就能很紧凑地将电阻摆出来了。3、 软件编写过程中的问题及解决。软件的编写我是分模块编写,分模块编写在编写之前需要划分具体模块,并设置统一的数据存储位以及标识位。要编写软件,首先要解决的问题就是要了解各个硬件的原理。本设计中在编写软件之前,我详细了解了4*4矩阵键盘以及七段数码管的基本工作原理以及常用工作方法。其中4*4矩阵键盘在学习单片机课程中遇到过,不过在课程中是不断给行线高电平再分别检测列线的方法,这种方法需要在行线上接高电平,而本设计中用到的矩阵键盘是只有四行四列线,根本没有多余的行线接口用来接高电平。这个问题纠缠了我很久,但是在多种途径的资料查阅之后,我发现不需要外接高电平就能检测出具体的按键,这种方法就是先给端口赋值,然后再读端口的值,若有按键按下,则端口的值会发生变化,然而每一个键的变化都是不一样的,这样就会产生各个按键的特征码,以此方式来进行键盘扫描程序的设计,程序简短许多而且更容易理解。其次是动态显示的设计,开始的时候我在怀疑每一次只是分别显示四位,显示完成了之后不就应该灭了么,后来到了真正仿真的时候通过改变延时时间的长短我很直观清楚地了解到了动态显示的意义。在编写过程之前,总体流程以及各部分流程需要设计一下,比较麻烦的就是功能键的判断程序,标志位的增多,逻辑的运算,以及与其他模块之间的关系等都会让人感到心烦,思考到一半可能就会扯到其他可能性上去,不过静下心来仔细推敲之后,各个部分的逻辑也没有非常复杂。我在自己编译的时候出现的问题都是些小问题,比如说0写成了O之类的。其实开始写程序的时候考虑地也不是非常周全,很多子程序是针对仿真过程中出现的问题才添加上去的。4、 所采用的软硬件调试方法,调试过程中出现的问题及解决。本次设计中,我出现问题最多的地方就是软硬件的调试尤其是软件部分的调试,整个仿真过程我利用了三天才仿真出理想的结果。第一个问题是按下键盘上的一个数,显示屏上显示两位,即程序判断我按下了两次,按下功能键会发生乱码的情况,为解决这个问题,我设置了标志位FLAG;第二个比较严重的问题是在调用子程序后没有保存现场,从而导致了许多莫名的错误,个人觉得这个问题在模块化编写程序的时候尤为重要,同时要检测出这个问题也比较麻烦,需要单步跟踪,设置断点等来仔细考察,检测这个问题浪费了我很多的时间,我也感觉到养成良好的编程习惯的重要性了;第三个问题是在显示第二个操作数的时候会同时显示第一个操作数的部分内容,为解决这个问题,我添加了显示中间清零子程序,用于在第二操作数来临时进行清零的功能;第四个问题是发生溢出错误后仍然可以继续扫描键盘进行输入操作,对于这个问题我设置了ERROR_FLAG标志位。5、 从本次课程设计中得到的体会。从本次课程设计中,我了解到了微处理器设计的基本流程,并亲手完成了这一流程,对此,我深有感触。在书本上面只知道有最小系统,也知道最小系统的基本构成有哪些,但是当第一天发下那么多元器件的时候我完全不知道从何下手,也不知道这些元器件都是用在什么地方的(特别是电阻电容及三极管),但是通过自己的资料查阅及实际动手操作,我对这些元器件的功能及测量方法都有了深刻的了解,同时也对单片机最小系统有了更实际更深刻的认识。在面包板的搭建过程中,我不是非常清楚面包板的结构,结果我就去问老师,老师说自己拿万用表去测,这一句话真的让我回想很多,我总是一旦有了问题就只知道去问老师而完全没有利用手边的工具自己去解决问题的意识,我觉得这是非常不好的一个习惯,因此在后面的设计过程中我一旦遇到了问题首先是问自己怎么解决而不是去问老师或者其他同学,这个新的意识让我思考了更多的问题也解决了更多了问题,受益匪浅。仿真部分是我遇到问题最多的部分,同时也是我收获最多的部分,只有不断遇到问题并不断解决问题,这样才能有进步,在每次仿真之后我都会对程序进行一定的优化,并加上必要的注解,这样在不管是在检查还是在修改的时候都能立刻知道这部分的内容,非常方便,应该要把这个习惯好好保持。五、附程序清单ORG 0000HLJMP MAINORG 0050HMAIN:ZANCUN EQU 25H;暂存输入数据GW EQU 30H;输出显示的个位SW EQU 31H;输出显示的十位BW EQU 32H;输出显示的百位QW EQU 33H;输出显示的千位FLAG EQU 34H;判断是否松开键盘的标识CHENG_ZANCUN EQU 35H;乘法暂存BCDH_ZANCUN EQU 36H;BCD码转16进制暂存DISPH EQU 37H;暂存输出显示的高八位DISPL EQU 38H;暂存输出显示的低八位ERROR_FLAG EQU 39H;错误标识位X1 EQU 40H;第一操作数的第一位输入X2 EQU 41H;第一操作数的第二位输入X EQU 42H;第一操作数的结果Y1 EQU 43H;第二操作数的第一位输入Y2 EQU 44H;第二操作数的第二位输入Y EQU 45H;第二操作数的结果Z1 EQU 46H;第三操作数的第一位输入Z2 EQU 47H;第三操作数的第二位输入Z EQU 48H;第三操作数的结果XX EQU 49H;第一操作数运算过程中产生的进位YY EQU 4AH;第二操作数运算过程中产生的进位;-初始化-MOV SP,#60HCLR AMOV P2,#0FFHMOV GW,AMOV SW,AMOV BW,AMOV QW,AMOV R0,AMOV R1,AMOV R2,AMOV R3,AMOV R4,AMOV R5,AMOV R6,AMOV R7,AMOV X,AMOV Y,AMOV Z,AMOV X1,AMOV X2,AMOV Y1,AMOV Y2,AMOV Z1,AMOV Z2,AMOV XX,AMOV YY,AMOV FLAG,#01HMOV ERROR_FLAG,A;-主程序循环-LOOP:LCALL KEY_SCANLCALL LED_DISPLAYSJMP LOOP;-键盘扫描-KEY_SCAN:MOV P1,#0FHMOV A,P1ANL A,#0FHMOV B,AMOV P1,#0F0HMOV A,P1ANL A,#0F0HORL A,BMOV R0,ERROR_FLAGCJNE R0,#00H,ERROR_NEXT;-判断有无错误-CJNE A,#0FFH,YS1MOV FLAG,#01HRETERROR_NEXT:;-发生错误时只扫描键盘的清零键是否按下-CJNE A,#77H,ERROR_EXITLCALL CEERROR_EXIT:RETYS1:MOV R0,FLAG CJNE R0,#01H,KEY_EXIT CJNE A,#77H,YS2 LCALL CE;转清零YS2:CJNE A,#7DH,YS3 LCALL CHENG;转乘号判定 MOV FLAG,#00H RETYS3:CJNE A,#7EH,YS4 LCALL JIA;转加号判定 MOV FLAG,#00H RETYS4:CJNE A,#7BH,YS5 LCALL DENG;转等号判定 MOV FLAG,#00H RETYS5:CJNE A,#0B7H,YS6 LCALL XING;转星号子程序 MOV FLAG,#00H RETYS6:CJNE A,#0E7H,KEY_IN LCALL JING;转井号子程序 MOV FLAG,#00H RETKEY_IN: MOV R0,#0FFH MOV 26H,A MOV DPTR,#KEY_TABKEY_IN1: INC R0 MOV A,R0 MOVC A,A+DPTR CJNE A,26H,KEY_IN2 MOV ZANCUN,R0 LCALL QINGLING;-有新数据输入,显示器清零- LCALL CZS SJMP KEY_EXITKEY_IN2: JNZ KEY_IN1KEY_EXIT: MOV FLAG,#00H RET;-操作数存储-CZS:CJNE R5,#00H,CZS2CZS1:INC R2;-输入两位数的情况-CLR CCJNE R2,#02H,LLMOV SW,X1MOV X2,ZANCUNMOV GW,X2MOV A,X1;-拼成压缩BCD码-MOV B,#10HMUL ABADD A,X2MOV X,ARETLL:JNC CZS1_EXIT;-输入一位数的情况- MOV X1,ZANCUN MOV GW,X1 MOV X,X1 RETCZS1_EXIT: MOV R2,#02H;-R2保证输入的最多是两位数- RETCZS2:CJNE R6,#00H,CZS3INC R3CLR CCJNE R3,#02H,MMMOV SW,Y1MOV Y2,ZANCUNMOV GW,Y2MOV A,Y1MOV B,#10HMUL ABADD A,Y2MOV Y,ARETMM:JNC CZS2_EXIT MOV Y1,ZANCUN MOV GW,Y1 MOV Y,Y1 RETCZS2_EXIT:MOV R3,#02H RETCZS3:INC R4CLR CCJNE R4,#02H,NNMOV SW,Z1MOV Z2,ZANCUNMOV GW,Z2MOV A,Z1MOV B,#10HMUL ABADD A,Z2MOV Z,ARETNN:JNC CZS3_EXIT MOV Z1,ZANCUN MOV GW,Z1 MOV Z,Z1 RETCZS3_EXIT: MOV R4,#02H RET;-各功能键判断-;-R5用来存储符号,加号表示为1,乘号表示为2,当等于0时表示还没有符号位按下过-;-R6用来标识乘号所在的位置,即标识是否等待第三操作数-CHENG:CJNE R5,#01H,CHENG_EXITMOV R6,#01HCHENG_EXIT:MOV R5,#02HMOV R4,#00HMOV R3,#00HRETJIA:CLR CCJNE R5,#01H,JIA1LCALL JIAFASJMP JIA_EXITJIA1:JC JIA_EXITCJNE R6,#00H,JIA2LCALL CHENGFASJMP JIA_EXITJIA2:LCALL CHENGFA1LCALL JIAFAMOV R6,#00HJIA_EXIT:MOV R5,#01HMOV R3,#00HMOV R4,#00HRETDENG:CJNE R5,#01H,DENG1LCALL JIAFASJMP DENG_EXITDENG1:JC DENG_EXITCJNE R6,#00H,DENG2LCALL CHENGFASJMP DENG_EXITDENG2:LCALL CHENGFA1LCALL JIAFADENG_EXIT:MOV R2,#00HMOV R3,#00HMOV R4,#00HMOV R5,#00HMOV R6,#00HRETCE:LJMP MAINXING:MOV GW,#0EHMOV SW,#13HMOV BW,#00HMOV QW,#10HRETJING:MOV GW,#07HMOV SW,#07HMOV BW,#06HMOV QW,#02HRET;-加法子程序-JIAFA:PUSH PSWCLR CMOV A,XADD A,YDA AMOV X,AMOV A,XXADDC A,YYDA AJNC JIAFA_NEXTLJMP ERRORJIAFA_NEXT:MOV XX,AMOV YY,#00HMOV DISPH,XXMOV DISPL,XLCALL TODISPPOP PSWRET;-乘法子程序-CHENGFA:MOV A,XLCALL BCDHMOV CHENG_ZANCUN,AMOV A,YLCALL BCDHMOV B,CHENG_ZANCUNMUL ABLCALL HBCDMOV XX,DISPHMOV X,DISPLLCALL TODISPRETCHENGFA1:MOV A,YLCALL BCDHMOV CHENG_ZANCUN,AMOV A,ZLCALL BCDHMOV B,CHENG_ZANCUNMUL ABLCALL HBCDMOV YY,DISPHMOV Y,DISPLLCALL TODISPRET;-BCD转十六进制-BCDH:PUSH PSWMOV BCDH_ZANCUN,ASWAP AANL A,#0FHMOV B,#06HMUL ABMOV B,AMOV A,BCDH_ZANCUNCLR CSUBB A,BPOP PSWRET;-十六进制转BCD-HBCD:PUSH PSWCLR RS0SETB RS1MOV R2,AMOV R3,B MOV A, R3 ANL A, #0FCH ;取高字节的高6位 RR A RR A ;除以4 MOV R5,A ;有多少个1024,放入R5, ADD A, R5 ADD A, R5 ;乘以3 MOV R7,A ;1024的个数乘以3,放入R7 MOV A, R2 ANL A, #3 ;取低字节的低2位,高6位为0 MOV R6,A ;低字节的低两位放入R6 XRL A, R3 ;高字节与低字节低2位异或,高6位为高字节的 ANL A, #3 ;高字节与低字节低2位与,高6位为0 XRL A, R2 ;低2位为高字节的低2位,高6位为低字节的高6位 RR A ; RR A ;两字节中从高字节低2位到低字节高6位的组成的一个字节 ADD A, R7 ;下面的步骤求出有多少个4 JNC L2 ;也就可以求出这么多个1024中含有的4的个数 INC R5 ;逢256个4,超过1000,1000个数加1 ADD A, #6 ;由于250X41000,多出了6个,4的个数要加上6L2: ADD A, R7 ;A中存放的是4的个数, MOV B, #25 JNC L3 INC R5 ; ADD A, #6 ;与上次加法运算的原理相同 DIV AB SJMP L4L3: DIV AB ;至此A中存放的是4的个数,除以25,也就是100的个数 CJNE A, #10, L4 INC R5 ;如果超过25X10个4,R5需加1;至此R5中存放1000的个数 CLR A ;剩余的个数不超过25L4: MOV R7,A ;100的个数入R7 MOV A, #10 XCH A, B ;余数入A,前面求出1000和100的个数,剩余的4的个数用于求十位和个位。 ADD A, #L5 ADD A,#(-$-3) MOVC A, A+PC ;依据余数取数 ADD A, R6 ;加上低两位 DA A ;十进制调整 XCH A, R5 ;十位个位放入R5,A中的是1000的个数 DIV AB ;除以10,商也就是10000的个数,余数为1000的个数 XCH A, R7 ;10000的个数放入R7,A中为100的个数 SWAP A ;100个数放高半字节 ORL A, B ;1000的个数低半字节 SWAP A ;交换 MOV R6,A ;放入R6 MOV DISPH,R6 MOV DISPL,R5 POP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论