2.2 I/O寄存器
I/O寄存器占据了通用寄存器后面的最高64个字节的数据存储空间,每一个寄存器都提供了对MCU内部的I/O外设的控制寄存器或数据寄存器的访问。程序员或以使用I/O寄存器来作为MCU内部的I/O外设的接口。
2.2.1 I/O寄存器的操作特点
ATmega128单片机的所有I/O和外设值都放置在I/O空间中,通过这些寄存器可以了解CPU及其外设的运行状态和控制CPU及其外设的动作和行为。
对于不同的地址,分别使用不同的指令来访问:
①LD/LDS/LDD和ST/STS/STD指令,可以访问全部的I/O地址;
②SBI和CBI指令,可直接进行位寻址地址为$00~$1F的I/O寄存器;
③SBIS和SBIC指令,则用来检查单个位置位与否;
④IN和OUT指令,访问地址在$00~$1F之间的寄存器。
如果要像SRAM一样通过LD和ST指令访问I/O寄存器,相应的地址要加上$20。
当ATmega128工作于ATmega103兼容模式时,扩展的I/O被SRAM所取代。为了与后续产品兼容,保留未用的位应写“0”,而保留的I/O寄存器则不应进行写操作。一些普遍存在态标志位的清除是通过写“1”来实现的。
2.2.2 I/O寄存器的C语言程序
在ICCAVR中访问地址$0020~$005F之间的I/O寄存器,可以使用内汇编和预处理宏。
向端口A的输出位输出数据的方式如下:
PORTA= 0x22;//sets the second bit of port A //and clears the orher seven port A
从端口A的输入位读取数据的方式如下:
x= PINA; //reads all 8 pins of port A
在这个例子中x会包含所有端口A的位值,不管输入还是输出,因为PINA寄存器反映的是端口中所有位的值。
输入引脚都是悬空的,即不必为每个相关的端口引脚加入上拉电阻。如果需要加入上拉电阻,MCU可以将相应的端口驱动寄存器的相应位置1。程序如下所示:
DDRT= 0xF0; //upper 2 bits as output ,lower 6 as input PORTA= 0x30; //enale internal pull-ups on lowest 2 bits
2.2.3 特殊功能I/O寄存器(SFIOR)
SFIOR各位的定义如下:
Bit2(PUD):禁止上拉电阻。
置位时,即使将寄存器DDxn和PORTxn配置为使能上拉电阻({DDxn,PORTxn}=0b01),I/O端口的上拉电阻也被禁止。