NXP半导体P89LPC900系列单片机(6倍速80C51内核)的I/O可以配置为可选的4种模式:准双向、推挽输出、仅为输入、开漏。在复位后,所有I/O端口都默认为输入状态。P0、P1、P2、P3端口每根管脚的工作模式由P0M1、P0M2、P1M1……P3M2等8个寄存器来决定,具体配置方法如下表所示:
======================= PxM1.y PxM2.y 端口模式 ----------------------- 0 0 准双向 0 1 推挽 1 0 仅为输入(高阻) 1 1 开漏 =======================
例如,将P0.1配置为推挽模式: P0M1 &= 0xFD; P0M2 |= 0x02;
但是,存在一个问题,如果没有把I/O配置表熟练地背诵下来,则编写程序时还要去翻《数据手册》,很不方便。经过仔细考虑,我编制出了一个P89LPC935的I/O配置头文件,可以方便地把I/O管脚配置为所需要的模式。
/****************************************************************************** IOCFG935.H NXP-P89LPC935的I/O配置头文件 说明: P89LPC9xx的I/O端口可以配置为4种模式:准双向、推挽输出、高阻输入、开漏 复位后,所有I/O端口默认为高阻输入状态 运用本头文件中定义的宏函数可以方便地将I/O配置成所需要的模式 注意: P1.2(SCL,T0) 作为输出时只能配置为开漏模式 P1.3(SDA,/INT0) 作为输出时只能配置为开漏模式 P1.5(/RST) 只能配置成仅为输入模式 ******************************************************************************/
#ifndef IOCFG935_H #define IOCFG935_H
#define PIN0 0x01 #define PIN1 0x02 #define PIN2 0x04 #define PIN3 0x08 #define PIN4 0x10 #define PIN5 0x20 #define PIN6 0x40 #define PIN7 0x80
//将所选I/O配置为准双向I/O模式 #define QuasiBidir(Port,Pins) { Port##M1 &= ~(Pins); Port##M2 &= ~(Pins); }
//将所选I/O配置为推挽输出模式 #define PushPull(Port,Pins) { Port##M1 &= ~(Pins); Port##M2 |= (Pins); }
//将所选I/O配置为仅为输入模式 #define InputOnly(Port,Pins) { Port##M1 |= (Pins); Port##M2 &= ~(Pins); }
//将所选I/O配置为开漏I/O模式 #define OpenDrain(Port,Pins) { Port##M1 |= (Pins); Port##M2 |= (Pins); }
/****************************************************************************** 参数说明: Port:8位并行I/O端口,可以取P0、P1、P2或P3 Pins:所选I/O管脚,可以取PIN0~PIN7,或者它们之间的任意“逻辑或”组合 用法举例: PushPull(P0, PIN1); //将P0.1配置为推挽模式 OpenDrain(P1, PIN2 | PIN3); //将P1.2和P1.3同时配置为开漏模式 ******************************************************************************/
#endif //IOCFG935_H
相关链接:http://blog.21ic.com/user1/617/archives/2007/41963.html |