找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5123|回复: 27
收起左侧

分享一个设置STC系列单片机端口模式的头文件

  [复制链接]
ID:624769 发表于 2021-9-3 22:56 | 显示全部楼层 |阅读模式
此头文可以比较方便快捷的按位来设定每个端口的模式,可以给初学者带来不少便利。

IO口模式设置时,从左至右为从高到低 7~0 端口, “O”为大写字母“O”,不是数字“0”,4位之间用下划线“_”分割。
D 准双向
H 高阻状态
P 强推挽
O 开漏模式

include 此头文件以后,设置时可以直接用  PxMode 取代原来的  PxM0,以及 PxM1

设置示例:         
P5Mode = DDHO_DDDD;   即,设置P55 为高阻,P54 为开漏,其他IO为准双向。

P1Mode = DDDD_HHDP;    即,设置 P10 为推挽,P12,P13为高阻,其他IO为准双向。
以此类推。

51hei.png 51hei.png

下载: PortMode.rar (13.56 KB, 下载次数: 144)

评分

参与人数 2黑币 +62 收起 理由
catlu + 12
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:262 发表于 2021-9-3 23:11 | 显示全部楼层
有了这个真方便,这是官方出的吗?
回复

使用道具 举报

ID:624769 发表于 2021-9-3 23:21 | 显示全部楼层
heicad 发表于 2021-9-3 23:11
有了这个真方便,这是官方出的吗?

不是,是以前有断时间经常改板子,换端口,改PxM0, PxM1不胜其烦,想要像用二进制头文件一样,直观改端口,就自己做了一个头文件。今天逛论坛,正好看到一个分享端口设置XLS文件的帖子。觉得可能有人需要这样的头文件,就拿出来分享一下了。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:277290 发表于 2021-9-4 08:15 | 显示全部楼层
有了这个方便多了,简单易记,谢谢分享!
回复

使用道具 举报

ID:64089 发表于 2021-9-4 08:36 | 显示全部楼层
这个还真是很实用,谢谢分享。
回复

使用道具 举报

ID:220936 发表于 2021-9-4 10:51 | 显示全部楼层
真不错,实用
回复

使用道具 举报

ID:88606 发表于 2021-9-4 14:53 | 显示全部楼层
真的实用啊!
回复

使用道具 举报

ID:884042 发表于 2022-3-30 19:40 | 显示全部楼层
好家伙,里面那么多宏定义,编写者肛了多久啊
回复

使用道具 举报

ID:333678 发表于 2022-3-31 07:22 来自手机 | 显示全部楼层
感谢楼主分享,很实用。
回复

使用道具 举报

ID:468878 发表于 2022-3-31 08:35 | 显示全部楼层
这很方便的,懒得翻手册了。
回复

使用道具 举报

ID:170318 发表于 2022-3-31 09:03 | 显示全部楼层
有这个,确实是简单、实用、方便
回复

使用道具 举报

ID:383215 发表于 2022-3-31 15:36 | 显示全部楼层
非常佩服楼主的执著,个人认为没有必要,每次配置端口都要看手册,的确很麻烦。
dk.jpg
好记性不如烂笔头,我把手册里的端口配置表用制表符做进程序里,编新程序的时候从老程序里复制一下,看着这个表配置端口也很方便,只要记清楚&=~是置0,|=是置1就可以了。
//        ───────────────────────────────
//        |  PnM1.x  |  PnM0.x  | Pn.x 口工作模式 |
//        ───────────────────────────────
//        |      0       |      0        |       准双向口      |
//        ───────────────────────────────
//        |      0       |      1        |       推挽输出      |
//        ───────────────────────────────
//        |      1       |      0        |       高阻输入      |
//        ───────────────────────────────
//        |      1       |      1        |       开漏输出      |
//        ───────────────────────────────
//   80   40   20   10  |   08   04   02   01
//  X.7  X.6  X.5  X.4  |  X.3  X.2  X.1  X.0
P1M1 &= ~0x03 ;        P1M0 |= 0x03 ;          //        P1.0 P1.1 为推挽输出
P1M1 &= ~0xfc ;        P1M0 &= ~0xfc ;       //        P1.2 - P1.7 为准双向口
P3M1 &= ~0x08 ;        P3M0 |= 0x08 ;         //        P3.3 为推挽输出
P3M1 &= ~0x30 ;        P3M0 |= 0x30 ;         //        P3.4 P3.5 为推挽输出
P5M1 &= ~0x10 ;        P5M0 |= 0x10 ;         //        P5.4 为推挽输出
也把这段表格和程序复制在这里,看看能不能对齐?需要的可以直接复制。

回复

使用道具 举报

