stc8H1K08单片机设置引脚模式的函数
///设置引脚模式函数,pinModel=0 准双向口, pinModel=1 推挽输出(强上拉输出,可达20mA,要加限流电阻), pinModel=2 高阻输入(电流既不能流入也不能流出), pinModel=3 开漏模式(Open-Drain),内部上拉电阻断开开漏模式既可读外部状态也可对外输出(高电平或低电平)。
void setPinModel(unsigned char pinGroup, unsigned char pinID, unsigned char pinModel)
{
unsigned char PnM0 = 0;
unsigned char PnM1 = 0;
if(pinGroup>5||pinID>7||pinModel>3){
//给的值不合法
UART1_SendString("Set pin mode error\r\n");
return;
}
switch(pinGroup){
case 0:
PnM0 = P0M0;
PnM1 = P0M1;
break;
case 1:
PnM0 = P1M0;
PnM1 = P1M1;
break;
case 2:
PnM0 = P2M0;
PnM1 = P2M1;
break;
case 3:
PnM0 = P3M0;
PnM1 = P3M1;
break;
case 4:
PnM0 = P4M0;
PnM1 = P4M1;
break;
case 5:
PnM0 = P5M0;
PnM1 = P5M1;
break;
default:break;
}
PnM0 &= ~(0x01 << pinID);
PnM1 &= ~(0x01 << pinID);
PnM0 |= ((pinModel&0x01) << pinID);
PnM1 |= (((pinModel>>1)&0x01) << pinID);
switch(pinGroup){
case 0:
P0M0 = PnM0;
P0M1 = PnM1;
break;
case 1:
P1M0 = PnM0;
P1M1 = PnM1;
break;
case 2:
P2M0 = PnM0;
P2M1 = PnM1;
break;
case 3:
P3M0 = PnM0;
P3M1 = PnM1;
break;
case 4:
P4M0 = PnM0;
P4M1 = PnM1;
break;
case 5:
P5M0 = PnM0;
P5M1 = PnM1;
break;
default:break;
}
}
调用示例:
setPinModel(1, 0, 0x01); // 设置P1.0为推挽输出模式
setPinModel(2, 1, 0x02); // 设置P2.1为开漏输出模式
pinMode取值
0x00 准双向口(传统8051端口模式,弱上拉)灌电流可达20mA,拉电流为270~150μA(存在制造误差)。
0x01 推挽输出(强上拉输出,可达20mA,要加限流电阻)
0x02 高阻输入(电流既不能流入也不能流出)
0x03 开漏模式(Open-Drain),内部上拉电阻断开开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平。
===【开漏工作模式】,对外设置输出为 1,等同于 【高阻输入】===【开漏工作模式】【打开内部上拉电阻或外部加上拉电阻】,简单等同于 【准双向口】