Ch8 宏指令
- 格式:doc
- 大小:375.00 KB
- 文档页数:21
实验五:宏指令及子程序设计实验院系名称:电子工程学院学生姓名:李倩(33)专业名称:电子信息工程班级:电子0808宏指令及子程序设计实验5.5.1 实验目的1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。
2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。
3、了解宏指令与子程序的异同以及各自的适用场合。
5.5.2 实验预习要求1、复习宏指令的定义与调用方法。
2、复习过子程序的定义与调用方法。
3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。
4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
5.5.3 实验内容从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在屏幕上显示出来。
要求:①在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现;②将键盘输入的十进制数转换成二进制数由子程序DTOB实现;③在N个无符号字节型二进制数中找出最大数的功能由子程序FMAX实现;④将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的功能由子程序BTOAD实现。
程序运行结果如右图所示。
1、编程指导(1)显示提示信息的宏指令DSTRING的编写宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。
这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。
读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。
下面给出实现提示信息显示的宏指令的定义:DSTRING MACRO STRINGPUSH DXPUSH AXMOV DX,OFFSET STRINGMOV AH,09HINT 21HPOP AXPOP DXENDM请读者注意,宏指令应该先定义,后调用。
预处理指令注解://—单行注解;/*多行注解*/基本数据类型(int, float, double, char, void)用户自定义数据类型格式t y p e d e f s t r u c t{数据类型变量序列1;数据类型变量序列1;...}自定义数据类型的名称;C 32 个关键字Keil C51 扩展的关键字C语言常用转义字符表预定义标识符__FILE__ 正在编译的文件的名字__LINE__ 正在编译的文件的行号__DATE__ 编译时刻的日期字符串,例如:"25 Dec 2000" __TIME__ 编译时刻的时间字符串,例如:"12:30:55"常量表示法※假设a等于8,b等于2※比较运算结果是个布尔值既T R U E(真值)或FA L S E(假值)。
假设a等于8 逻辑运算※逻辑运算结果是个布尔值既T R U E(真值)或FA L S E(假值)。
假设a等于8 位逻辑运算※假设a等于5控制命令if语句i f(条件)语句1;e l s e语句2;例:i f(d==4)d=0;//如果d等于4就设置d等于0e l s e d++;//否则就将d加1i f(t i c k s==0){//如果t i c k s等于0t i c k s=1000;//t i c k s设置成1000c o u n t e r[0]++;//c o u n t e r[0]加1}嵌套if语句例:i f(c o u n t e r[0]==10){c o u n t e r[1]++;c o u n t e r[0]=0;i f(c o u n t e r[1]==10){c o u n t e r[2]++;c o u n t e r[1]=0;}}switch语句s w i t c h(变量){c a s e常量1:语句1;b r e a k;c a s e常量2:语句2;b r e a k;c a s e常量3:语句3;b r e a k;......d e f a u l t;语句n;}for循环f o r(初值,条件,变化值)语句;例:f o r(i=0;i<10;i++)x=x+i;f o r(i=1;i<10,i++)f o r(j=1;j<10,j++)p r i n t f(“%d%d”,i,j);无穷循环:f o r(;;);while循环w h i l e(条件)语句;例:w h i l e(c h!=!’A’)c h=g e t c h e();无穷循环:w h i l e(1);do/while循环d o{语句;...}w h i l e(条件);例:d o{c h=g e t c h e();}w h i l e(c h!=”A”);goto语句l o o p1:x++;i f(x<100)g o t o l o o p1;指针和函数指针的定义数据类型*指针变量的名字;例:c h a r*p;i n t*x;指针与数组例:c h a r f i l e n a m e[80];c h a r*p;p=f i l e n a m e;//指针p存放f i l e n a m e的开始地址i n t x[5]={1,2,3,4,5};i n t*p,s u m,i;p=x;//指针p存放数组x的开始地址f o r(i=0;i<5;i++)s u m=s u m+p[i];//p[i]相当于x[i]指针的运算1.针变量前面加上*号就是取得指针所指向位置的内容。
本教程没有收录所有的宏,意在教会新手制作属于自己的宏,得到更多游戏的快乐。
/cast [<第一组条件选项>] <第一个法术名称>; [<第二组条件选项>] <第二个法术名称>; [<第三组条件选项>] <第三个法术名称>;...”/castse quenc e [<条件选项>] reset=<#>/target/combat <法术1>, <法术2>, <法术3>你可以在任何条件选项前加上“no”来得到反效果,比如,“nocomb at”则在脱离战斗的情况下成立。
用逗号“,”来分隔条件选项作用和“and”一样,当条件选项同时成立时执行。
用斜杠“/”来分隔条件选项作用和“or”一样,当其中一个条件选项成立时执行。
2.0以前宏举例。
1、小D判断连击点数释放技能,也适用于盗贼:/script if ( GetCom boPoi nts() >= 3 ) then CastSp ellBy Name("凶猛撕咬(等级 3)"); else CastSp ellBy Name("爪击(等级 4)") end2、常用的密语格式/script SendCh atMes sage(“主动给钱或是由我抢劫二选一”,”say”,”通用语”,”YELL”) "SAY":普通说话 2."WHISPE R":密语1."GUILD":工会2."PARTY":小队3."RAID":组团4."YELL":大喊/script UIErro rsFra me:Clear()可以隐藏并清除提示。
ATmega8单片机C语言ROT的宏定义在ATmega8单片机编程中,宏定义是一种非常重要的编程工具,它可以帮助程序员更加灵活地定义和使用常量、函数和指令。
在本文中,我们将重点讨论ATmega8单片机C语言中ROT的宏定义。
1. 什么是ROT?在ATmega8单片机编程中,ROT是一个非常常用的功能,它用来控制引脚的输入输出状态。
ROT的全称是“Register Of Translators”,它通过寄存器和缓冲区的相互转换来实现引脚状态的改变。
2. ROT的宏定义在ATmega8单片机C语言编程中,程序员通常会使用一些宏定义来简化代码,提高代码的可读性和可维护性。
下面是一些常用的ROT的宏定义:#define ROT_PORTA 0x00#define ROT_PORTB 0x01#define ROT_PORTC 0x02#define ROT_PORTD 0x03以上代码中,我们使用了#define关键字来定义了四个ROT的宏。
其中,ROT_PORTA表示引脚A,ROT_PORTB表示引脚B,以此类推。
通过这些宏定义,我们可以在程序中直接使用ROT_PORTA、ROT_PORTB等来代表引脚,而不需要直接写0x00、0x01等数字。
3. 如何使用ROT的宏定义?在ATmega8单片机C语言编程中,使用ROT的宏定义非常简单。
我们需要包含avr/io.h头文件,该头文件中包含了ATmega8单片机的引脚定义。
我们可以在程序中直接使用上面定义的ROT的宏。
例如:DDRA |= (1 << ROT_PORTA); // 设置引脚A为输出DDRB |= (1 << ROT_PORTB); // 设置引脚B为输出DDRC |= (1 << ROT_PORTC); // 设置引脚C为输出DDRD |= (1 << ROT_PORTD); // 设置引脚D为输出通过以上代码,我们可以看到,在设置引脚为输出时,我们直接使用了ROT的宏定义,而不需要写具体的寄存器位置区域和位操作,大大提高了代码的可读性和可维护性。
8.宏指令8.1.宏指令 (Macro Function) 功能ADP提供了一种既方便又功能强大的宏指令应用方式,使人机得以经由内部宏指令(Macro Function)功能执行数值运算,逻辑判断,流程控制,数值传递,数值转换,定时器计数器,自定通讯指令操作等等,由宏指令的使用可让人机不仅和PLC联机通讯,同时由另一通讯端口来执行同其它通讯设备联机,此功能不仅提供有效的系统整合同时成为最经济便宜的硬件应用架构。
而且使用宏指令也可大大的减少PLC的程序容量,让PLC的控制精度及效率最佳化。
8.2.宏指令的分类为让设定者容易操作宏指令的控制功能,在软件规划中特别将宏指令分类为多种使用时机及功能的宏指令。
设计时可以很清楚的根据所需功能,直接在其相对的宏指令规划窗口中定义其应用程序,PWS人机执行时即依据各模式的宏指令加以处理。
以下依据宏指令的作业模式加以分类为:A.应用宏指令:在[应用] 菜单中有三种应用宏指令。
1.INITIAL宏:当人机第一次RUN此应用时(指断电后第一次重新送电执行应用画面程序),会执行一次INITIAL宏内的程序指令。
一般作为通讯参数的格式宣告用,数据的初值化定义..等使用。
2.BACKGROUND宏:当人机RUN此应用时,就会循环执行BACKGROUND宏内的程序指令,但每次将只执行最多30行的宏指令。
而且不论人机当前所在画面为何,此宏均将被执行。
一般作为通讯命令控制用,PLC取样数据的转换..等使用。
3.CLOCK宏:当人机RUN此应用时,人机将固定以500ms周期循环执行宏内的全部指令一次。
一般作为画面显示效果控制用,PLC接点监视,定时通讯命令控制用,数据的定时累计转换..等使用。
B.画面宏指令:在[画面] 菜单中有三种画面宏指令。
1.OPEN宏:当人机每次打开或切换到此画面时,每次只执行一次OPEN宏内的程序指令。
一般作为画面资料的初值化定义,画面显示效果控制用,内部缓存器或接点初值化定义..等使用。
2.CLOSE宏:当人机每次离开或关闭此画面时,每次只执行一次CLOSE宏内的程序指令。
3.CYCLIC宏:当人机停留在此画面时,就会循环执行CYCLIC宏内的程序指令。
当然人机系统也会周期性的去执行BACKGROUND宏和CLOCK宏内的指令。
C.ON/OFF按钮宏指令:在按钮元件中有二种ON/OFF宏指令。
1.ON宏:当操作按压此按钮,且此操作为设置该接点为ON时,人机会执行一次ON宏内的程序指令。
一般作为按钮动作的数据或控制连锁处理,启动画面显示效果控制用,PLC缓存器或接点初值化定义..等使用。
2.OFF宏:当操作按压此按钮,且此操作为设置该接点为OFF时,人机会执行一次OFF宏内的程序指令。
一般作为按钮动作的数据或控制连锁处理,关闭画面显示效果控制用..等使用。
D.子宏 (Sub-Macro) 指令:在[元件] 菜单中可选[子宏] 元件。
1.子宏:即为宏子程序的意思。
主要作为宏程序指令的直接呼叫用,通常可将一些常用功能或重复运算用的宏指令,先用子宏规划并储存,然后可随时在一般宏指令中重复呼叫使用。
8.3.宏指令的命令说明下表中所列为ADP提供的宏指令集的一览表及其命令格式。
如要了解如何设定,请参阅下一节的操作范例说明。
* A1,A2,A3,可以使用的内存范围,实际会依据各别指令而有所区别,表中的数字分别代表: 0=PLC Device(Word), 1=PLC De vice(位),2=Internal Memory(Word), 3=Internal Memory(位),4=Constant, 5=ASCII Character.* A1,A2,A3,可以使用的内存范围,实际会依据各别指令而有所区别,表中的数字分别代表: 0=PLC Device(Word), 1=PLC Device(位),2=Internal Memory(Word), 3=Internal Memory(位),4=Constant, 5=ASCII Character.♦条件可包含A1==A2, A1!=A2, A1>A2, A1>=A2, A1<A2, A1<=A2, (A1&A2)==0,(A1&A2)!=0, A1==ON或A1==OFF。
A1及A2只能使用内部存储器及常数。
算数运算[注]仅能用内部存储器来运算,包含@,RCPW,CB,RCPNO,*@(内部存储器间接寻址)。
本指令数据格式可以用Word, Double-Word,和Signed binary,Unsigned binary等方式(无实数浮点运算)。
♦ADD →加法,公式如 A1=ADD(A2,A3)。
就是A2和A3相加运算结果存在A1。
♦SUB →减法,公式如A1=SUB(A2,A3)。
就是A2和A3相减运算结果存在A1。
♦MUL →相乘,公式如A1=MUL(A2,A3)♦DIV →除法,公式如 A1=DIV(A2,A3)。
A1为商,A3不可为0。
♦MOD →除法取余数,公式A1=MOD(A2,A3)。
A1为余数,A3不可为0。
* A1,A2,A3,可以使用的内存范围,实际会依据各别指令而有所区别,表中的数字分别代表: 0=PLC Device(Word), 1=PLC Device(位),2=Internal Memory(Word), 3=Internal Memory(位),4=Constant, 5=ASCII Character.[注]仅能用内部存储器来运算,包含@,RCPW,CB,RCPNO,*@(内部存储器间接寻址)。
本指令数据格式可以用Word, 和Double-Word等方式(无Signed binary,实数浮点运算)。
♦OR →逻辑或,公式如A1=A2 | A3。
真值表如左图:就是A2(word)和A3(word)相对位做”OR”运算结果存在A1(word)。
♦又或A2(Dword)和A3(Dword)相对位做”OR”运算结果在A1(Dword)。
♦AND →逻辑积,公式如 A1=A2 & A3。
真值表如左图:就是A2(word)和A3(word)相对位做”AND”运算结果存在A1(word)。
♦又或A2(Dword)和A3(Dword)相对位做”AND”运算结果存在A1(Dword)。
♦XOR →逻辑异或,公式如A1=A2 ^ A3。
真值表如左图:就是A2(word)和A3(word)相对位做”XOR”运算结果存在A1(word)。
♦又或A2(Dword)和A3(Dword)相对位做”XOR”运算结果存在A1(Dword)。
♦SHL→左移,公式如 A1=A2 << A3。
于A2(word)的地址左移A3个位运算结果存在A1(word)。
左移位指令是一边填入0到位0,一边移出。
假如移位量(A3)大于16,则最多移16位。
♦又或A2(Dword)的地址左移A3个位运算结果存在A1(Dword)。
左移位指令是一边填入0到位0,一边移出。
假如移位量(A3)大于32,则最多移32位。
♦SHR →右移,公式如 A1=A2 >> A3。
于A2(word)的地址右移A3个位运算结果存在A1(word)。
右移位指令是一边填入0到位15,一边移出位0。
假如移位量(A3)大于16,则最多移16位。
又或A2(Dword)的地址右移A3个位运算结果存在A1(Dword)。
右移位指令是一边填0到位31,一边移出位0。
假如移位量A3大于32,则最多移32位。
[注]对MOV和BMOV可以使用PLC的缓存器,也能用内部存储器来处理,包含@,RCPW,CB,RCPNO,*@(内部存储器间接寻址)。
本指令数据格式主要以Word方式。
♦MOV→搬移,如A1(Word)=A2(Word),又或A1(Dword)=A2(Dword)。
搬移指令是将缓存器A2的数据拷贝到目标缓存器A1中,而缓存器A2的数据不会因搬移指令而改变。
搬移指令中如果A1使用为PLC地址,则表示将人机内部缓存器A2的数据由通讯方式写入PLC地址。
反之如果A2使用为PLC地址,则表示由通讯方式将PLC地址A2的数据读出并搬移给人机内部缓存器A1地址。
♦BMOV →区块搬移,如BMOV(A1,A2,A3),就是从A2地址开始搬移到A1地址,共搬移A3个数目,数据格式只有Word。
区块搬移指令是指从缓存器地址A2为起点,将连续A3个缓存器数据区块拷贝到目标缓存器A1为起始地址的连续A3个缓存器中,而缓存器A2的数据不会因区块搬移指令而改变。
个数A3需介于2-524之间。
♦FILL →内存填满,如FILL(A1,A2,A3) ,就是从A1地址开始填满A2的数值,共A3个数目,数据格式只有Word。
填满指令是指将缓存器A2的数据为起点,填满到目标缓存器A1为起始地址的连续A3个缓存器中,而缓存器A2的数据不会因填满指令而改变。
个数A3需介于2-524之间。
♦CHR →将文字转为ASCII,如CHR(A1, “A2”)。
将A2内的文字转换为ASCII数字码存在A1。
♦GETX →将input转为数字码,如A1 = @X。
将@X的input信号转换为数字码存在A1。
此指令只适用于PWS520S的机型。
♦SETY →将数字码转为output,如@Y = A1。
将A1的数字码转换为output信号。
此指令只适用于PWS520S的机型。
♦X2Y →将input转为output,如X2Y(A1, A2)。
此指令只适用于PWS520S。
假如A2数值不为零,则致能所指定之内部接点A1. 当A2数值为零,则取消所指定之内部接点A1之动作. ,PWS-520S中总共有八个内部接点可供指定(号码由0~7)。
一个内部接点可以指定其相对应之数值输入点对应输出至数值输出点.其感应时间必须大于20mSec以上.且当此内部接点取消动作时,其对应只数字输出点将立即被重置。
[注] 只能用内部存储器来处理,包含@,RCPW,CB,RCPNO,*@(内部存储器间接寻址)。
♦IF ==→假如比较相等就跳到某个指令,如IF A1==A2 THEN GOTO LABEL A3。
♦IF != →假如比较不相等就跳到某个指令,如 IF A1!=A2 THEN GOTO LABEL A3。
♦IF >→假如比较大于就跳到某个指令,如 IF A1>A2 THEN GOTO LABEL A3。
♦IF >=→假如比较大于或等于就跳到某个指令,如IF A1>=A2 THEN GOTO LABEL A3。
♦IF <→假如比较小于就跳到某个指令,如IF A1<A2 THEN GOTO LABEL A3。