AVR单片机状态寄存器SREG

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

AVR单片机原理及应用陈渊睿Tel:13002086301E-mail:ep02@163.com华南理工大学电力学院关于状态寄存器SREG1状态寄存器SREG(MCS51类似的寄存器为程序状态字PSW,有进位/借位CY,辅助进位AC,用户标志F0,溢出OV,奇偶标志P等)•其各标志位意义如下:I:全局中断触发禁止位,为中断总控制开关。将其清除,则禁止一切中断(但在异步工作方式下的T/C2的中断唤醒MCU功能除外)T:通用标志位,可将一对程序执行起重要作用(或常用)的标志位放在此处,通过对它测试,实现执行不同功能。如:可用BLD指令将T标志位76543210$3F($5F)ITHSVNZC送至寄存器某位,或用BST指令将寄存器某位存于T标志位,实现快速检测判断H:半进位标志位,指示加、减运算时,低四位向高四位产生的进(借)位。以其与进位C配合,可实现十进制加减法运算软件调整(DAA)功能;或用于十进制数增1(如数字钟)调整场合S:符号标志位,S=NV,在正常运算条件下(V=0,不溢出)S=N,即运算结果最高位作为符号是正确的。而当产生溢出时V=1,此时N已不能正确指示运算结果之正负,但S=NV仍是正确的。对于单(或多)字节有符号数据来说,执行减法或比较操作之后,S标志能正确指示参与相减或比较的两个数的大小V:溢出标志位,模2补码(即符号数)加、减运算溢出之标志,溢出表示运算结果超过了符号数所能表示的范围(-128~+127)。加法溢出表现为正+正=负,或负+负=正;减法溢出表现为正-负=负,或负-正=正。溢出时,运算结果最高位(即N)取反才是真正的结果符号。例如:$30+$50=$80,正+正=负,溢出$80+$90=$10,负+负=正,也为溢出N:负数标志位,直接取自运算结果最高位。N=1时运算结果为负,否则为正。但溢出时不能表示真实结果(见上条对溢出标志的说明)。Z:零标志位,用以标示数据算术运算或逻辑运算结果是否为零,或多字节数据算术运算(包括比较)结果是否为零。运算(比较)结果为零(即所有位都清除)时,Z标志置位。就字节型数据运算结果来说,Z的逻辑表达式为Z=/R7·/R6·/R5·/R4·/R3·/R2·/R1·/R0C:进/借位标志位,标志加法产生的进位,或减法产生的借位。多字节加、减法(包括比较)运算时,通过C将产生的进位或借位提供给高位字节,以实现多字节正确相加或相减。C也是判断相减(比较)两个无符号数大小的标志。多字节移位操作时以C传递衔接。•对全部标志位都可进行置位、清位操作;都可检测各标志位,以检测结果决定程序走向,引出繁多的条件转移指令。•标志位很重要,对运算结果的判断处理,要以相应标志位为依据。它们也是分支、循环走向的路标。初学者因为不熟悉指令系统,编程时要时时检索各指令功能及其执行后对标志位的影响,故要熟记才能提高编程的速度和质量。例:ADD运算时各标志位定义对于其它指令,C,Z,V,H定义式可能不同2执行指令对标志位的影响各类指令对标志位的影响归纳如下:①8位加减法(包括带/不带进(借)位的加、减法,以及求补和带/不带借位比较等)指令,影响标志位HSVNZC。②字加/减立即数(0~63)指令和求反指令不影响标志位H。③增、减1指令不影响标志位C和H。④逻辑运算指令都不影响标志位C和H,但清除溢出标志位V。其中CLR指令还清除标志位S、N,并使Z=1。关于状态寄存器SREG⑤逻辑左移和循环左移指令同8位加法指令一样影响标志位HSNVZC。逻辑右移和循环右移指令以及算术右移指令都不影响半进位标志H,但由于这些指令的特殊性,对标志位的影响面可进一步缩小或可简化。如算术右移指令不影响标志位S和N,并使V=0;逻辑右移指令清除标志位N,使S=V等等。⑥转移指令中除中断返回指令RETI会置位全局中断控制标志位外,其他指令都不影响标志位。⑦数据传送指令如不向状态寄存器SREG输出数据,对标志位无影响。⑧位操作指令只影响作为操作对象的标志位。关于状态寄存器SREG关于状态寄存器SREG3标志位与运算结果的关系•运算时,计算机按二进制(或十六进制)逐位运算得到结果,但会给出相应标志,以让用户判断结果是否正确。一般地,无符号数运算结果是否正确只需看C和Z,而符号数运算要看N、V、(S)和Z。(半进位标志H主要用于十进制运算调整)例1:加法$30+$50=$80运算后C=0,Z=0,N=1,V=1,S=0作为无符号数加法时,C=0(无进位),结果正确作为符号数加法时,V=1(溢出),N=1(负数),不正确,应软件修正(如用2个字节表示,S=0,应为正数$0080)3标志位与运算结果的关系例2:$80+$90=$10运算后,C=1,Z=0,N=0,V=1,S=1作为无符号数运算时,C=1(有进位)应加到高字节,否则结果不正确作为符号数运算时,V=1(溢出),N=0(正数),不正确,应软件修正(如用2个字节表示,S=1,应为负数$FF10)-128+-112=-240例3:$EB+$CA=$B5运算后,C=1,Z=0,N=1,V=0,S=1,H=1作为无符号数运算时,C=1(有进位)应加到高字节,否则结果不正确作为符号数运算时,V=0(未溢出),N=1(负数),S=1(=N),结果正确,不必修正(-21+-54=-75)关于状态寄存器SREG4用软件实现十进制加、减法调整子程序的设计方法(即软件DAA)•计算机采用的十进制操作数一般为压缩型8421BCD码.每个BCD代表1位十进制数,每2位BCD码共存于同一字节单元中。BCD运算涉及状态寄存器中的进位C和半进位H,它们分别为高、低位BCD的进(借)位。在进行BCD码的加/减运算时,计算机是按二进制数对待的,因此会产生与十进制运算规则不相符合的情况:关于状态寄存器SREG①当产生进(借)位(C=1或H=1)时,该进(借)位等于16(对涉及的一位BCD码而言),而在十进制运算时应等于10,二者相差6。②可能产生非法BCD码($A~$F)。产生原因有二:一是在十进制加法运算时,该产生进位而按二进制运算却不能产生进位,使和成为非法BCD码;二是相减产生借位时,借位应为10而按二进制运算为16,使差多6并可能使差变为非法BCD码。软件DAA即为纠正以上“错误”而设。从以上说明看到,“纠错”的方法是做加/减6调整以及解决相关问题。关于状态寄存器SREG(1)加法DAA经实践考察,BCD码加法运算可产生以下3种情况,注意这里讲的进位是对C和H的泛指。①不须调整。特点是既不产生进位,也不产生非法BCD,如$22+$11=$33。②产生非法BCD,必须对非法BCD加6调整。特点是BCD码相加后不产生进位,但加6调整后产生进位,如$36+$37=$6D,加$06调整后变为$73(产生半进位H)。$68+$87=$EF,加$66调整后变为$155(产生进位C和半进位H)等。关于状态寄存器SREG③产生进位,必须加6调整。特点是BCD码相加只产生进位,不会同时产生非法BCD码;而加6调整后既不会再产生进位(而是清除了原来的进位),也不会产生非法BCD。例$99+$99=$132,进位C和半进位H都置位,故加$66来调整:$32+$66=$98,并要恢复进位C。综合以上3种情况,得出下面加法DAA之实现方法:首先保存BCD码相加后的状态寄存器SREG(保存其中的进位C和半进位H,分别称为Co和Ho),再将BCD码之和加上立即数$66,产生出新的进位Cn和半进位Hn。关于状态寄存器SREG•若Co、Cn中有一个置位(只能有一个),说明高位BCD满足调整条件并调整完毕;否则为不够调整条件,应减$60恢复。若Ho、Hn中有一个置位(只能有一个),说明低位BCD满足调整条件并调整完毕;否则为不够调整条件,应减6恢复。程序中是将新旧进位、半进位对应或起来,只对或结果进行判断。注意,软件DAA功能既要保证本字节压缩BCD码相加值的正确性,又要保证对高位BCD产生进位的正确性,故要将Co∨Cn的结果返还给SREG中的进位C,使下一步能正确实现高位字节BCD带进位加。•ADDAA为BCD码相加调整子程序,使用寄存器R16作为工作单元,使用R17、R6两个寄存器作为辅助工作单元,所有调整工作都在R16中进行关于状态寄存器SREG关于状态寄存器SREG(2)减法DAA由实践可知,减法DAA要比加法来得简单:只须对产生借位(泛指C和H)的BCD码进行调整。BCD码减法运算,只有以下两种情况:①不产生借位,不须调整,如$22-$11=$11。②产生借位,此时不论有否非法BCD码产生,一律对产生借位的BCD做减6调整,但减6清除了借位。如果清除了高位BCD的借位C,必须将其恢复,以保证下一步实现高位字节BCD的正确相减。例如$22-$54=$CE,因C、H皆置位,用减去$66调整,$CE-$66=$68。调整后清除了借位C,要加SEC指令将其恢复。关于状态寄存器SREG关于状态寄存器SREG

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功