ID:65286 发表于 2022-4-6 14:25 | 显示全部楼层
这个确实非常方便,我之前用工具高手写的工具计算,也算是很方便,现分享出来。

STCIOset_v10b9h.rar

1.81 MB, 下载次数: 25, 下载积分: 黑币 -5

回复

使用道具 举报

ID:192294 发表于 2022-4-21 16:40 | 显示全部楼层
kmsj 发表于 2022-3-31 15:36
非常佩服楼主的执著,个人认为没有必要,每次配置端口都要看手册,的确很麻烦。

好记性不如烂笔头,我 ...

网上有一个宏处理的,很方便,代码也不大,可以百度一下。
另外还可以使用STC的库函数处理。

1309
回复

使用道具 举报

ID:624769 发表于 2022-4-29 00:37 | 显示全部楼层
hp34401a 发表于 2022-4-21 16:40
网上有一个宏处理的,很方便,代码也不大,可以百度一下。
另外还可以使用STC的库函数处理。

你也许对 "代码也不大" 有点误解.

H 头文件,无论多大都不会影响 “代码” 大小,
大多时候,引用 宏处理 最终“代码”反而会大,引用 宏定义 最终代码反而小。

同时回复 12 楼: 有没有必要看实际效果。  假定 P1.0 P1.1 为推挽输出,  P1.2 - P1.5 为准双向口, P1.6 高阻, P1.7 开漏, 用你那个方法,或者 用宏处理大多需要 4 次设置,  总共需要 24个字节,而直接设置值需要6个字节,   如果 P0~P7 全盘设定一次, 用你的方式,总共:192个字节  直接设置 之需要48个字节, 还没有算运行时间。

不想说哪个好,哪个不好, 只是想给,喜欢用 PxM0 = ??   PxM1 = ?? 的朋友,一个可以比较直观快捷的,并且不增加“代码尺寸” 的设置方法, 尤其是 STC15 系列 和STC12系列的头文件里面 PxM0,和 PxM1 还是反的,一不小心还会中招,而这个头文件的好处,就是能通吃。再也不用查手册和核对头文件来防止中招了。
回复

使用道具 举报

ID:99525 发表于 2022-4-29 19:59 | 显示全部楼层
这个很实用,方便很多了!
回复

使用道具 举报

ID:1001475 发表于 2022-4-30 23:59 来自手机 | 显示全部楼层
这个很实用,方便很多了!
回复

使用道具 举报

ID:383215 发表于 2022-5-1 15:29 | 显示全部楼层
楼主所言:“同时回复 12 楼: 有没有必要看实际效果”我认为楼主并没有把“实际效果” 看清楚,任何单片机程序就是一个大循环,端口配置的代码在主函数到大循环之间,并没有在大循环内部,所以,端口配置的代码再复杂,影响单片机的实际运行时间很小很小,我宁愿一个端口一个端口的配置,哪怕默认的设置我也设置一遍,就算明知是无用的代码也无所谓,是为了让我的程序更容易理解,时间长了我自己还能看懂。就算我浪费1000个字节的代码用来设置端口,最多就是单片机通电之后到主程序的大循环延长了0.001秒,也就是开机时间延长了0.001秒,这0.001秒能影响什么?我用的单片机是8K的ROM,我的程序5K左右就能编完,我节约几百个字节的ROM有何意义?除非我的单片机只有4K的ROM,我会节约每一个语句,甚至用汇编来编,那是另当别论。
楼主所言:“用你的方式,总共:192个字节  直接设置 之需要48个字节, 还没有算运行时间”,每个人的编程重点是不一样的,我的编程重点放在CPU应用率,我的每一段程序都是用CPU应用率约束出来的,最重要的就是,不是代码越短占用CPU运行时间越短,我主程序大循环里软件延时的时间最多只有几十微秒,包括按键去抖动,18B20之类的程序,没有用长延时的办法都解决了,比如我用10步读出2个18B20的温度值,一共花了0.1秒读出温度值,温度是渐变,不是突变,我花一秒钟读出温度值都不会影响我的程序,看下来我的18B20的程序非常复杂,然而实际运行效果是十几个循环周期我才运行一步18B20的程序,和那些在一个循环周期完成18B20的程序,我的18B20程序CPU运行效率要高出10倍都不止。
楼主所言:“一不小心还会中招,而这个头文件的好处,就是能通吃。再也不用查手册和核对头文件来防止中招了”,我编单片机还有一个重点是仿真,编程中招,那是家常便饭,靠查手册和核对头文件来防止中招,我认为不是主要的,仿真才是解决中招的最好办法,我中过的招,任何手册和书本以及各种资料上都没有,只有靠仿真解决。由于AVR单片机涨价,被迫使用STC单片机,主要用STC1K08H替代AVR的ATMEGA8,由于STC的仿真并不好用,我就用89C51的老式仿真器仿真,所以我的程序就在89C51、STC、AVR之间移植过来移植过去。
综上所述,每个人编单片机的重点不是一模一样的,AVR单片机的端口操作比STC单片机还要复杂,STM32的端口操作更是复杂,STC单片机的端口操作对我而言算是比较简单的了。楼主把自己辛辛苦苦编写的关于STC单片机端口操作的头文件奉献出来,需要的网友一定是非常感激,但不是所有人都需要,所以楼主没有必要让所有人接受你的观点,就像我也不可能让所有人接受我注重CPU应用率和注重仿真的观点。
回复

