(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
/* 利用“位带操作”,来实现单个位的操作*/
#define BITBAND( addr,bitnum ) ( (addr & 0XF0000000) + 0X2000000 + ( (addr & 0XFFFFF)<<5 )+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR( addr,bitnum ) MEM_ADDR(BITBAND(addr , bitnum))
// IO映射
#define GPIOA_ODR_Addr ( GPIOA_BASE + 12 )
#define GPIOB_ODR_Addr ( GPIOB_BASE + 12 )
#define GPIOC_ODR_Addr ( GPIOC_BASE + 12 )
#define GPIOD_ODR_Addr ( GPIOD_BASE + 12 )
#define GPIOE_ODR_Addr ( GPIOE_BASE + 12 )
#define GPIOF_ODR_Addr ( GPIOF_BASE + 12 )
#define GPIOG_ODR_Addr ( GPIOG_BASE + 12 ) //这里是PA-PG的7组输出的地址设置
#define GPIOA_IDR_Addr ( GPIOA_BASE + 8 )
#define GPIOE_IDR_Addr ( GPIOE_BASE + 8 ) //这里是用到PA,PE的2组输入的地址设置
#define PAout(n) BIT_ADDR( GPIOA_ODR_Addr,n )
#define PBout(n) BIT_ADDR( GPIOB_ODR_Addr,n )
#define PCout(n) BIT_ADDR( GPIOC_ODR_Addr,n )
#define PDout(n) BIT_ADDR( GPIOD_ODR_Addr,n )
#define PEout(n) BIT_ADDR( GPIOE_ODR_Addr,n )
#define PFout(n) BIT_ADDR( GPIOF_ODR_Addr,n )
#define PGout(n) BIT_ADDR( GPIOG_ODR_Addr,n )//这里是PA-PG的7组中每一位的输出设置,n是0-15
#define PAin(n) BIT_ADDR( GPIOA_IDR_Addr,n )
#define PEin(n) BIT_ADDR( GPIOE_IDR_Addr,n )//这里是PA,PE的2组中每一位的输入设置,n是0-15
补:暂时就这些吧,我先学习到了这里,加上以前用的不多还真没注意那些I/O 的详细用法,只是用到的时候的一些设置,如果好用就那样不改了,现在看起来可能用的不标准,后面学到了更详细的在回来修改补充吧,寄存器目前看着有点晕乎,等以后使用时候再添加吧,毕竟我记得当时设计液晶的显示的时候,采用了并口通讯,因为管脚是已连续的,所以对于8位的输入输出,使用了寄存器设置。