stc15w404as使用keil做库,提供头文件,供调用

news2024/12/23 9:13:22

背景

有个项目使用需要使用库,将代码封装起来,仅仅留下调试接口,给用户使用,调试一些参数。这样工程看起来更简单,也方便客户维护。

也有一些使用场景,需要把自己的代码封装起来,这个是怕被别人窃取,自己的功夫白费了,也可以提供库的形式。

当然也有如下场景

当公司或者个人需要提供自己的编写的代码供他人调用时,而你或提供方并不想提供源代码(.c源代码),只想提供头文件.h(在头文件中申明函数)供他人调用,他人在调用时只需要知道调用的函数功能是什么,传递的参数是什么等,无需了解函数是怎样具体实现的。 此时就需要静态链接库(当然还有动态链接库,这里先讲解静态链接库的生成和使用)
 

关键步骤

实际使用效果

我这里提供的例程是使用STC(宏晶)的单片机实现stc15w404as

这也是客户选的,原理给出来,只需要负责代码实现即可。

最终的实际库函数调用为234.LIB 

这里正常添加 234.LIB ,使用的函数在头文件如下

代码,头文件中告诉客户,哪些参数是可以调整的,其他是不能动的

对于客户来说就简单了,只需要了解这个头文件相关的几个宏定义即可。

/******************************************************************************
* 文件名称: stc15w404as.h
* 功能描述: stc15w404as补充寄存器头文件
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 
* 修改日期      版本号      修改人     修改内容
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* 2013/02/22    V1.0.0.0       
******************************************************************************/
#ifndef STC15W404AS_H
#define STC15W404AS_H
#include <reg51.h>
#include "intrins.h"

/*
 *
 *	  请不要修改以下内容,多谢!!!
 *
 *
 */


#define FOSC 33177600L

/* STC15W404AS寄存器补充 */
sfr AUXR1 = 0XA2;
sfr AUXR = 0X8E;
sfr TH2 = 0XD6;
sfr TL2 = 0XD7;
sfr P4 = 0xc0;
sfr P5 = 0xc8;

sfr SPSTAT      =   0xCD;   //
sfr SPCTL       =   0xCE;   //
sfr SPDAT       =   0xCF;   //
/*************************/


typedef unsigned char BYTE;
typedef unsigned int WORD;

#define uchar unsigned char
#define uint  unsigned int

sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;

//sbit led_1  = P1^2;
//sbit led_11 = P3^2;
//sbit led_12 = P3^3;
//sbit led_13 = P3^6;
sbit led_14 = P3^6;	/* 红灯 */
sbit led_13 = P3^7;	/* 绿灯 */
sbit led_2 = P1^3;
sbit key_1 = P1^2;

#define STEP_1_TOLG    5    /* 5 * 50 = 250ms */
#define STEP_2_TOLG    10   /* 10 * 50 = 500ms */
#define STEP_3_TOLG    20   /* 20 * 50 = 1000ms */
#define STEP_4_TOLG    10   /* 10 * 50 = 500ms */
#define STEP_5_TOLG    20   /* 20 * 50 = 1000ms */

#define STEP_1_MAX_TIME 14400	/* 14400 * 250ms = 1 hour*/
#define STEP_2_MAX_TIME 36000	/* 36000 * 500ms = 5 hour*/
#define STEP_3_MAX_TIME 10800	/* 10800 * 1000ms = 3 hour*/
#define STEP_4_MAX_TIME 14400  	/* 14400 * 500ms = 2 hour*/
#define STEP_5_MAX_TIME 7200    /* 7200 * 1000ms = 2 hour*/

#define STEP_1_JUMP_VOLTAGE    102    /* 2V */
#define STEP_2_JUMP_VOLTAGE    189   /* 3.7V */
#define STEP_3_JUMP_VOLTAGE    26   /* 0.5V */

#define STEP_JUMP_ABNORMAL     20   /* 0.4V */