使用道具 举报

ID:624769 发表于 2022-7-28 23:11 | 显示全部楼层
kmsj 发表于 2022-5-1 15:29
楼主所言:“同时回复 12 楼: 有没有必要看实际效果”我认为楼主并没有把“实际效果” 看清楚,任何单片机 ...

你说了一大堆, 实在是…… 除了把问题描述的 模糊不清,完全不明白你要表达什么意思。

我说了,我分享出来,是让有需要的人可以下载使用,不需要任何感激。没有需要的也可以 直接绕道。
你觉得你有更完美的方案,你也可以另发一贴给 有需要的人,我也不会去你的帖子说好还是不好。

但是,你在我的帖子里说,这个方法,不如怎么怎么样,那么,我自然要告诉你,你所说的“不如怎么怎么样” 缺点在哪里。
然后,你再回复,就直接扯到18B20去了。我也不知道你扯这么远是为了什么,你说不在乎开机初始化那点时间,为了让程序更容易解读,那么,事实上,针对端口设置,你所谓的 还不如怎么怎么样 的方案,更容易解读了么?
然后,你又说你不是代码越短 占用CPU运行之间越短,那么,你提出的方案,代码长度拉长,然后占用CPU运行时间更短了么?
你在18提出的各种论调,都不足以支撑你之前12楼的提出的主张, 真的不知道你这洋洋洒洒写这么一大篇,想说明什么?想要体现 你会STM32 ?  我只是提供给大家一个 STC的端口模式设置方案,你要在这帖子里 讨论 STM端口的设置方案?还是说你要我再出一个 STM的端口设置方案? 好歹你也是搞技术的,讨论问题直来直去不行?? 非要那么多弯弯绕绕?
回复

使用道具 举报

ID:383215 发表于 2022-7-29 13:51 | 显示全部楼层
188610329 发表于 2022-7-28 23:11
你说了一大堆, 实在是…… 除了把问题描述的 模糊不清,完全不明白你要表达什么意思。

我说了,我分 ...

要直来直去,简单的很啊,直截了当说,单片机编程是有级别划分的,一是流水灯、二是多任务、三是CPU应用率、四是任意移植程序,你也已经说的清清楚楚“此头文可以比较方便快捷的按位来设定每个端口的模式,可以给初学者带来不少便利。”既然你这个头文件是为了方便初学者,有人提出不同看法也很正常,我也说的清清楚楚,楼主把自己辛辛苦苦编写的关于STC单片机端口操作的头文件奉献出来,需要的网友一定是非常感激,每个人对单片机编程的侧重点是不一样的,我也不可能要求所有人接受我注重CPU应用率和注重仿真的观点,我的这种编程方法太累人了,我说STM32端口设置更复杂,并不是证明我懂STM32,这个论坛懂STM32的多了是了,我仅仅学会STM32的端口操作和流水灯,STM32就涨价了,我是个穷光蛋,用不起STM32,单片机编程只是我的一个业余爱好,我的水平太一般了。
回复

使用道具 举报

ID:624769 发表于 2022-7-29 23:44 | 显示全部楼层
你说直接了当说,然后说了:“单片机编程是有级别划分的,一是流水灯、二是多任务、三是CPU应用率、四是任意移植程序”  下文呢?后续你把这4点,和你主张的端口模式 对应起来呀!!,我读了通篇都没有看你对应。好吧,略过这一句,我们再往下面看。

我说给提供给有需要的人,显然,你属于不需要的人,那你不要下载就可以了,我也没求你用对不对? 这个头文件,我做做也就是2分钟的事情,并不辛苦,所以不需要用的的人感激,要说辛苦,为了让有需要,想用的人明白怎么用,写注释用了5分钟,这勉强算辛苦吧,然后,回复你的错误论调,告诉你,你以为的“更优” 其中的缺陷,花了半小时,这才算真正的辛苦。当然,也不需要你理解,不需要你感激。

