打印
[通用8051核FLASH系列]

HC89S003F4管脚快速设置函数GPIO,方便懒人

[复制链接]
1980|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abin88|  楼主 | 2018-5-22 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 芯圣电子官方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);





评论
chongdongchen 2018-5-23 09:24 回复TA
*16,不要这样用,用移位好点 
沙发
chongdongchen| | 2018-5-23 09:23 | 只看该作者
51核就这样,寄存器操作不方便

使用特权

评论回复
板凳
xiaoqizi| | 2018-6-22 11:44 | 只看该作者
源码可参考性很高啊

使用特权

评论回复
地板
hayppy| | 2018-8-4 15:16 | 只看该作者
请问端口模式配置位的(SMT)是什么意思??

使用特权

评论回复
5
abin88|  楼主 | 2019-4-25 19:47 | 只看该作者
hayppy 发表于 2018-8-4 15:16
请问端口模式配置位的(SMT)是什么意思??

SMT 施密特触发器

使用特权

评论回复
6
yzq13246068880| | 2019-4-29 08:28 | 只看该作者
直接套用就可以啦?

使用特权

评论回复
7
snowdpq| | 2019-4-30 13:34 | 只看该作者
typedef enum
{
        GPIO_MODE_IN                    = ((u8)0x00),         //数字输入
        GPIO_MODE_IN_PD              = ((u8)0x01),         //带下拉输入
        GPIO_MODE_IN_PU              = ((u8)0x02),         //带上拉输入
        GPIO_MODE_IN_AN              = ((u8)0x03),         //模拟输入
        GPIO_MODE_IN_SMT            = ((u8)0x04),         //数字输入   SMT
        GPIO_MODE_IN_PD_SMT      = ((u8)0x05),         //带下拉输入 SMT
        GPIO_MODE_IN_PU_SMT      = ((u8)0x06),         //带上拉输入 SMT
        GPIO_MODE_IN_AN_PU_PD  = ((u8)0x07),         //模拟输入上下拉同时打开,B版以后芯片支持
        GPIO_MODE_OUT_PP           = ((u8)0x08),         //推挽输出
        GPIO_MODE_OUT_OD          = ((u8)0x09),         //开漏输出
        GPIO_MODE_OUT_OD_PU    = ((u8)0x0a)          //开漏带上拉输出
}GPIO_Mode_TypeDef;


端口模式改成这样,可读性更高

使用特权

评论回复
8
ylslib| | 2019-4-30 23:44 | 只看该作者
chongdongchen 发表于 2018-5-23 09:23
51核就这样,寄存器操作不方便

确实是,还没有直接操作方便呢,这样用库麻烦

使用特权

评论回复
评论
chongdongchen 2019-5-1 13:07 回复TA
主要是寄存器无法用指针操作不方便 
9
ylslib| | 2019-4-30 23:44 | 只看该作者
chongdongchen 发表于 2018-5-23 09:23
51核就这样,寄存器操作不方便

确实是,还没有直接操作方便呢,这样用库麻烦

使用特权

评论回复
10
ylslib| | 2019-4-30 23:45 | 只看该作者
abin88 发表于 2019-4-25 19:47
SMT 施密特触发器

这个SMT有什么用呢?按键吗?

使用特权

评论回复
11
abin88|  楼主 | 2019-5-30 18:35 | 只看该作者
ylslib 发表于 2019-4-30 23:45
这个SMT有什么用呢?按键吗?

搜搜  施密特触发器  看看就知道了

使用特权

评论回复
12
hsl1888| | 2019-6-10 20:22 | 只看该作者
速度慢,每一脚須判断case更改。有無一次可改一埠或直接定址更改不用case條件

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

42

帖子

1

粉丝