#define NO_KEY_DOWN    0x00
#define KEY_9_DOWN     0x01
#define KEY_10_DOWN    0x02
#define KEY_9_10_DOWN  0x03




sbit key_9 = P3^0;
sbit key_10 = P3^1;


                       

sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位结果
sfr ADC_LOW2    =   0xBE;           //ADC低2位结果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
#define ADC_SPEEDL  0x20            //360个时钟
#define ADC_SPEEDH  0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟


//sfr AUXR1 = 0XA2;
sfr CCON = 0XD8;
sfr CMOD = 0XD9;
sfr CCAPM0 = 0XDA;
sfr CCAPM1 = 0XDB;
sfr CCAPM2 = 0XDC;

sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;

sbit CF    = CCON^7;
sbit CR    = CCON^6;
sbit CCF2  = CCON^2;
sbit CCF1  = CCON^1;
sbit CCF0  = CCON^0;

sbit PPCA = IP^7;



sfr CMPCR1 = 0XE6;
sfr CMPCR2 = 0XE7;

//sfr AUXR = 0X8E;
//sfr TH2 = 0XD6;
//sfr TL2 = 0XD7;
//sfr P4 = 0xc0;
//sfr P5 = 0xc8;

sfr PCA_PWM0 = 0XF2;
sfr PCA_PWM1 = 0XF3;
sfr PCA_PWM2 = 0XF4;

//sfr P1ASF = 0X9D;
//sfr ADC_CONTR = 0XBC;
//sfr PCON2 = 0X97;
//
//sfr SPSTAT      =   0xCD;   //
//sfr SPCTL       =   0xCE;   //
//sfr SPDAT       =   0xCF;   //

//sbit ADD = P1^2;
//sbit DEL = P5^5;
//sbit PWM2_L = P3^2;
//sbit PWM1_L = P3^3;
//sbit PWM0_L = P3^6;


extern void delay_ms(unsigned int ms);
//extern void Delay50ms(void);
extern unsigned char ReadKey(void);
extern void InitADC();
extern BYTE GetADCResult(BYTE ch);
extern void serial_open(void);
extern void senddata(uchar data_buf);
extern void pwm_init(void);

extern void set_pin16_pwm_value(unsigned char pwm_value);
extern void set_pin15_pwm_value(unsigned char pwm_value);

extern void timer0_init();

//-----------------------------------------------

sfr IAP_DATA    =   0xC2;           //IAP数据寄存器
sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字节
sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字节
sfr IAP_CMD     =   0xC5;           //IAP命令寄存器
sfr IAP_TRIG    =   0xC6;           //IAP命令触发寄存器
sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器

#define CMD_IDLE    0               //空闲模式
#define CMD_READ    1               //IAP字节读命令
#define CMD_PROGRAM 2               //IAP字节编程命令
#define CMD_ERASE   3               //IAP扇区擦除命令

//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
//#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

//测试地址
//#define IAP_ADDRESS 0x0400
#define IAP_ADDRESS 0x0000

extern void Delay(BYTE n);
extern void IapIdle();
extern BYTE IapReadByte(WORD addr);
extern void IapProgramByte(WORD addr, BYTE dat);
extern void IapEraseSector(WORD addr);
//extern void eeprom_tst_main(void);
uchar eeprom_save_para(uchar *pscr, uchar len);
uchar eeprom_read_para(uchar *pdst, uchar len);

#define V_SIG_VALUE_30V    77    /* 30v == 1.5v ==  76         changeVlotVal[0]*/

#define V_SIG_VALUE_60V    153    /* 60v == 3v ==  153         changeVlotVal[1]*/

#define V_SIG_VALUE_70V    179    /* 70v == 3.5v ==  179       changeVlotVal[2]*/

#define V_SIG_VALUE_74V    189    /* 74v == 3.7v ==  189       changeVlotVal[3]*/

#define V_SIG_VALUE_76V    194    /* 76v == 3.8v ==  194       changeVlotVal[4]*/

