1844|8

1080

帖子

2

TA的资源

五彩晶圆(中级)

楼主
 

执行代码超级短的 STC系列专用 初始化IO口函数 宏定义!!! [复制链接]

本帖最后由 xuyiyi 于 2023-2-19 20:54 编辑


//========================================================================
// 函数: u8    GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
// 描述: 初始化IO口.
// 参数: GPIOx: 结构参数,请参考timer.h里的定义.
// 返回: 成功返回 SUCCESS, 错误返回 FAIL.
// 版本: V1.0, 2012-10-22
//========================================================================
u8  GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);

typedef struct
{
    u8    Mode;        //IO模式,          GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    u8    Pin;        //要设置的端口    
} GPIO_InitTypeDef;


##########################################################################
##########################################################################
##########################################################################


STC 的 初始化IO口函数, 使用了结构体, 将简单的 对寄存器 PxM1,PxM0 赋值, 搞成一大堆指令。

又是指针,又是判断,程序执行效率极低,我特用宏定义 编写了一个,执行效率极高,功能完全兼容。

程序执行时,仅对寄存器 PxM1,PxM0 赋值, 相当于用 汇编语言直接编写。

当时编写了一个通用型的,能自动识别 STC51、STC16、STC32系列,并给出相对应单片机型的最优化的执行代码。

但后来感觉 H头文件有点复杂有点长,现将其拆分,分别对应于 STC51系列 和 STC251(STC16、STC32)系列 。

现分享给大家 。


网友测试时,可单步运行查看运行结果,也可直接查看检查反汇编程序。

 








 
此帖出自51单片机论坛

最新回复

我指的是编程风格。   详情 回复 发表于 2023-2-20 09:51
点赞 关注
 

回复
举报

1080

帖子

2

TA的资源

五彩晶圆(中级)

沙发
 

#ifndef	__STC_GPIO_H
#define	__STC_GPIO_H

/***************************************************************************************
	Model		: STC_GPIO.H
	Description	: Head file of defining global variable.
	Author		: CLR
	Create Time	: 2023-04-17
	Version ID  : 2.0

	用  途      :通用型, 能对宏晶 STC51/STC16/STC32系列MCU, 
	              自动识别, 给出最优化的执行代码!
	作  者      :许意义
	21ic  ID    :LAOXU
	中颖论坛    : bbs.21ic.com   
****************************************************************************************/

//========================================================================
//                              定义声明
//========================================================================

// 请注意, 为了便于下面的宏定义, GPIO输入输出模式, 与官方定义不同!!!
#define	GPIO_PullUp		0L	//上拉准双向口
#define	GPIO_OUT_PP		1L	//推挽输出
#define	GPIO_HighZ		2L	//浮空输入
#define	GPIO_OUT_OD		3L	//开漏输出

#define	GPIO_Pin_0		0x01	//IO引脚 Px.0
#define	GPIO_Pin_1		0x02	//IO引脚 Px.1
#define	GPIO_Pin_2		0x04	//IO引脚 Px.2
#define	GPIO_Pin_3		0x08	//IO引脚 Px.3
#define	GPIO_Pin_4		0x10	//IO引脚 Px.4
#define	GPIO_Pin_5		0x20	//IO引脚 Px.5
#define	GPIO_Pin_6		0x40	//IO引脚 Px.6
#define	GPIO_Pin_7		0x80	//IO引脚 Px.7
#define	GPIO_Pin_LOW	0x0F	//IO低4位引脚
#define	GPIO_Pin_HIGH	0xF0	//IO高4位引脚
#define	GPIO_Pin_All	0xFF	//IO所有引脚

/*------------------------------------------------------------------------------------
 
			    ===========编 程 实 例===========

                               ------Cortex-M051风格1------

1.void GPIO_SET_MODE(Pn, b7,b6,b5,b4,b3,b2,b1,b0);          // 设置IO口输入输出模式(n=0-7)    

  使用方式:
  GPIO_SET_MODE(P3, PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
                 // 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式 


2.void GPIO_SET_PIN_MODE(Port, Pin_Mode);                 // 设置IO口其中1位或数位输入输出模式(N=0-7,i=0-7)  

  例如:
  GPIO_SET_PIN_MODE(P3, OUT_OD_Pin6);        // 设置P3口的第bit.6位为OUT_OD模式

  GPIO_SET_PIN_MODE(P2, PullUp_Pin5 | OUT_PP_Pin2 | HighZ_Pin0);        // 设置P2口的第bit.5位为PullUp模式,第bit.2位为OUT_PP模式,第bit.0位为HighZ模式 
--------------------------------------------------------------------------------------*/

#define	GPIO_SET_MODE(Port, b7,b6,b5,b4,b3,b2,b1,b0)   	 Port##_SET_MODE(b7,b6,b5,b4,b3,b2,b1,b0)   

#define	GPIO_SET_PIN_MODE(Port, Pin_Mode)	               Port##_SET_PIN_MODE(Pin_Mode) 	

