为了便于一些通用代码模板的维护与扩展,我们在实际开发中会经常使用宏定义。使用#define指令,你可以把任何文本替换到程序中。也可以使用宏定义定义一些预编译指令,通过预编译指令实现工程的不同配置。如下:
#define DEBUG 1 //1:使能调试信息输出;0:禁止调试信息输出
#define PI (3.1415)//定义π
#define ADC_CH 0 //ADC的采集通道
随着工程项目功能的增多,宏定义太多时容易造成混淆或者错误。今天给大家讲解一下keil中非常实用的图形化编程工具为了便于一些通用代码模板的维护与扩展,ConfigurationWizard。先看图:
本文就对Keil的图形化界面编程进行详细的讲解。
01、开始和结束命令
keil的图形化编程的开始是:
// <<< Use Configuration Wizard in Context Menu >>>
图形化编程的结束是:
// <<< end of configuration section >>>
当文件中出现上面的开始和结束的字符串时,在keil界面就可以看到【Configuration Wizard】的选项卡了。就可以根据本文讲解的内容进行可视化编程设置了。
02、<h>和<\h>命令:形成一个折叠组
<h>后面的内容就是折叠组的名称,如下所示:
//<h> 工程配置
//<h> 底层/硬件配置
//</h>
//<h> 应用层/软件设置
//</h>
//</h>
共形成三个折叠组:工程配置中包涵底层/硬件配置和应用层/软件设置。如下图所示:
03、<i>命令:上一条项目的注释提示
在上面<h>工程配置下面,增加如下的代码后:
//<i> 这里是工程配置的介绍:欢迎关注【玩转单片机与嵌入式】公众号,学习更多实用的知识
界面可以看到在配置设置界面有提示,并且鼠标悬停时,也会弹出相关提示。
04、<o>命令:创建一个可选择的数据选项
// <o> 晶振
// <8=> 8 MHz
// <12=> 12 MHz
// <16=> 16 MHz
// <24=> 24 MHz
// <48=> 50 MHz
#define OSC_LCK 12
上面代码的可视化界面如下:
在此时已经可以关联宏定义了,如上面的定义,当晶振的选项框选择【12MHz】时,OSC_CLK的值为12。当选择其他数值时,OSC_CLK对应的就是选项框前<>内的数值。如选择【50MHz】时,OSC_CLK的值为48。
05、<o>命令:创建一个可直接输入的数据选项
// <o> 节拍时钟(Systick clk) ms <0-2000:10>
// <i> 系统节拍时钟默认 10ms;最小单位:10ms
#dfine SYSTEM_TICK 10
在上面的代码中<0-2000:10>的解释如下:
- 0-2000:代表输入的有效范围为0-2000,当输入超过2000的数值时,自动变为2000。
- 10:最小步进值,输入时只能输入10的倍数。
06、<q>命令:一个将bit值显示为复选框的选项。
// <q>ADC通道配置 配置AN0为AD通道
#define ADC_CH 1
上图中复选框选中时,ADC_CH的值为1,未选中时,ADC_CH的值为0。
07、<o 0..3>命令:修改选项中数字表示的位(例如bit 0~bit 3)。
// <o.0..3>ADC时钟周期 <0=>tad=2tsys
// <1=>tad=4tsys
// <2=>tad=6tsys
// <3=>tad=8tsys
// <4=>tad=12tsys
// <5=>tad=16tsys
// <6=>tad=24tsys
// <7=>tad=32tsys
#define ADC_CLK 0x17
当下拉选项框选择tad=32tsys时,ADC_CLK的值为0x17。此时修改选项框中的选项,仅仅会影响ADC_CLK的bit0~bit3,已经定义的ADC_CLK的bit4为1,此时修改选项框的内容不会影响bit4的内容。
08、<e>和</e>命令:可以使能的标题: 紧随其后的选项归为一组,可以通过复选框使能。
//<e> 使能看门狗功能
#define WDT_EN 1
//<o> 看门狗复位时间(ms) <0-500>
//<i> 最大支持500ms
#define WDT_TIME 50
//</e>
当选中【使能看门狗功能】后面的复选框时,WDT_EN的值为1。同时,【看门狗复位时间】可以修改。
当未选中【使能看门狗功能】后面的复选框时,WDT_EN的值为0。同时,【看门狗复位时间】变为灰色,不能修改。但是在</e>后面的内容不受复选框的影响。
09、<c>和</c>命令:批量代码注释
// <c> 使能DEBUG输出
//#define USING_DEBUG
// </c>
<c>和</c>是配套使用的。其功能产生一个复选框,选中复选框则使代码使能,否则被注释,而<!c> </c>正好相反。
当【使能DEBUG输出】的复选框未选中时,#define USING_DEBUG的代码被注释掉。
10、<s>命令:字符串输入
// <s> 软件版本号
#dfine VERSION "V001.001.1234"
在可视化界面中,通过修改V001.001.1234的数值,实现修改VERSION 的效果。
11、<o0.1>命令:数字独立位的设置
// <e1.7> 独立位设置
// <o0.0> value bit 0
// <o0.1> value bit 1
// <o0.2> value bit 2
// <o0.3> value bit 3
// <o0.4..6> value bit 4 5 6
// <0=> enable input 0 <1=> enable input 1
// <2=> enable input 2 <3=> enable input 3
// <4=> enable input 4 <5=> enable input 5
// <6=> enable input 6 <7=> enable input 7
#define INPUT_CONFIG 0x07
#define INPUT_EN 0x80
通过勾选【value bit 0】后面的复选框,实现INPUT_CONFIG第0位的设置。其他位类似。
<o0.0>:的解释如下:
- 第一个数字0:定位为下面的第一个宏定义,#define INPUT_CONFIG。
- 第二个数字0:代表INPUT_CONFIG宏定义的第几个位。
例如<e1.7>代表定位到下面第二个宏定义的第7位(bit7)。
通过以上的方式,可以将所有宏定义放到一起,通过命令后面的数字定位使用第几个宏定义。
例如:
// <c3> use module
// <i> module use macro define
//#define USING_MODULE1
//#define USING_MODULE2
//#define USING_MODULE3
// </c>
上面的<c3>,表示通过<c>和</c>命令修改下面第三个宏定义是否被注释掉。
12、<s1.8>命令:限制字符串的长度最大为8
// <s0> 无长度限制的字符串 id1
// <s1.8> 有长度限制的字符串 id2
#define ID "欢迎加我的微信:xyzn3333"
#define ID2 "xyzn3333"
当id2字符串输入的长度超过8个字节时,会提示不能再输入的声音。
13
<#>命令:在数值添加到字段中之前修改(加,减,乘,除)数值
//<o> 数据修改:数值乘以8 <#*8>
#define DATA_MUL1 40
//<o> 数据修改:数值+9 <#+9>
#define DATA_ADD1 59
当【数值乘以8】后面的数据填写5时:DATA_MUL1的值为5*8=40。当【数值+9】后面的数据填写为50时:DATA_ADD1的值为50+9=59