#define V_SIG_VALUE_80V    204    /* 80v == 4v ==  204         changeVlotVal[5]*/

#define A_SIG_VALUE_0A     3     /* 0.225A == 0.06v == 3*/

#define V_SIG_VALUE_30V_0025    (478 / 1000)     /* changeVlotVal[0]*/

#define V_SIG_VALUE_60V_0025    (956 / 1000)    /* changeVlotVal[1]*/

#define V_SIG_VALUE_70V_0025    (1116 / 1000)    /* changeVlotVal[2]*/

#define V_SIG_VALUE_74V_0025    (1179 / 1000)    /* changeVlotVal[3]*/

#define V_SIG_VALUE_76V_0025    (1211 / 1000)    /* changeVlotVal[4]*/

#define V_SIG_VALUE_80V_0025    (1275 / 1000)    /* changeVlotVal[5]*/ 

//void getTableDat(unsigned char index);
//void getTableDatInit(unsigned char index);
void getTableDat0025(unsigned char index);
void getTableDatInit0025(unsigned char index);

#define EEPROM_SAVE_DAT_LEN 2 

void mainBody(void);
void timerBody(void); 

extern unsigned int g_stepTime1;
extern unsigned int g_stepTime2;
extern unsigned int g_stepTime3;
extern unsigned int g_stepTime4;

extern unsigned char g_stepCurrent1;
extern unsigned char g_stepCurrent2;
extern unsigned char g_stepCurrent3;
extern unsigned char g_step3JumpCurrent;
extern unsigned char g_stepCurrent4;

#endif

库的工程如下图所示

把使用数据都打包到库函数中

 编译后的结果如下图所示,这里可以看到,成功编译234.LIB

"eeprom.obj",
"keyscan.obj",
"mainBody.obj",
"pwm.obj",
"timer.obj",
"vlottable.obj" 
TO "234.LIB"
LIB51 LIBRARY MANAGER V4.24
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2002
"234.LIB" - 0 Error(s), 0 Warning(s).

关键配置如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑msvcp120.dll缺失怎么办?由于找不到msvcp120.dll的解决方案

MSVCP120.dll文件是Windows操作系统中的一种动态链接库文件。它是由Microsoft C软件包提供的重要组件。当系统提示“MSVCP120.dll文件缺失”时&#xff0c;可能会导致某些应用程序无法正常运行。 以下是修复MSVCP120.dll缺失问题的几种方法&#xff1a; 方法一&#xff1a;修复…

如何在华为OD机试中获得满分?Java实现【公共子串计算】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

<学习笔记>从零开始自学Python-之-web应用框架Django( 十四)上线部署(阿里云+Nginx+uwsgi+MySQL)

好了&#xff0c;我们现在有了一个完整的网站&#xff0c;在自己电脑上跑起来没问题了&#xff0c;但是我们做网站肯定不只是为了在本机上自己欣赏&#xff0c;总要放到网上去让别人来浏览。这一章我们就完整跑一遍Django项目的生产环境部署。 1、基本原理 想让你的网站在公网…

【P38】JMeter 随机控制器(Random Controller)

文章目录 一、随机控制器&#xff08;Random Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.2、测试计划二2.3、勾选忽略子控制器块 一、随机控制器&#xff08;Random Controller&#xff09;参数说明 可以让控制器内部的逻辑随机执行一个&#xff0c;一般…

如何在华为OD机试中获得满分?Java实现【24点游戏算法】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

python自动演奏Freepiano【双手合奏】

文章编写背景 玩了N久的Freepiano,碍于本人没有天赋&#xff0c;左右手一直没法协调。 于是&#xff0c;突然奇想&#xff0c;也是代码设计的思路&#xff1a; 用多线程的方式&#xff0c;开两个线程&#xff0c;然后通过按键模拟的方式&#xff0c;分别模拟左右手去演奏。觉…

分布式网络通信框架(一)——集群和分布式

