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

[复制链接]
1628|13
 楼主| gaoyang9992006 发表于 2020-3-26 15:31 | 显示全部楼层 |阅读模式
突发奇想,为何没有51内核单片机的库函数呢?肯定是有原因的。
测试,先以设置IO输入输出,上拉电阻控制的模式设置函数作为例子编写测试。仅提供P0,P1,P2端口的测试。


  1. #define DIN                0
  2. #define DOUT        1
  3. #define ON                1
  4. #define OFF                0

  5. /*
  6. port:P0~P5
  7. pin:0~255,BIT0~BIT7,BIT0|BIT1……
  8. mode:DIN,DOUT
  9. upr:ON,OFF

  10. */

  11. void setmode(unsigned char port,unsigned char pin,unsigned mode,unsigned char upr)
  12. {
  13.         if(port==P0)
  14.         {
  15.                 if(mode==DIN)
  16.                 {
  17.                         P0CON &= ~(pin);
  18.                         if(upr==ON)
  19.                                 P0PH |=(pin);
  20.                         else if(upr==OFF)
  21.                                 P0PH &= ~(pin);                       
  22.                 }
  23.                 else if(mode==DOUT)
  24.                 {
  25.                         P0CON |= (pin);                       
  26.                 }

  27.         }

  28.         if(port==P1)
  29.         {
  30.                 if(mode==DIN)
  31.                 {
  32.                         P1CON &= ~(pin);
  33.                         if(upr==ON)
  34.                                 P1PH |=(pin);
  35.                         else if(upr==OFF)
  36.                                 P1PH &= ~(pin);                       
  37.                 }
  38.                 else if(mode==DOUT)
  39.                 {
  40.                         P1CON |= (pin);                       
  41.                 }

  42.         }
  43.        
  44.        
  45.         if(port==P2)
  46.         {
  47.                 if(mode==DIN)
  48.                 {
  49.                         P2CON &= ~(pin);
  50.                         if(upr==ON)
  51.                                 P2PH |=(pin);
  52.                         else if(upr==OFF)
  53.                                 P2PH &= ~(pin);                       
  54.                 }
  55.                 else if(mode==DOUT)
  56.                 {
  57.                         P2CON |= (pin);                       
  58.                 }

  59.         }
  60.        
  61. }
  1. #include"SC95F861X.H"
  2. #include"test.h"
  3. void main(void)
  4. {
  5.         unsigned char x,y,z;
  6.         setmode(P0,BIT0,DOUT,0);
  7.         setmode(P0,BIT3|BIT2,DIN,ON);
  8.         x=P0CON;
  9.         y=P0PH;
  10.         z=P0;
  11.        
  12. }
979385e7c5a52f27c5.png
简单的测试占用了不少的存储空间。
 楼主| gaoyang9992006 发表于 2020-3-26 15:34 | 显示全部楼层
739815e7c5a804cada.png
测试结果是很好的,但是这样有优势吗?
我们试试裸奔程序如何,实现同样的功能。
983675e7c5b1ace7b9.png
 楼主| gaoyang9992006 发表于 2020-3-26 15:36 | 显示全部楼层
实现同样的功能,却占用了很少的存储空间和内存。由于51内核单片机通常外设配置的寄存器不多,因此一般是不提供库函数操作的方法的。
 楼主| gaoyang9992006 发表于 2020-3-26 15:37 | 显示全部楼层
973935e7c5b800dfd4.png
为了方便位操作,我给头文件添加了
  1. #define BIT0 (1<<0)
  2. #define BIT1 (1<<1)
  3. #define BIT2 (1<<2)
  4. #define BIT3 (1<<3)
  5. #define BIT4 (1<<4)
  6. #define BIT5 (1<<5)
  7. #define BIT6 (1<<6)
  8. #define BIT7 (1<<7)
 楼主| gaoyang9992006 发表于 2020-3-26 15:55 | 显示全部楼层
建议对寄存器进行功能的宏定义。
这样就不用都写难以理解的数字了。而且又不会增加代码编译后的占用空间,还能增加阅读性。
一路向北lm 发表于 2020-3-26 21:06 | 显示全部楼层
给51内核写一个操作系统内核吧,完成多任务调度
knk 发表于 2020-3-26 22:32 | 显示全部楼层
赛元的8051是有库函数的,用赛元魔盒可以生成工程,自带库函数。之前也单独发过7003/8003的库函数。
 楼主| gaoyang9992006 发表于 2020-3-27 11:53 | 显示全部楼层
knk 发表于 2020-3-26 22:32
赛元的8051是有库函数的,用赛元魔盒可以生成工程,自带库函数。之前也单独发过7003/8003的库函数。 ...

没有这个系列的,只有92系列。我只是突发奇想,能否这么做。竟然可以,不过代价很大,浪费很多内存。
畅游天涯 发表于 2020-3-29 19:39 | 显示全部楼层
看看,学习一下
奇立电源 发表于 2020-4-8 12:39 来自手机 | 显示全部楼层
写个宏库可以,我就是这么整的
 楼主| gaoyang9992006 发表于 2020-4-8 15:00 | 显示全部楼层
奇立电源 发表于 2020-4-8 12:39
写个宏库可以,我就是这么整的

是的,为了充分利用51的资源,一般都是用宏来实现可移植性以及可读性。
501817897 发表于 2020-4-8 19:30 | 显示全部楼层
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。
 楼主| gaoyang9992006 发表于 2020-4-8 19:53 | 显示全部楼层
501817897 发表于 2020-4-8 19:30
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。 ...

寄存器在头文件里是对应到地址的,地址本身是个常量,所以这么作为参赛传递也是正确的。编译器可以通过,而且运行是正确的。
 楼主| gaoyang9992006 发表于 2020-4-8 19:54 | 显示全部楼层
501817897 发表于 2020-4-8 19:30
这么说吧,那么明显的错误,P0、P1、P2是寄存器名,传参数是传的寄存器的值。。。 ...

你的顾虑我之前考虑过,所以我想试试看到底是不是作为常量来使用,经过测试,真的是。所以你的顾虑可以打消了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部