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