/*------------------------------------------------------------------------------------

                              ------Cortex-M051风格2------

3.void Pn_SET_MODE(b7,b6,b5,b4,b3,b2,b1,b0);          // 设置Pn IO口输入输出模式(n=0-4)    

  使用方式:
  P3_SET_MODE(PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
                 // 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式 


4.void Pn_SET_PIN_MODE(Pin_Mode);                 // 设置Pn IO口其中1位或数位输入输出模式(N=0-7,i=0-7)  

  例如:
  P3_SET_PIN_MODE(OUT_OD_Pin6);        // 设置P3口的第bit.6位为OUT_OD模式

  P2_SET_PIN_MODE(PullUp_Pin5 | OUT_PP_Pin2 | HighZ_Pin0);        // 设置P2口的第bit.5位为PullUp模式,第bit.2位为OUT_PP模式,第bit.0位为HighZ模式 
--------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------

                               -------51系列风格-------

5.u8 GPIO_Mode(b7,b6,b5,b4,b3,b2,b1,b0);  设置IO口输入输出模式  

  使用方式:
  PnMode = GPIO_Mode(b7,b6,b5,b4,b3,b2,b1,b0);  设置IO口输入输出模式 

  P3Mode = GPIO_Mode(PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD);
                 // 设置P3口的bit.7-bit.0位,依次为PullUp,HighZ,PullUp,HighZ,OUT_PP,OUT_OD,OUT_PP,OUT_OD模式 

--------------------------------------------------------------------------------------*/

 

此帖出自51单片机论坛
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

过来看看楼主写的怎么样

此帖出自51单片机论坛
 
 
 

回复

6481

帖子

9

TA的资源

版主

4
 

优秀,只要是能提高休效率的问题都值得推广        

此帖出自51单片机论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6105

帖子

4

TA的资源

版主

5
 

有意思,stc51向stm32看齐

此帖出自51单片机论坛

点评

51向stm32看齐根本不可能, 尽管stm32(M3) 只是ARM的一个子集, 但其强大的间接寻址功能, 比 C251指令集都强大, 必竞 英特尔的 C251指令集, 是几十年前的老古董, 考虑的没那么超前,  而 M3  详情 回复 发表于 2023-2-18 11:45
 
 
 

回复

1080

帖子

2

TA的资源

五彩晶圆(中级)

6
 
damiaa 发表于 2023-2-17 11:25 有意思,stc51向stm32看齐

51向stm32看齐根本不可能, 尽管stm32(M3) 只是ARM的一个子集, 但其强大的间接寻址功能,

比 C251指令集都强大, 必竞 英特尔的 C251指令集, 是几十年前的老古董, 考虑的没那么超前, 

而 M3指令集, 是ARM公司 10年内的产物,  

stc51, 使用结构体指针, 使得原本就是 鸡肋的 51片外DPTR指针寻扯, 产生的效率奇低, 编译后代码一大堆(因为在同级别的 8位机中, 51的片外寻扯效率最低).

至于采用 C251指令集的 STC16/STC32, 模仿STM32 使用结构体指针, 还能凑合着用用.

 

此帖出自51单片机论坛

点评

我指的是编程风格。  详情 回复 发表于 2023-2-20 09:51
 
 
 

回复

1080

帖子

2

TA的资源

五彩晶圆(中级)

7
 

楼上库已更新 !!! 

 

 

STC_GPIO.rar (29.71 KB, 下载次数: )

STC32_GPIO.rar (35.03 KB, 下载次数: )

STC51_GPIO.rar (41.97 KB, 下载次数: )
 
此帖出自51单片机论坛
 
 
 

回复

6105

帖子

4

TA的资源

版主

8
 
xuyiyi 发表于 2023-2-18 11:45 51向stm32看齐根本不可能, 尽管stm32(M3) 只是ARM的一个子集, 但其强大的间接寻址功能, 比 C251 ...

我指的是编程风格。

此帖出自51单片机论坛

点评

那是老姚向STM32编程风格看齐。 我个人是反对的, 比如 51向STM8(STM32)编程风格看齐。 是 STM8是什么指令集? 继承扩展了原6502(6800)指令集,  6502指令集侧重于间接寻址, 原6502指令集间接寻址功能  详情 回复 发表于 2023-2-24 19:17
 
 
 

回复

1080

帖子

2

TA的资源

五彩晶圆(中级)

9
 
本帖最后由 xuyiyi 于 2023-2-24 19:19 编辑
damiaa 发表于 2023-2-20 09:51 我指的是编程风格。

那是老姚向STM32编程风格看齐。

我个人是反对的, 比如 51向STM8(STM32)编程风格看齐。

STM8是什么指令集? 继承扩展了原6502(6800)指令集,  6502指令集侧重于间接寻址, 原6502指令集间接寻址功能已经比 51强大太多了, 加上STM8扩充了6502(6800)指令集, 

使用结构体指针, 如鱼得水. 对比之下, 使得原本就是 鸡肋的 51片外DPTR指针寻扯, 更放不上台面.

 

此帖出自51单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表