单机聊天服务器 缺点&#xff1a; 受限于硬件资源&#xff0c;服务器所能承受的用户并发量不够大&#xff1b; 任意模块修改&#xff0c;都会导致整个项目代码重新编译、部署&#xff1b; 系统中&#xff0c;有些模块是CPU密集型&#xff0c;有些是IO密集型&#xff0c;造成…

计算机网络五 传输层

传输层 概念 传输层是指ISO/OSI模型中的第四层&#xff0c;在计算机网络中起着非常重要的作用。它负责数据在网络中的传输&#xff0c;管理数据传输的可靠性和流量控制&#xff0c;保证数据在网络中不会丢失或重复。 提供的服务 传输层提供的主要服务有两种&#xff0c;分别…

《数据库应用系统实践》------ 包裹信息管理系统

系列文章 《数据库应用系统实践》------ 包裹信息管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&…

9. Linux下实现简单的UDP请求

本文简单介绍了UDP传输层协议&#xff0c;并在Linux下实现简单的socket通讯 一、UDP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…

阿里云服务器配置CPU内存、带宽和系统盘选择方法

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人用户选择轻量应用服务器或ECS通用算力型u1云服务器&#xff0c;企业用户选择ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网分享阿里云服务器配置选择方法&#xff1a; 目录…

大数据周会-本周学习内容总结015

开会时间&#xff1a;2023.05.28 15:30 线下会议 目录 01【fhzny项目】 02【Spark】 03【调研-数仓构建】 3.1【数仓构建&#xff0c;流程图、架构图、使用场景】 场景选择 组件设计 构建流程 04【专利】 05【导师点评】 01【fhzny项目】 GitLabMyBatis-PlusSpringbo…

Java001——基本的Dos命令

打开CMD的方式 1、win10&#xff1a;开始&#xff0d;>系统&#xff0d;>命令提示符 win11&#xff1a;开始&#xff0d;>windows工具&#xff0d;>命令提示符 2、Win键R输入cmd 打开控制台 3、进入文件夹&#xff0c;按住shift键鼠标右键点击&#xff0c;在此…

路径规划算法:基于萤火虫优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于萤火虫优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于萤火虫优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

[第一章 web入门]SQL注入-1

拿到题目是一篇日记&#xff0c;是GET型请求方式&#xff0c;我们可以直接在url栏中注入数据 判断注入类型&#xff0c;页面有回显所以不是整型注入 id 1 and 1 2 id 1 页面无回显&#xff0c;判断为字符型注入&#xff0c;闭合符应该就是单引号 id 1 order by 4-- 无回显&…

C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

Reorder buffer and Reservation station

Reoder buffer(ROB) 为了解决异常问题 instruction 的decode阶段被写入缓冲区的条目&#xff0c;指令完成的话&#xff0c;向缓冲区写入结果&#xff0c;最早decode的指令&#xff08;程序顺序&#xff09;如果没有被标记异常的话&#xff0c;写入reg file register rename …

基于STM32的IIC驱动协议实现

目录 1.简介 2.特点 3.协议细节 1.简介 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行线&#xff0c;用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线&#xff0c;可发送和接收数据。在 CPU 与被控 IC 之…

第一部分-基础篇-第一章:PSTN与VOIP(下篇)

文章目录 序言上一篇文章&#xff1a;1.6 电路交换与分组交换1.6.1 电路交换1.6.2 分组交换 1.7 VoIP1.8 IMS1.8.1 什么是IMS1.8.2 IMS的特点1.8.3 IMS核心网元&#xff08;1 &#xff09; CSCF&#xff08;2 &#xff09; MGCF&#xff08;3 &#xff09; IM-MGW&#xff08;5…

【数据结构】--单链表力扣面试题⑤链表分割

目录 一、有相对顺序的链表分割 二、无相对顺序的链表分割 一、有相对顺序的链表分割 题述&#xff1a;现有一链表的头指针ListNode* phead,给一定值x,编写一段代码将所有<x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排序后的链表的…