AVR单片机很简单:C语言快速入门及开发实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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端口的上拉电阻也被禁止。