然后,你有不同的观点,可以啊,但是,至少要是:正确的,并且是你的观点。 对不对?结果呢? 你给的例子,是STC官方就有的,压根不是你自己的,然后,你觉得更好~~,实际呢?你测试过么?我告诉你效率低,占空间大,你扯去应用率。这罢了,我们再往下看。

你说: 每个人对单片机编程的侧重点是不一样的,我也不可能要求所有人接受我注重CPU应用率和注重仿真的观点,
所以请问:针对这点来说,你主张的端口的设置的方式,相较于我提供端口设置方式,在CPU应用率 上有什么提高呢?


所以,你说了简单来说,又说直来直去的说,说到最后,你还是兜了个圈子之后,说了一堆 “地球是圆的”,关于你觉得我提供的方案不如你推荐的方案的理由,事实根据,一样都没有说……




回复

使用道具 举报

ID:130230 发表于 2022-8-1 14:55 | 显示全部楼层
开源精神值得肯定,但确实没啥必要。
回复

使用道具 举报

ID:69115 发表于 2022-8-1 18:02 | 显示全部楼层
都是高手,都把观点摆出来讨论是好事,感谢楼主供献那么实用的 IO模式设置 头文件.
对于初学者可以带来很大的帮助.
到了高手阶段,可有自己更好的办法,或者是直接就可以二进 十六进制 心算了.
回复

使用道具 举报

ID:160197 发表于 2022-8-3 16:34 | 显示全部楼层
我用函数 也写了一个 。 作者的 想法是好的 。

/***************************************************************************
函数名称:
功能描述:stc8a8k64d4 GPIO 配置   D 为双向口  ,P为 推挽 ,H为高阻 ,O 为开漏
参    数: 无
返    回:无
备    注:举例 set_gpio_mode(0 , "DDDD HOPD")
****************************************************************************/
void set_gpio_mode( unsigned char gpio , char n[] )
{
        unsigned char M1 , M0 , i ;
       
        for( i= 0 ; i < 9 ; i ++ )
        {
                        if( i == 4 )
                                continue ;
                       
                        M1 <<= 1 ;
                        M0 <<= 1 ;
                       
                        switch( n[i] )
                        {
                                case 'D' :     // 00
                                {
                                        M1 &= ~0x01 ;
                                        M0 &= ~0x01 ;
                                }
                                break ;
                               
                                case 'P' :   // 01
                                {
                                        M1 &= ~0x01 ;
                                        M0 |= 0x01 ;
                                }
                                break ;               

                                case 'H' :   // 10
                                {
                                        M1 |= 0x01 ;
                                        M0 &= ~0x01 ;
                                }
                                break ;               

                                case 'O' :  // 11
                                {
                                        M1 |= 0x01 ;
                                        M0 |= 0x01 ;
                                }
                                break ;                       
                        }
  }
       
        switch( gpio )
        {
                        case 0 :        //P0
                        {
                                P0M1 = M1 , P0M0 = M0 ;
                        }
                        break ;
                       
                        case 1 :        //P1
                        {
                                P1M1 = M1 , P1M0 = M0 ;
                        }
                        break ;
                       
                        case 2 :        //P2
                        {
                                P2M1 = M1 , P2M0 = M0 ;
                        }
                        break ;

                        case 3 :        //P3
                        {
                                P3M1 = M1 , P3M0 = M0 ;
                        }
                        break ;

                        case 4 :        //P4
                        {
                                P4M1 = M1 , P4M0 = M0 ;
                        }
                        break ;

                        case 5 :        //P5
                        {
                                P5M1 = M1 , P5M0 = M0 ;
                        }
                        break ;

                        case 6 :        //P6
                        {
                                P6M1 = M1 , P6M0 = M0 ;
                        }
                        break ;               
       
                        case 7 :        //P7
                        {
                                P7M1 = M1 , P7M0 = M0 ;
                        }
                        break ;                                       
        }
}
回复

使用道具 举报

ID:1056645 发表于 2022-12-9 12:41 | 显示全部楼层
谢谢楼主分享,对我很有用
回复

使用道具 举报

ID:1042619 发表于 2022-12-10 10:38 | 显示全部楼层
     感谢楼主分享!51因您而精彩! 可以试试STC官方最新的 STC-ISP V6.91及以上版本的 ISP烧录/辅助开发工具包一体化软件的  工具 有 I/O配置工具
STC-IO配置工具 jpg.png

回复

使用道具 举报

ID:1108581 发表于 2024-1-8 23:32 | 显示全部楼层
这个厉害啊,使用的话太方便了
回复

使用道具 举报

ID:1064915 发表于 2024-1-10 16:32 | 显示全部楼层
都是大师级
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表