06-第四章程序设计

上传人:陈** 文档编号:191953704 上传时间:2023-03-06 格式:PPTX 页数:45 大小:304.10KB
返回 下载 相关 举报
06-第四章程序设计_第1页
第1页 / 共45页
06-第四章程序设计_第2页
第2页 / 共45页
06-第四章程序设计_第3页
第3页 / 共45页
点击查看更多>>
资源描述
第四章:MCS-51程序设计计算机与通信工程学院李耀明一、汇编语言概述n1、指令系统n语句格式n:;n指令编码长短:单字节,双字节,三字节n执行周期:一个机器周期占12个振荡周期,单周期指令,双周期,4周期n寻址方式:n指令中所规定的寻找操作地址的方式n立即、直接、寄存器、寄存器间接寻址、基址加变址、相对寻址、位寻址n指令分类:n数据传送、算术、逻辑、位操作、控制转移n2、程序设计的步骤n(1)分析问题,编制说明要解决问题的程序框图。n(2)确定数据结构、算法、工作单元、变量设定(与高级语言不同)n(3)根据所用的指令系统,按照已编制的程序框图用汇编语言编制出源程序。n(4)将编制出的程序在计算机上调试,直至实现预定的功能。计算机与通信工程学院二、程序设计分类n1、顺序程序:n执行时按顺序一条条地执行指令n2、分支程序:n当程序不再顺序执行,而向一个方向或多个方向转移时,叫分支程序。n3、循环程序:n对于需要反复的程序段,常采用循环办法,以缩短程序。n4、子程序及其调用程序n主程序使用子程序时,用调用指令(ACALL),子程序最后放一条RET指令。计算机与通信工程学院三、程序设计准则n结构清晰:便于分析n层次分明:便于阅读n语言简洁:便于分析n易于理解:便于阅读计算机与通信工程学院4.1 简单程序设计n简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。计算机与通信工程学院例4-1两个8位无符号数相加nORG 0000Hn AJMP BEGINnORG 0030HnBEGIN:n MOV 40H,#01Hn MOV 41H,#02HnLOOP:n MOV R0,#40Hn MOV A,R0n INC R0n ADD A,R0n INC R0n MOV R0,An JMP LOOPn END开始R040HA(R0)A送(42H)(40H)+(41H)和送A返回图4-1 例1流程图例:将加数和被加数分别送入例:将加数和被加数分别送入40H、41H单元,加完后和送入单元,加完后和送入42H单元单元计算机与通信工程学院例4-2将两个半字节数合并成一个单字节数 n程序nORG 0000Hn AJMP startnORG 0030HnSTART:n MOV sp,#60Hn MOV 40h,#01hn MOV 41h,#02hnloop:n MOV R1,#40Hn MOV A,R1n ANL A,#0FH ;取第一个半字节n SWAP An INC R1 n XCH A,R1 ;取第二字节 n ANL A,#0FH ;取第二个半字节n ORL A,R1 ;拼字n INC R1 n MOV R1,A ;存放结果 n AJMP$n ENDn执行完后如何不改变内存和寄存器的值?开始(40H)内容送A,屏蔽高位,交换高低位A(R0)A与(R1)或后送(42H)取(41H)内容,屏蔽高位,送A返回图4-2 例2流程图计算机与通信工程学院4.2 分支程序设计n在处理实际事务中,只用简单程序设计的方法是不够的。因为大部分程序总包含有判断、比较等情况。n根据判断、比较的结果转向不同的分支计算机与通信工程学院例例4-3:两个无符号数比较大小n设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。nST1 EQU 8040HnORG 0000Hn JMP STARTnORG 0030HnSTART:n MOV DPTR,#ST1n MOV A,#12Hn MOVX DPTR,An INC DPTRn MOV A,#34Hn MOVX DPTR,AnLOOP:n CLR C ;进位位清零n MOV DPTR,#ST1 ;设数据指针n MOVX A,DPTR ;取第一数n MOV R2,A ;暂存R2n INC DPTRn MOVX A,DPTR ;取第二个数n SUBB A,R2 ;两数比较n JNC BIG1n XCH A,R2 ;第一数大nBIG0:n INC DPTRn MOVX DPTR,A ;存大数n SJMP$nBIG1:n MOVX A,DPTR;第二数大n SJMP BIG0n END 开始设置指针DPTR初始值取第一个数存入R2取第二个数后者减前者进位标志是否为0?存后者结束存前者图5-3 例4流程计算机与通信工程学院例例4-4:编制计算符号函数y=SGN(x)的程序nARE EQU 8040HnBUF EQU 8060HnORG 0000Hn JMP STARTnORG 0030HnSTART:n MOV DPTR,#AREn MOV A,#0F0Hn MOVX DPTR,AnLOOP:n MOV DPTR,#ARE ;进位位清零n MOVX A,DPTR ;取第一数n JZ SULn JB ACC.7,NEGn MOV A,#01HnSUL:n MOV DPTR,#BUFn MOVX DPTR,An JMP LOOPnNEG:n MOV A,#0FFHn SJMP SULn END 计算机与通信工程学院4.3 循环程序设计n简单程序,每条指令只执行一次n分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。n它们的特点是,每一条指令至多执行一次。n在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。n采用循环程序,使程序缩短,节省存储单元。重复次数越多,循环程序的优越性就越明显。n程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。计算机与通信工程学院循环程序组成n循环程序一般由五部分组成:n1、初始化部分:n为循环程序做准备。n如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。n2、处理部分:n为反复执行的程序段,是循环程序的实体。n3、修改部分:n每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理作准备。n4、控制部分:n根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。n通常2、3、4部分又称为循环体。n5、结束部分:n分析及存放执行结果。计算机与通信工程学院循环程序的结构n循环程序的结构一般有两种形式:n先进入处理部分,再控制循环。至少执行一次循环体。n先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序。计算机与通信工程学院主要语句n寻址方式n寄存器间接寻址nMOV A,RinMOVX A,DPTRnMOVX A,Rin基址寄存器+变址寄存器间接寻址nMOVC A,A+DPTRnMOVC A,A+PCn循环计数nDJNZ Rn,relnDJNE A,direct,relnJZ(JNZ,JC,JNC,JB,JNB)rel计算机与通信工程学院例例4-5 工作单元清零n将40H为起点的8个单元清“0”nORG 0000HnCLEAR:CLR A ;A清0n MOV R0,#40H ;确定清0单元起始地址n MOV R7,#08 ;确定要清除的单元个数nLOOP:MOV R0,A ;清单元n INC R0 ;指向下一个单元n DJNZ R7,LOOP;控制循环n END计算机与通信工程学院例例4-5 工作单元清零n例如:设有50个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首址存放在DPTR中,设为2000H nORG 0000Hn MOV DPTR,#2000H nCLEAR:CLR An MOV R2,#32H ;置计数值nLOOP:MOVX DPTR,An INC DPTR ;修改地址指针n DJNZ R2,LOOP ;控制循环n END 计算机与通信工程学院例例4-5 工作单元清零n写成通用子程序形式:nCLEAR:CLR AnLOOP:MOVX DPTR,An INC DPTR ;修改地址指针n DJNZ R2,LOOP ;控制循环n RETn完整调用n ORG 0000Hn MOV DPTR,#2000Hn MOV R2,#50n ACALL CLEARn SJMP$nCLEAR:CLR AnLOOP:n MOVX DPTR,An INC DPTR ;修改地址指针n DJNZ R2,LOOP ;控制循环n RETn END计算机与通信工程学院例例4-6 多个单字节数据求和n已知有n个单字节数据,依次存放在内部RAM 40H单元开始的连续单元中。要求把计算结果存入R2,R3中(高位存R2,低位存R3)。n程序如下:n ORG 8000HnSAD:MOV R0,#40H ;设数据指针n MOV R5,#NUM ;计数值0AHR5nSAD1:MOV R2,#0 ;和的高8位清零n MOV R3,#0 ;和的低8位清零nLOOP:MOV A,R3 ;取加数n ADD A,R0n MOV R3,A ;存和的低8位n JNC LOP1 ;无进位,直接计算高8位n INC R2 ;有进位,和的高8位+1nLOP1:INC R0 ;指向下一数据地址n DJNZ R5,LOOPn RETnNUM EQU 0AHn END n上述程序中,用R0作间址寄存器,每作一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循环的次数。计算机与通信工程学院例例4-7 测试字符串长度n设有一串字符依次存放在从50H单元开始的连续单元中,该字符串以回车符(0DH)为结束标志,测得的字符串长度存入R2中。n测字符串长度程序是将该字符串中的每一个字符依次与回车符相比,若比较不相等,则统计字符串长度的计数器加1。继续比较,若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。n程序如下:n ORG 0000HnCONT:MOV R2,#00H ;初始长度设置n MOV R0,#50H ;数据指针R0置初值nNEXT:CJNE R0,#0DH,LOOP1n RETnLOOP1:INC R0n INC R2n SJMP NEXT nENDn待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNE R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度 计算机与通信工程学院例4-9 10秒延时程序n延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2s,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。n程序如下:nDEL:MOV R5,#100nDEL0:MOV R6,#200nDEL1:MOV R7,#248nDEL2:DJNZ R7,DEL2 ;248*2+4n DJNZ R6,DEL1 ;(248*2+4)*200+4n DJNZ R5,DEL0 ;(248*2+4)*200+4)*100+4n RETn上例延时程序实际延时为10.000406秒。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:n(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。n(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。n(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。计算机与通信工程学院例4-10 冒泡程序n MOV R6,#CNTn DEC R6n LOOPA:n MOV R0,#30Hn MOV A,R6n MOV R7,An CLR 20H.0n NEXT:n MOV A,R0n INC R0n CLR Cn SUBB A,R0n JC NXCHn MOV A,R0n DEC R0n XCH A,R0n INC R0n MOV R0,An SETB 20H.0nCNT EQU 07HnORG 0000Hn AJMP STARTnORG 0030HnSTART:n MOV DPTR,#LISTn MOV R0,#30Hn MOV R7,#CNTnLOOPD:n CLR An MOVC A,A+DPTRn MOV R0,An INC DPTRn INC R0n DJNZ R7,LOOPDnNXCH:n DJNZ R7,NEXTn JNB 20H.0,OVERn DJNZ R6,LOOPAnOVER:n AJMP$nLIST:DB 70H,13H,3H,90H,27H,32H,11Hnend计算机与通信工程学院例4-13 无符号数双字节乘法n R2 R3n R6 R7n-n R3 R7 n R2 R7n R3 R6n R2 R6n-n R4 R5 R6 R7计算机与通信工程学院例4-13 无符号数双字节乘法nORG 0000Hn AJMP MAINnORG 0030HnMAIN:n MOV SP,#60HnSTART:n MOV R2,#0FFHn MOV R3,#0FFHn MOV R6,#0FFHn MOV R7,#0FFHn LCALL DBMULn AJMP STARTnDBMUL:n MOV A,R3n MOV B,R7n MUL ABn XCH A,R7n MOV R5,Bn MOV B,R2n MUL ABn ADD A,R5n MOV R4,An CLR An ADDC A,Bn MOV A,R5n MOV A,R6n MOV B,R3n MUL ABn ADD A,R4n XCH A,R6n XCH A,Bn ADDC A,R5n MOV R5,An MOV F0,Cn MOV A,R2n MUL ABn ADD A,R5n MOV R5,An CLR An MOV ACC.0,Cn MOV C,F0n ADDC A,Bn MOV R4,An RETn END计算机与通信工程学院4.4 散转程序设计n散转程序是分支程序的一种。n它由输入条件或运算结果来确定转入各自的处理程序。n有多种方法能实现散转程序,但通常用逐次比较法,即把所有各个情况逐一进行比较,若有符合便转向对应的处理程序。n由于每一个情况都有判断和转移,如对n个情况,需要n个判断和转移,因此它的缺点是程序比较长。nMCS-51指令系统中有一条跳转指JMP A+DPTR,用它可以容易地实现散转功能。n该指令是把累加器A的8位无符号数(作地址的低8位)与16位数据指针的内容相加,其和送入程序计数器,作为转移指令的地址。n执行JMP A+DPTR指令后,累加器和16位数据指针的内容均不受影响。计算机与通信工程学院例例4-16 用转移指令表实现散转n根据某一单元的值0,1,2,n分别转向处理程序0,处理程序1,处理程序n。n这时可以用转移指令AJMP(或LJMP)组成一个转移表n例例4-16:根据R6的内容,转向各个处理程序n MOV DPTR,#TAB1n MOV A,R6n ADD A,R6nPAD:JMP A+DPTRnTAB1:AJMP LOP0n AJMP LOP1n AJMP LOP2n本例仅适用于散转表首地址TAB1和处理程序入口地址LOP0,LOP1,LOPn在同一个2K范围的存储区的情况。n如果一个2K范围的存储区内放不下所有的处理程序时,把一些较长的处理程序放在其他存储区域,只要在该处理程序的入口地址内用LJMP指令即可。计算机与通信工程学院例例4-16 用LJMP指令组成转移表 nPJ2:MOV DPTR,#TAB2n CLR Cn MOV R5,#0n MOV A,R6n RLC A ;R6*2n JNC AD1n INC R5 ;有进位,高8位加1nAD1:ADD A,R6 ;R6*3n JNC AD2n INC R5 ;有进位,高8位加1nAD2:MOV A,R5n ADD A,DPH ;DPTR高8位调整n MOV A,R6n JMP A+DPTR ;得散转地址nTAB2:LJMB LOP0n LJMP LOP1n n LJMP LOPnn END n用用AJMP组成的散转表为二字节一项,而用组成的散转表为二字节一项,而用LJMP组成的散转表则为三字节一项,组成的散转表则为三字节一项,根据根据R6中的内容或乘中的内容或乘2,或乘,或乘3得每一处理程序的入口地址表指针。得每一处理程序的入口地址表指针。PJ2:MOV DPTR,#TAB2 CLR C MOV R5,#0 MOV A,R6 RLC A ;R6*2 JNC AD1 INC DPH ;AD1:ADD A,R6 ;R6*3 JNC AD2 INC DPH ;AD2:JMP A+DPTR TAB2:LJMB LOP0 LJMP LOP1 LJMP LOPn END计算机与通信工程学院例例4-17 用转移地址表实现散转n例例4-17:根据R3的内容转向对应处理程序。处理程序的入口分别是LOP0LOP2。nPJ3:MOV DPTR,#TAB3n MOV A,R3n ADD A,R3 ;R3*2n JNC CADn INC DPH ;有进位DPTR高位加1nCAD:MOV R2,A ;暂存R2n MOVC A,A+DPTRn XCH A,R2 ;处理程序入口地址高8位暂存R2n INC An MOVC A,A+DPTRn MOV DPL,A ;处理程序入口地址低8位暂存DPLn MOV DPH,R2n CLR An JMP A+DPTRnTAB3:DW LOP0n DW LOP1n DW LOP2计算机与通信工程学院4.5 子程序和参数传递方法n在程序中,会多次进行一些相同的计算和操作,一般把他们写成子程序n如数制转换、函数式计算等。n一些常用的程序段,以子程序的形式,事先存放在存储器的某一区域n主程序在运行时,需要用子程序时,只要执行调用子程序的指令,使程序转至子程序。n子程序处理完毕,返回主程序,继续进行以后的操作。n调用子程序有几个优点:n1、避免对相同程序段的重复编制。n2、简化程序的逻辑结构,同时也便于子程序调试。n3、节省存储器空间。n有两条调用子程序指令ACALL及LCALL,和一条返回主程序的指令RET。n子程序的调用,一般包含两个部分:保护现场和恢复现场。n参数的传递n调用子程序时,主程序先把有关的参数(入口参数)存放在约定的位置,n子程序在执行时,从约定的位置取得参数,n当子程序执行完,将得到的结果(出口参数)存入约定的位置,n返回主程序后,主程序可以从这些约定的位置上取到需要的结果。计算机与通信工程学院1、工作寄存器或累加器传递参数n把入口参数或出口参数放工作寄存器或累加器中。n使用这种方法程序最简单,运算速度也最高。n缺点n工作寄存器数量有限,不能传递太多的数据;n主程序必须先把数据送到工作寄存器;n参数个数固定,不能由主程序任意改定。n例例:请编出能把R5单元内两个BCD数变换成相应ASCII码放在R6(高位BCD数的ASCII码)和R7(低位BCD数的ASCII码)单元的程序。n根据ASCII字符表,09的BCD数和它们的ASCII码之间仅相差30H。因此,仅需把R5单元中两个BCD数拆开,分别和30H相加就行了,可以编出程序如下:nASCH:n MOV A,R5n ANL A,#0F0Hn ORL A,#30Hn MOV R6,An MOV A,R5n ANL A,#0FHn ORL A,#30Hn MOV R7,An RET计算机与通信工程学院2、用指针寄存器来传递参数n由于数据一般存放在存贮器中,而不是工作寄存器中,故可用指针来指示数据的位置,n可以节省传递数据的工作量,并可实现可变长度运算。n一般如参数在内部RAM中,可用R0或R1作指针。n可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长度(如使用结束标记符)。n例例:将(R0)和(R1)指出的内部RAM中两个3字节无符号整数相加,结果送(R0)指出的内部RAM中。入口时,(R0),(R1)分别指向加数和被加数的低位字节,出口时(R0)指向结果的高位字节。利用MS-51的带进位加法指令,可以直接编写出下面的程序。nNADD:MOV R7,#3n CLR CnNADD1:MOV A,R0n ADDC A,R1n MOV R0,An DEC R0n DEC R1n DJNZ R7,NADD1n INC R0n INC R0n INC R0n RET计算机与通信工程学院3、用堆栈来传递参数n堆栈可以用于传递参数。n调用时,主程序用PUSH指令把参数压入堆栈n子程序可按栈指针访问堆栈中的参数,同时可把结果参数送回堆栈中。n返回主程序后,可用POP指令得到这些结果参数。n这种方法的优点是简单,能传递大量参数,不必为特定的参数分配存贮单元。n使用这种方法时,由于参数在堆栈中,故大大简化了中断响应时的现场保护。计算机与通信工程学院例例4-19 一位十六进制数转换为ASCII码子程序nHASC:MOV R0,SPnDEC R0nDEC R0 ;R0为参数指针nXCH A,R0 ;保护ACC,取出参数nANL A,#0FH nADD A,#2 ;加偏移量nMOVC A,A+PCnXCH A,R0 ;查表结果放回堆栈中nRETnDB 0123456789 ;十六进制数的ASCII字符表nDB ABCDEF计算机与通信工程学院例例4-21 一个字节的两位十六进制数为转换为两个ASCII码子程序nORG 0000Hn AJMP STARTnORG 0030HnSTART:n MOV SP,#60Hn MOV 40H,#7FHn PUSH 40Hn MOV A,#78hn LCALL HTA2n AJMP STARTnHTA2:MOV R0,SPnDEC R0nDEC R0nPUSH ACC ;保护累加器内容保护累加器内容(?)nMOV A,R0 ;取出参数nANL A,#0FHnMOV DPTR,#DATA1nMOVC A,A+DPTRnXCH A,R0 ;低位HEX的ASCII码放入堆栈中nSWAP AnANL A,#0FHnMOVC A,A+DPTRnINC R0nXCH A,R0 ;高位HEX的ASCII码放入堆栈中nINC R0nXCH A,R0 ;高位返回地址放入堆栈,并恢复累加器内容nRETnDATA1:nDB 0123456789nDB ABCDEFnEND计算机与通信工程学院例例22n将内部RAM中50H、51H中的内容以4位十六进制数的ASCII形式在串行发送出去,可如下调用HTA2程序:n ORG 0000HnSCOT4:PUSH 50HnACALL HTA2nPOP ACCnACALL COUTnPOP ACCnACALL COUTnPUSH 51HnACALL HTA2nPOP ACCnACALL COUTnPOP ACCnACALL COUTnCOUT:JNB TI,COUT ;字符发送子程序nCLR TInMOV SBUF,AnRETnEND计算机与通信工程学院4、程序段参数传递n参数传递方法,多数是在调用子程序前,把值装入适当的寄存器传递参数。n如果有许多常数参数,这种技术不太有效,每个参数需要一个寄存器传递,并且在每次调用子程序时需分别用指令把它们装入寄存器中。n如果需要大量参数,并且这些参数均为常数时,程序段参数传递方法(有时也称为直接参数传递)是传递常数的有效方法。n调用时,常数作为程序代码的一部分,紧跟在调用子程序后面。n子程序根据栈内的返回地址,决定从何处找到这些常数n然后在需要时,从程序存贮器中读出这些参数。计算机与通信工程学院例例22字符串发送子程序。n实际应用中,需要发送各种字符串。这些字符串,通常放在EPROM(程序存贮器)中。n按通常方法,需要先把这些字符装入RAM中,然后用传递指针的方法来实现参数传递。n为了简便,也可把字符串放在EPROM独立区域中,然后用传递字符串首地址的方法来传递参数。n子程序可按该地址用MOVC指令从EPROM中读出并发送该字符串。n最简单的方法是采用程序段参数传递方法。n下例中,字符串全以0结束。nSOUT:n POP DPH ;栈中指针n POP DPLnSOT1:n CLR An MOVC A,A+DPTRn INC DPTRn JZ SENDn JNB TI,$;$为本条指令地址n CLR TIn MOV SBUF,An SJMP SOT1nSEND:n JMP A+DPTRnRETn 下面从发送字符串MCS-51 CONTROLLER为例,说明该子程序使用方法。nACALL SOUTnDB MCS-51 CONTROLLERnDB 0AH,0DH,0n后面紧接其他程序。计算机与通信工程学院例例22:总结:总结n上面子程序有几个特点:n它不以一般的返回指令结尾,而是采用基寄存器加变址寄存器间接转移指令来返回到参数表后的第一条指令。一开始的POP指令已调整了栈指针的内容。n它可适用与ACALL或LCALL,因为这两种调用指令均把下一条指令或数据字节的地址压入栈中。调用程序可位于MCS-51全部地址空间的任何地方,因为MOVC指令能访问所有64K字节。n传递到子程序的参数可按最方便的次序列表,而不必按使用的次序排列。子程序在每一条MOVC 指令前累加器装入适当的参数,这样基本上可“随机访问”参数表。n子程序只使用累加器A和数据指针DPTR,应用程序可以在调用前,把这些寄存器压入堆栈中,保护它们的内容。计算机与通信工程学院4.6查表程序设计n查表程序是一种常用程序,它广泛使用于LED显示器控制、打印机打印以及数据补偿,计算、转换等功能程序中,具有程序简单、执行速度快等优点。n查表,就是根据变量x在表格中查找y,使y=f(x)。计算机与通信工程学院1、用MOVC A,A+PC查表指令编程n例:例:用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪三下,反复循环。nTAB:nDB 01H,02H,04H,08H,10H,20H,40H,80H nDB 80H,40H,20H,10H,08H,04H,02H,01H nDB 00H,0FFH,00H,0FFH,00H,0FFH,03HnDEL:MOV R7,#0FFHnDEL1:MOV R6,#0FFHnDEL2:DJNZ R6,DEL2n DJNZ R7,DEL1n RETnEND nORG 0000HnSTART:nMOV R0,#00HnLOOP:nCLR A nMOV A,R0nADD A,#0CHnMOVC A,A+PCnCJNE A,#03H,LOOP1nJMP STARTnLOOP1:nMOV P1,AnACALL DELnINC R0nJMP LOOP计算机与通信工程学院2、用MOVC A,A+DPTR查表指令编程n例:例:用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪三下,反复循环。n程序为:nORG 0000HnSTART:MOV DPTR,#TABnLOOP:CLR A nMOVC A,A+DPTR nCJNE A,#03H,LOOP1 nJMP STARTnLOOP1:MOV P1,A nACALL DEL nINC DPTR nJMP LOOPnTAB:DB 01H,02H,04H,08H,10H,20H,40H,80H nDB 80H,40H,20H,10H,08H,04H,02H,01H nDB 00H,0FFH,00H,0FFH,00H,0FFH,03HnDEL:MOV R7,#0FFHnDEL1:MOV R6,#0FFHnDEL2:DJNZ R6,DEL2 nDJNZ R7,DEL1 n RETnEND 计算机与通信工程学院4.7综合编程n已经编过彩灯程序控制,使接于P1口的红发光二极管左移顺次点亮,当时为了简单易懂,用字节传送方法编的,编的程序较长,实际上编程很灵活,方法很多,同一个问题有很多种编程方法,没有千篇一律的格式,下面就彩灯顺序点亮的程序的两种编程方法作一比较,了解一些编程的技巧。计算机与通信工程学院例例 用左移指令RL A编程n ORG 0000Hn MOV A,#0FEHn LOP1:MOV P1,An ACALL DELn RL An AJMP LOP1nDEL:MOV R4,#0FFHnDEL1:MOV R3,#0FFHnDEL2:DJNZ R3,DEL2n DJNZ R4,DEL1n RETnEND ORG 0000H MOV A,#7FHLOP2:MOV P1,A ACALL DEL RR A AJMP LOP2DEL:MOV R4,#0FFHDEL1:MOV R3,#0FFHDEL2:DJNZ R3,DEL2 DJNZ R4,DEL1 RETEND 计算机与通信工程学院例例 用查表方法编写彩灯左移控制程序nORG 0000HnSTART:MOV R0,#00HnLOOP:MOV A,R0nADD A,#0DHnMOVC A,A+PCnCJNE A,#03H,LOOP1nJMP STARTnLOOP1:MOV P1,An CLR An ACALL DELn INC R0n JMP LOOPnTAB:DB 01H,02H,04H,08H,10H,20H,40H,80H,03HnDEL:MOV R4,#0FFHnDEL1:MOV R3,#0FFHnDEL2:DJNZ R3,DEL2n DJNZ R4,DEL1n RETnEND 计算机与通信工程学院计算机与通信工程学院演讲完毕,谢谢观看!
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!