几乎任何MCU芯片都具有通用I/O,编程方法也类似。本节给出GP32的通用I/O。GP32有5个通用I/O口,分别是A口、B口、C口、D口、E口。它们中的大部分具有多个功能,本节仅讨论它们作为通用I/O功能时的编程方法。作为通用I/O口,它们的每一个引脚均可通过相应口的“数据方向寄存器”独立地设置为输入或输出。对于被定义为输入的引脚,若是在A口、C口、D口中,还可通过相应口的“上拉电阻允许寄存器”独立地设置其有无内部上拉电阻。被定义为输出的引脚,一律无上拉电阻。
4.2.1 A口
A口的8根引脚与键盘中断模块的引脚复用,这里只讨论A口作为通用I/O口的功能。
1.A口的寄存器
A口作为通用I/O口时,具有三个寄存器,它们是:A口数据方向寄存器(DDRA)、A口数据寄存器(PTA)、A口上拉电阻允许寄存器(PTAPUE)。
(1) A口数据方向寄存器(Data Direction Register A,DDRA)
A口数据方向寄存器(DDRA)的地址是:$0004,DDRA的第7~0位分别记为DDRA7~DDRA0,这些位分别控制着A口引脚PTA7~PTA0是输入还是输出,若DDRAx=0,则引脚PTAx为输入,若DDRAx=1,则引脚PTAx为输出。复位时DDRA为$00。
记忆要点:数据方向寄存器的一位:0—定义输入;1—定义输出。
(2) A口数据寄存器(Port A Data Register,PTA)
A口数据寄存器(PTA)的地址是:$0000,PTA的第7~0位分别记为PTA7~PTA0。若A口的某一引脚PTAx被定义成输出,程序使A口数据寄存器PTA的相应位PTAx=0,则引脚PTAx输出“低电平”;程序使PTAx=1,则引脚PTAx输出“高电平”。若A口的某一引脚PTAx被定义成输入,程序通过读取A口数据寄存器PTA,获得输入情况,0表示输入为“低电平”,1表示输入为“高电平”。
记忆要点:
输出时:数据寄存器的一位:0—输出低电平;1—输出高电平。
输入时:数据寄存器的一位:0—代表外部输入低电平;1—代表外部输入高电平。
(3) A口上拉电阻允许寄存器(Port A Input Pullup Enable Register,PTAPUE)
A口上拉电阻允许寄存器(PTAPUE)的地址是:$000D。PTAPUE的第7~0位分别记为PTAPUE7~PTAPUE0。若A口的某一引脚PTAx 被定义成输入,则可通过置PTAPUE的相应位PTAPUEx为1来定义其内接上拉电阻,即引脚PTAx已经通过内部电阻与电源VDD相接,此时若引脚PTAx通过开关接地,则开关闭合时为低电平,那么寄存器PTA的相应位PTAx=0;开关断开时为高电平,寄存器PTA的相应位PTAx=1,通过读取寄存器PTA获得开关状态。
记忆要点:
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:
0—没有内部上拉电阻;1—有内部上拉电阻。
2.A口逻辑电路框图
图4-3 A口的一个引脚内部逻辑电路框图
图4-3给出了A口作为通用I/O使用时,一个外部引脚的相应内部逻辑电路框图。当DDRAx=1时,读地址$0000就是读PTAx。当DDRAx=0时,读地址$0000就是读引脚PTAx 电平。不论数据方向寄存器位DDRAx的值如何,对寄存器PTA写入总是可以的。但在引脚作为输入时,即DDRAx=0时,写入只影响数据寄存器PTA,并不影响引脚PTAx。

B口的8根引脚与8路A/D转换模块的引脚复用,这里只讨论B口作为通用I/O口的功能。
1.B口的寄存器
B口作为通用I/O口时,具有二个寄存器,它们是:B口数据方向寄存器(DDRB)和B口数据寄存器(PTB)。
(1) B口数据方向寄存器(Data Direction Register B,DDRB)
B口数据方向寄存器(DDRB)的地址是:$0005,DDRB的第7~0位分别记为DDRB7~DDRB0,这些位分别控制着B口引脚PTB7~PTB0是输入还是输出,若DDRBx=0,则引脚PTBx为输入,若DDRBx=1,则引脚PTBx为输出。复位时DDRB为$00。
(2) B口数据寄存器(Port B Data Register,PTB)
B口数据寄存器(PTB)的地址是:$0001,PTB的第7~0位分别记为PTB7~PTB0。若B口的某一引脚PTBx被定义成输出,程序使B口数据寄存器PTB的相应位PTBx=0,则引脚PTBx输出“低电平”,程序使PTBx=1,则引脚PTBx输出“高电平”。若B口的某一引脚PTBx被定义成输入,程序通过读取B口数据寄存器PTB,获得输入情况,0表示输入为“低电平”,1表示输入为“高电平”。
注意:B口被定义成输入时,没有内部上拉电阻。
2.B口逻辑电路框图
图4-4给出了B口作为通用I/O使用时,一个外部引脚的相应内部逻辑电路框图。与图4-3的区别在于图4-4中没有内部上拉电阻部分,其余部分相同。功能也类似,在此不再重复说明,可以作相似的理解。

4.2.3 C口、D口和E口
作为通用I/O口使用时,C口、D口的功能以及用法与A口类似,E口与B口类似。
表4-1描述了C、D、E这3个通用I/O口。



