您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > EM78系列单片机程序设计
5.1.EM78系列八位微控器特色指令用法5.1.1.查表指令与用法EM78系列八位微控器是利用(1)“call,(2)改变PC(或“tbl),(3)“retlk三个步骤来查表的。其中“retlk是将常数k的值传至工作寄存器A中。步骤(2)中若利用“mov0x2,a,或“add0x2,a等等指令来改变PC,则因为此等指令会將PC(R2)的位8、9清除(在EM78056只清除位8),所以查表的内容只能放在程序每个PAGE的較低的256个位址。步骤(2)中若利用“tbl指令来改变PC,则因为此指令不会將PC(R2)的位8、9清除,而保留“tbl所在位址的位8、9,所以查表的内容可以放在程序每个PAGE中的任何位址。例:查表tableadd0x02,a;將相对位置加入PC而改变了PCretl@0x19;传回常数内容19h至Aretl@0x74;传回常数内容74h至Aretl@0x2e;传回常数内容2eh至Aretl@0x54;传回常数内容54h至Aretl@0x4b;传回常数内容4bh至Ainc0x18mova,0x18;欲查的内容的相对位置放在Acalltable;查表mov0x10,a;查表得到的内容移至R10中5.1.2.分PAGE的用法1.程序跳PAGE的用法:EM78系列八位微控器將其ProgramMemory(ROM)分成数个PAGE,每个PAGE的长度是1K(EM78056除外)。R3寄存器的位5(6)是PAGE选择位,当执行jmp或call指令时,PAGE选择位会被载入ProgramCounter的位10(11),因此当程序超过1K(EM78056为0.5K)时,执行jmp或call指令时,PAGE选择位正确的设定是非常重要的。下面将以EM78256为例来说明跳PAGE的方法。例例:从PAGE1跳转到PAGE0;PAGE0,beginat000h049add0x11,a050mova,@0x55051mov0x05,a;port5--0x55052bs0x03,5;selectPAGE1053jmplab1;PAGEjump054;PAGE1,beginat400h447448mova,@0x3f449xor0x12,a450Lab1bc0x06,3451mova,0x05说明:052:将R3寄存器的位5设为1(选择PAGE1)。053:Lab1会被编译为50,程序跳转至PAGE1中Lab1(450)的位址。注意:此例中052和053是用来跳PAGE的,假如沒有052这行指令,则程序将跳转至050的位址(在PAGE0中),如此將沒有达到預期的目的。2.不同PAGE子程序呼叫的方法:如第1项所述,当程序超过1K時,执行call指令时,PAGE选择位的设定就必须加以考虑。下面將以EM78256为例来说明呼叫不同PAGE子程序的方法。例:从PAGE0调用PAGE1中的子程序;PAGE0,beginat000h049add0x11,a050mova,@0x55051mov0x05,a;port5--0x55052bs0x03,5;selectPAGE1053callLab2;PAGEjump054bc0x03,5;restore055jbs0x15,2056;PAGE1,beginat400h417418mova,@0x3f419xor0x12,a450Lab2bc0x06,3451mova,0x0545fret說明:052:將R3寄存器的位5設为1(选择PAGE1)。053:Lab2將会被編译为50,呼叫PAGE1中Lab2子程序。054:將R3寄存器的位5还原为0。注意:此例中052和053是用来呼叫PAGE1中Lab2的子程序,假如果沒有052這行指令,則程序將呼叫050的位址(在PAGE0中),而非450的位址(在PAGE1中),如此將发生錯誤。5.1.3.BS,BC等指令对I/OPort的作用:BS,BC等指令会先有读再写的动作,例如bc0x06,3指令是將整个Port6(8pin)读進CPU,执行位运算后再写至Port6上。假如Port6有一些pin是双向I/Opin(如P65)時,假設当执行bc0x06,3時P65是输入pin,則P65pin上的内容会被读入再写至Latch上,覆蓋原先Latch上的内容。因此只要P65一直是输入pin將不会有問題,一旦P65切換为输出,則Latch上的内容將是不可預知的。5.1.4.I/OPort读取的路径:若仔細研究EM78系列八位微控器的I/OPort构造,就可发現在做读I/OPort的动作時(如mova,0x06),所读入内容有两个路径来源,一是I/Opin上的内容,另一是输出Latch上的内容,而由I/O控制寄存器決定此读入的路径。例如I/Opin设计为输入pin時(对应的I/O控制寄存器为1),对I/OPort做读的动作時,是读到pin上的内容。若I/Opin设计为输出pin時(对应的I/O控制寄存器为0),对I/OPort做读的动作時,是读到输出Latch上的内容。5.1.5.WDT(WatchdogTimer)的使用:WDT是微控器內部RC自振的计時器,其超時溢位(Time-out)的基本周期約18ms,WDT有与TCC共用的倍除器,使得超時溢位(Time-out)的最大周期可至約2.2sec。WDT计時的使能或禁止是可隨時由指令控制的(控制位在IOCE寄存器)。当WDT使能時,其超時溢位將使微控器发生RESET(或喚醒),wdtc指令是用来清除WDT,令WDT再从头计時,因此适当的使用wdtc指令,可使WDT不会发生RESET。当WDT被禁止時,WDT不会使微控器RESET或喚醒。要特別注意的是,Power-on之後WDT是使能的,如果該应用中並沒有使用WDT,必須在程序的前头用指令將WDT计時禁止。EM78156/256/456就是依上述所設计。在EM78247/447/248/448/056/P156除了上述的設计外,另有一CodeOption決定使能或禁止WDT,其功能如下:1.假如应用中有使用WDT,WDT必須以CodeOption使能,則在程序中隨時可以用指令使能或禁止WDT计時。注意:Power-on之後WDT是使能的。2.假如应用中並沒有使用WDT,WDT可以以CodeOption禁止,則WDT是永遠被禁止的,如此可省去須在程序的前头用指令將WDT计時禁止的麻煩。5.2.基本设计规则5.2.1.设定I/O口的模式:用户可以单独设定任一支I/O脚为输出模式(OutputMode),或是输入模式(InputMode)。只要將每个I/O的设定写入累加器(A)中,再將累加器的内容写到I/O控制寄存器中,设定就算完成了。例1:將PORT6设定为OUTPUTPORT。PORT6==6;定义。MOVA,@0X00;设定A=0。IOWPORT6,A;將PORT6设定为输出模式。例2:將PORT6的低四位设成INPUTPORT;高四位设定为OUTPUTPORT。PORT6==6;定义。MOVA,@0X0F;设定A=0X0F,高四位为IOWPORT6,A;OUTPUTPORT,低四位为;INPUTPORT。5.2.2.检查寄存器的内容:检查寄存器的内容有很多种方法,可以用AND的功能,或SUB的功能…等。在做完AND或SUB的功能之后,可以检验状态标志(STATUSFLAG),然后写一个判断式,針对状态标志的結果,处理个別的情形。例:判断寄存器0X20內含值是否为0。CHECK:MOVA,@0XFF;设定A=0XFF。ANDA,0X20;寄存器0X20,和A中的值做andJBS0X03,2;若是寄存器0x20为0,则寄存JMPCHECK;器0X03的bit2位为1。;若是寄存器0X20不为零则产生循环。5.2.3.简易的循环设计1.FORLOOP的设计:如果用户想让同一段程序执行N次,用户可以利用一个寄存器为计数器,在程序执行前,先將计数寄存器设为N,然后每执行一次,计数器就減一,再跳为原區段执行,直到计数器被減至零。例:设计一个FORLOOP循环,让循环連續执行10次。MOVA,@0X0A;设A=0X0A。MOV0X10,A;设定计数值。计数寄存器LOOP:;为0X10。;;;DJZ0X10;递減计数寄存器,若计数JMPLOOP;值为0,则跳出循环。2.IF…THEN…程序设计:IF…THEN…的说法就是,如果…就做…。用户可以利用检查两个数值是否相等,例如”IFX=YTHENGOTOELSE”的格式,来完成这种功能。l例:判断两个寄存器(0X20,0X21)的数值是否相等,如果相等,就將标志寄存器设为1。BUFFER1==0X20;定义。BUFFER2==0X21FLAG==0X22MOVA,BUFFER1;將BUFFER1的值存入A中。XORA,BUFFER2;將A的值和BUFFER2的值做xorJBC0X03,2;IFBUFFER1=BUFFER2JMPFLAG_1;THENJMPFLAG_0;ELSEFLAG_0:MOVA,@0MOVFLAG,A;设定FLAG为0。JMPPROCESSFLAG_1:MOVA,@1MOVFLAG,A;设定FLAG为1。JMPPROCESSPROCESS:5.2.4.查表程序设计:在一个沒有規则性的内容转换中,查表程序是相当有用的,用户可以使用查表程序很快速的得到相关内容的转换。例:设计一个程序,將如下图所示中的PORT5读到的一个数值,将输入内容做转换,然后输出到PORT6的7段显示器上。上图中开关关闭,I/O引脚可以得到一个低电位,若是开关开启则I/O引脚可以得到一个高电位。图5.2数码管八段说明7段显示器的接线图如上,我們要編一个表做为读入内容以及输出内容的对映。7段显示器各脚位电位状态PORT6输出PORT5输入HGFEDCBA16进位数值10进位数值001111110X3F0000001100X061010110110X5B2010011110X4F3011001100X664011001100X6D5011111010X7D6000001110X077011111110X7F8011011110X6F9011101110X7710011111000X7C11010110000X5812010111100X5E13011110010X7914011100010X7115程序清单如下:PC==0X02;定义。PORT5==5PORT6==6ORG0X10;设定程序起始位址。MOVA,@0IOWPORT6;设定PORT6为Output口。MOVA,@0XFFIOWPORT5;设定PORT5为Input口。JMPSTART;跳转到主程序中。TABLE:;输入及输出对映表。ADDPC,ARETL@0X3FRETL@0X06RETL@0X5BRETL@0X4FRETL@0X66RETL@0X6DRETL@0X7DRETL@0X07RETL@0X7FRETL@0X6FRETL@0X77RETL@0X7CRETL@0X58RETL@0X5ERETL@0X79RETL@0X71START:MOVA,PORT5ANDA,@0X0FCALLTABLEMOVPORT6,AJMPSTART5.2.5.中断程序的设计在EM78X56系列的IC中有三种中断信号,分別是:TCC溢位中断。PORT6Change中断。外部信号中断。在说明中断使用方式之前,用户要了解中断寄存器,及与中断息息相关的控制寄存器(ControlRegister),另外在芯片中預除器(Prescalar)的使用方法,用户也需要住意。中断信号显示寄存器0X0F各位安排如下:BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0中断信号-----外部中断标志PORT6ChangeTCC溢位标志。寄存器0X0F使用到的有BIT0~BIT2。BIT0在TCC计時器计数溢位時就会被设定,用户可以根据0X0F的BIT0被设定而判定TCC计数溢位。跟TCC配合
本文标题:EM78系列单片机程序设计
链接地址:https://www.777doc.com/doc-5971589 .html