打印
[DemoCode下载]

【赛元95F】第3步:试试能否给51内核写库函数

[复制链接]
986|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
突发奇想,为何没有51内核单片机的库函数呢?肯定是有原因的。
测试,先以设置IO输入输出,上拉电阻控制的模式设置函数作为例子编写测试。仅提供P0,P1,P2端口的测试。


#define DIN                0
#define DOUT        1
#define ON                1
#define OFF                0

/*
port:P0~P5
pin:0~255,BIT0~BIT7,BIT0|BIT1……
mode:DIN,DOUT
upr:ON,OFF

*/

void setmode(unsigned char port,unsigned char pin,unsigned mode,unsigned char upr)
{
        if(port==P0)
        {
                if(mode==DIN)
                {
                        P0CON &= ~(pin);
                        if(upr==ON)
                                P0PH |=(pin);
                        else if(upr==OFF)
                                P0PH &= ~(pin);                       
                }
                else if(mode==DOUT)
                {
                        P0CON |= (pin);                       
                }

        }

        if(port==P1)
        {
                if(mode==DIN)
                {
                        P1CON &= ~(pin);
                        if(upr==ON)
                                P1PH |=(pin);
                        else if(upr==OFF)
                                P1PH &= ~(pin);                       
                }
                else if(mode==DOUT)
                {
                        P1CON |= (pin);                       
                }

        }
       
       
        if(port==P2)
        {
                if(mode==DIN)
                {
                        P2CON &= ~(pin);
                        if(upr==ON)
                                P2PH |=(pin);
                        else if(upr==OFF)
                                P2PH &= ~(pin);                       
                }
                else if(mode==DOUT)
                {
                        P2CON |= (pin);                       
                }

        }
       
}
#include"SC95F861X.H"
#include"test.h"
void main(void)
{
        unsigned char x,y,z;
        setmode(P0,BIT0,DOUT,0);
        setmode(P0,BIT3|BIT2,DIN,ON);
        x=P0CON;
        y=P0PH;
        z=P0;
       
}

简单的测试占用了不少的存储空间。

使用特权

评论回复

相关帖子

沙发
gaoyang9992006|  楼主 | 2020-3-26 15:34 | 只看该作者

测试结果是很好的,但是这样有优势吗?
我们试试裸奔程序如何,实现同样的功能。

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2020-3-26 15:36 | 只看该作者
实现同样的功能,却占用了很少的存储空间和内存。由于51内核单片机通常外设配置的寄存器不多,因此一般是不提供库函数操作的方法的。

使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2020-3-26 15:37 | 只看该作者

为了方便位操作,我给头文件添加了
#define BIT0 (1<<0)
#define BIT1 (1<<1)
#define BIT2 (1<<2)
#define BIT3 (1<<3)
#define BIT4 (1<<4)
#define BIT5 (1<<5)
#define BIT6 (1<<6)
#define BIT7 (1<<7)

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2020-3-26 15:55 | 只看该作者
建议对寄存器进行功能的宏定义。
这样就不用都写难以理解的数字了。而且又不会增加代码编译后的占用空间,还能增加阅读性。

使用特权

评论回复
6
一路向北lm| | 2020-3-26 21:06 | 只看该作者
给51内核写一个操作系统内核吧,完成多任务调度

使用特权

评论回复
7
knk| | 2020-3-26 22:32 | 只看该作者
赛元的8051是有库函数的,用赛元魔盒可以生成工程,自带库函数。之前也单独发过7003/8003的库函数。

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2020-3-27 11:53 | 只看该作者
knk 发表于 2020-3-26 22:32
赛元的8051是有库函数的,用赛元魔盒可以生成工程,自带库函数。之前也单独发过7003/8003的库函数。 ...

没有这个系列的,只有92系列。我只是突发奇想,能否这么做。竟然可以,不过代价很大,浪费很多内存。

使用特权

评论回复
9
畅游天涯| | 2020-3-29 19:39 | 只看该作者
看看,学习一下

使用特权

评论回复
10
奇立电源| | 2020-4-8 12:39 | 只看该作者
写个宏库可以,我就是这么整的

使用特权

评论回复
11
gaoyang9992006|  楼主 | 2020-4-8 15:00 | 只看该作者
奇立电源 发表于 2020-4-8 12:39
写个宏库可以,我就是这么整的

是的,为了充分利用51的资源,一般都是用宏来实现可移植性以及可读性。

使用特权

评论回复
12
501817897| | 2020-4-8 19:30 | 只看该作者
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。

使用特权

评论回复
13
gaoyang9992006|  楼主 | 2020-4-8 19:53 | 只看该作者
501817897 发表于 2020-4-8 19:30
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。 ...

寄存器在头文件里是对应到地址的,地址本身是个常量,所以这么作为参赛传递也是正确的。编译器可以通过,而且运行是正确的。

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2020-4-8 19:54 | 只看该作者
501817897 发表于 2020-4-8 19:30
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。 ...

你的顾虑我之前考虑过,所以我想试试看到底是不是作为常量来使用,经过测试,真的是。所以你的顾虑可以打消了。

使用特权

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

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1895

主题

15627

帖子

197

粉丝