资源描述:
《avr单片机状态寄存器sreg》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、AVR单片机原理及应用陈渊睿Tel:13002086301E-mail:ep02@163.com华南理工大学电力学院关于状态寄存器SREG1状态寄存器SREG(MCS51类似的寄存器为程序状态字PSW,有进位/借位CY,辅助进位AC,用户标志F0,溢出OV,奇偶标志P等)其各标志位意义如下:I:全局中断触发禁止位,为中断总控制开关。将其清除,则禁止一切中断(但在异步工作方式下的T/C2的中断唤醒MCU功能除外)T:通用标志位,可将一对程序执行起重要作用(或常用)的标志位放在此处,通过对它测试,实现执行不同功能。如:可用BLD
2、指令将T标志位76543210$3F($5F)ITHSVNZC送至寄存器某位,或用BST指令将寄存器某位存于T标志位,实现快速检测判断H:半进位标志位,指示加、减运算时,低四位向高四位产生的进(借)位。以其与进位C配合,可实现十进制加减法运算软件调整(DAA)功能;或用于十进制数增1(如数字钟)调整场合S:符号标志位,S=NV,在正常运算条件下(V=0,不溢出)S=N,即运算结果最高位作为符号是正确的。而当产生溢出时V=1,此时N已不能正确指示运算结果之正负,但S=NV仍是正确的。对于单(或多)字节有符号数据来说,执行减
3、法或比较操作之后,S标志能正确指示参与相减或比较的两个数的大小V:溢出标志位,模2补码(即符号数)加、减运算溢出之标志,溢出表示运算结果超过了符号数所能表示的范围(-128~+127)。加法溢出表现为正+正=负,或负+负=正;减法溢出表现为正-负=负,或负-正=正。溢出时,运算结果最高位(即N)取反才是真正的结果符号。例如:$30+$50=$80,正+正=负,溢出$80+$90=$10,负+负=正,也为溢出N:负数标志位,直接取自运算结果最高位。N=1时运算结果为负,否则为正。但溢出时不能表示真实结果(见上条对溢出标志的说明
4、)。Z:零标志位,用以标示数据算术运算或逻辑运算结果是否为零,或多字节数据算术运算(包括比较)结果是否为零。运算(比较)结果为零(即所有位都清除)时,Z标志置位。就字节型数据运算结果来说,Z的逻辑表达式为Z=/R7·/R6·/R5·/R4·/R3·/R2·/R1·/R0C:进/借位标志位,标志加法产生的进位,或减法产生的借位。多字节加、减法(包括比较)运算时,通过C将产生的进位或借位提供给高位字节,以实现多字节正确相加或相减。C也是判断相减(比较)两个无符号数大小的标志。多字节移位操作时以C传递衔接。对全部标志位都可进行置位
5、、清位操作;都可检测各标志位,以检测结果决定程序走向,引出繁多的条件转移指令。标志位很重要,对运算结果的判断处理,要以相应标志位为依据。它们也是分支、循环走向的路标。初学者因为不熟悉指令系统,编程时要时时检索各指令功能及其执行后对标志位的影响,故要熟记才能提高编程的速度和质量。例:ADD运算时各标志位定义对于其它指令,C,Z,V,H定义式可能不同2执行指令对标志位的影响各类指令对标志位的影响归纳如下:①8位加减法(包括带/不带进(借)位的加、减法,以及求补和带/不带借位比较等)指令,影响标志位HSVNZC。②字加/减立即数
6、(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会置位全局中断控制标志
7、位外,其他指令都不影响标志位。⑦数据传送指令如不向状态寄存器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(无进位
8、),结果正确作为符号数加法时,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(有进位)应加到高字节,否则结果不正确