本帖最后由 芯圣电子官方QQ 于 2023-7-24 14:50 编辑
不用记那么多寄存器的名称了,直接输入管脚号和管脚状态就可以了。例子在最下面几行
变量 P 被厂家用了,只能使用GPIO了。
本函数占用约200字节,地方不够的慎用
void GPIO(u8 m,u8 n) //HC89S003F4管脚快速设置函数by abin 。 m为管脚 P0.1=01 P1.0=10 等,n为管脚状态,见上面或数据手册说明
{
switch (m)
{
case 00:P0M0 = P0M0&0xF0|n;break;
case 01:P0M0 = P0M0&0x0F|(n*16);break;
case 02:P0M1 = P0M1&0xF0|n;break;
case 03:P0M1 = P0M1&0x0F|(n*16);break;
case 04:P0M2 = P0M2&0xF0|n;break;
case 05:P0M2 = P0M2&0x0F|(n*16);break;
case 06:P0M3 = P0M3&0xF0|n;break;
case 07:P0M3 = P0M3&0x0F|(n*16);break;
case 20:P2M0 = P2M0&0xF0|n;break;
case 21:P2M0 = P2M0&0x0F|(n*16);break;
case 22:P2M1 = P2M1&0xF0|n;break;
case 23:P2M1 = P2M1&0x0F|(n*16);break;
case 24:P2M2 = P2M2&0xF0|n;break;
case 25:P2M2 = P2M2&0x0F|(n*16);break;
case 26:P2M3 = P2M3&0xF0|n;break;
case 27:P2M3 = P2M3&0x0F|(n*16);break;
case 10:P1M0 = P1M0&0xF0|n;break;
case 11:P1M0 = P1M0&0x0F|(n*16);break;
default:break;
}
}
/****************
n参数说明
0 0x00, //!<0000输入(无SMT)
1 0x01, //!<0001带下拉输入(无SMT) P2.3/P2.4/P2.5/P2.7不支持此功能
2 0x02, //!<0010带上拉输入(无SMT) P2.3/P2.4/P2.5/P2.7不支持此功能
3 0x03, //!<0011带模拟输入
4 0x04, //!<0100输入(SMT)
5 0x05, //!<0101带下拉输入(SMT)
6 0x06, //!<0110带上拉输入(SMT)
7 0x07, //!<0111带上下拉模拟输入 仅P2.3/P2.4/P2.5/P2.7支持此功能
8 0x08, //!<1x00推挽输出,x默认为0
9 0x09, //!<1x01开漏输出
10 0x0A, //!<1x10带上拉开漏输出
11 0x0B, //!<1x11保留(推挽输出)
**************/
使用对比举例
P2M0 = P2M0&0x0F|0x80; //P21设置为推挽输出
GPIO(21,8);
P0M1 = P0M1&0x0F|0x20; //P03设置为上拉输入
GPIO(03,2);
|
*16,不要这样用,用移位好点