本帖最后由 dj狂人 于 2015-1-8 23:44 编辑
ADuC7026有 40 个通 用 双 向 I/O(GPIO)引脚。所有I/O引脚都兼容5V电压,即GPIO支持5V输入电压。默认情况下,GPIO引脚配置为通用I/O引脚。每一个GPIO引脚都有一个内部的上拉电阻(约为100 kΩ)。可以使用GPxPAR寄存器控制以下端口是否使用内部上拉电阻:P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口。
现在我们来看下ADuc7026的引脚当做GPIO用时要进行一些什么样的操作。
有关GPIO的寄存器共有CPxPAR、GPxSET、GPxCLR、GPxDAT、GPxCON五个寄存器,其中
GPxPAR(x=0,1)用来设置P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口是否使用内部上拉电阻,详细请看数据手册
GPxCON (x=0,1,2,3,4)进行对GPIO的功能进行选择,如设置成GPIO/CMP/MS0等,具体的请看数据手册,帖子后面有上传。
GPxDAT(x=0,1,2,3,4)是端口x的配置和数据寄存器。它们用来配置端口x的GPIO引脚方向,为配置成输出的引脚设置输出值,并为配置成输入的引脚保存输入值。它是一个32位的寄存器。其中 31~24用来设置数据传输方向位。置 1 , GPIO 引脚作为输出。清 0 ,GPIO 引脚作为输入。当x端口配置为输出时,可通过23~16八个位对x端口的八个引脚进行操作,置一时输出高电平,置零时输出电平。而x端口配置为输入时,可通过7~0这八个位读取x端口的八个引脚的电平状态。剩下的15~8 复位时端口 x 引脚的状态 ( 只读 ) 。
GPxSET (x=0,1,2,3,4) 是端口x的数据置位寄存器,其中 31:24 保留。 23:16 端口 x 置位。置 1 ,端口 x 相对应的位被置位,同时GPxDAT 寄存器相关的位也被置位。 清 0 不影响数据输出。 15:0 保留。
GPxCLR (x=0,1,2,3,4)是端口x的数据清0寄存器,其中 31:24 保留。 23:16 端口 x 清 0 位。置 1 ,端口 x 相对应的位被清 0 ,同时 GPxDAT 寄存器相关的位也被清 0 。清 0 不影响数据输出。 15:0 保留。
好,现在我们来点亮一盏LED看看
int main(void) { //GPxPAR 是设置P0.0、P0.4、P0.5、P0.6、P0.7及P1的8个GPIO口是否使用内部上拉电阻,这里没用到 /*GPxCON 是进行功能选择(选择GPIO是作为普通引脚还是用作PWM、UARt等),因为默认所有GPIO都当做普通I/O使用,所以这里也不用对GPxCON 寄存器进行设置*/ GP2DAT = 0xfff30000;//设置P2为输出并把P2.3、P2.2电平置底 // 1111 1111 1111 0011 0000 0000 0000 0000 /*31~24全置一,所以P2所有引脚配置为输出,23~16 为 1111 0011,把P2.3、P2.2引脚置底,所以相接的LED就点亮了*/ while(1); }
我的板上LED另一端接VCC,所以只要把I/O引脚拉低就可以点亮LED,就这样,点亮LED便完成了。
当然如果后面还想对P2的某个引脚进行置一或置零操作的话,可这样
GP2SET = 0x00010000;//把 P2.0 电平置高
GP2CLR = 0x00010000;//把 P2.0 电平置底
那么当 I/O 作输入的时候,想要读取某个引脚的电平的话,可以这样
if(GP2DAT & 0x00000001); //判断P2.0引脚的电平,注意作输出的时候是对GP2DAT的23~16进行写操作,而作输入则是对7~0这八个位读取I/O相应引脚的电平状态。
下面上两个图看下现象:
|