keil调用函数代码(keil5怎么调用函数)

Keil中C语言调用汇编函数

1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:

#pragma ASM

; Assembler Code Here

#pragma ENDASM

2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”

和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最

后文件;

C语言 keil 调用其他C文件的函数出错

app_fifo.h里面只有函数app_fifo_put的声明,但是并没有具体定义函数(函数没有任何内容)。

而app_fifo.c里面对函数app_fifo_put进行了定义(具体函数内容)。

所以在test1.c里面只是引用包含app_fifo.h这个头文件的话,因为函数app_fifo_put没有被定义,后来执行这个函数时就会报错 undefined symbol app_fifo_put(未定义符号app_fifo_put)。

如果是引用包含app_fifo.c,就不会报错(因为函数app_fifo_put被定义了)。

请采纳,谢谢

keil4怎么定义函数

打开Keil,点击菜单栏的“Project”-“Open Project”。

2

/7

切换到目标文件夹,找到你的项目,选择并点击“打开”,紧接着编译你的项目。

3

/7

切换到你需要查找的函数调用的地方,找到这个函数,比如我这里的“HAL_NVIC_EnableIRQ(TIM2_IRQn);”

4

/7

右击鼠标,在弹出的列表框中选择“Go to definition of xxxx”,其中xxxx为你的函数名称。

5

/7

可以看到,IDE自动切换到了对应的源代码当中。

6

/7

如果想找到函数声明的地方,那么可以点击“Go Reference of xxx”,其中xxx依然是你的函数名称。

7

/7

IDE自动切换到了函数声明的地方了。

注意事项

使用这个方法查找的前提是你的代码已经顺利编译过了,否则是不行的。

内容仅供参考并受版权保护

举报/反馈

不喜欢

京东带函数的计算器文具耗材,得心应手!

京东带函数的计算器文具耗材,色彩清晰,方便快捷,质量上乘,长久使用,超高颜值,舒适流畅!

京东广告

淘宝高中知识整理千万商品,品类齐全,千万别错过!

2021新版高中物理知识大全PASS绿卡图书第9次修订高一高二高三通用高中物理基础知识手册重点难点知识清单公式定理定律大全

¥49.8 元

2022版pass绿卡图书图解速记高中数学知识大全高中古诗文文言文小本高中英语词汇乱序版高中语文基础知识手册高中地理生物知识清单

¥26.8 元

【新教材新高考】高中物理知识大全必修选择性必修高一高二高三复习资料公式定律定理知识清单必备基础知识手册工具书pass绿卡图书

¥49.8 元

2022版pass绿卡图书图解速记高中物理知识大全高中物理公式大全小册高中物理公式定律手册口袋书高中物理基础知识高中物理知识清单

¥26.8 元

2022新版高考蝶变 学霸笔记高中语文数学英语3本套装 高一高二高三通用教辅导书高考知识点清单总结解题方法大全复习资料文理通用

¥179.4 元

simba.taobao.com广告

相关推荐

keil怎样生成hex文件?

2.4w人看过

keil为什么编译不了

5289人看过

学得乐 计算器小学生数学辅助加减乘除计算机财务会计办公用大按键语音记算器学生考试用简约太阳能款计算器 粉色-语音款

¥16.8 元

学得乐 计算器小学生数学辅助加减乘除计算机财务会计办公用大按键语音记算器学生考试用简约太阳能款计算器 黑色-语音款

¥16.8 元

学得乐 计算器小学生数学辅助加减乘除计算机财务会计办公用大按键语音记算器学生考试用简约太阳能款计算器 蓝色-语音款

¥16.8 元

京东广告

立创EDA怎么0元打样PCB板

5108人看过

关于数学正规优质平台-硕博导师团队

关注数学的人也在看

大连铭霆文化传媒有..广告

protues软件如何给单片机芯片添加程序?

1171人看过

怎么用proteus软件仿真单片机程序?

7502人看过

Keil项目怎么添加C文件

3797人看过

高中函数知识点总结,提高高中生成绩的方法

关注高中函数的人也在看

青岛迪曼悦教育咨询广告

百度法制宣传日-反诈及青少年普法宣传活动

解决keil mdk无法激活的问题

1.7w人看过

keil如何编译程序

1.4w人看过

高中函数知识点归纳,提高高中生成绩的方法

关注高中函数的人也在看

宁波牧文教育科技广告

Keil5怎么搜索和替换代码关键词?

1.3w人看过

keil编码格式怎么设置

3023人看过

proteus总线怎么用

8759人看过

高中数学函数知识点归纳,提高高中生成绩的方法

关注高中数学的人也在看

宁波牧文教育科技广告

Keil工具栏不见了

4.4w人看过

如何更改Proteus原理图中网格显示?

1.7w人看过

proteus8.0使用教程

3306人看过

proteus数码管怎么找

9063人看过

立创EDA设计双面PCB时如何将元件放到底层

2258人看过

怎么用proteus仿真LCD1602

2251人看过

keil4使用教程

6.7w人看过

proteus怎么调成中文

1.2w人看过

发表你的评论

抢沙发

8

keil如何快速找到代码

高级查找

步骤一:首先工程编译选项中要选择如图一:【Browse Infomation】选项,即浏览信息。

全编译工程至没有错误,这一点很重要,如果有严重的错误,则可能没有编译完,即一般的查找可能不会查到整个工程文件的内容,选成搜索的信息不全或是没有。

图一:设置编译选项

步骤二:如图二,双击需要查找的内容选中后,点击右键,选择查找项:

这里为简单的查找方式,方便与快速。可以查找到相关的定义及调用情况,在哪个文件里。这里必须是全编译通过的工程源码。

图二:选中并右键查找。

步骤三:如图三,部分汇编函数的变量或是函数名无法找到。有时查不到,怎么办呢?继续以下的方法。

图三:简单的查找没有找到相关项。

步骤四:如图四,选中后,通过Edit-Find in files..高级查找功能。这里要点就是设置搜索筛选的条件及文件范围,如是否精确查找或是只要部分包含等选项。

图四:打开高级查找功能:工程文件内容搜索。

步骤五:设置文件搜索的选项,尤其是工程文件夹,默认有可能不是整个工程文件夹。这里点击浏览选择整个工程文件。

图五:设置搜索选项。

步骤六:保证搜索文件范围为整个工程文件主目录。选择后,即可进行搜索了查找了。

图六:选择文件主目录。

步骤七:点击查找后,查看搜索到的信息。查看搜索到的结果,有可能很多,可以重新查找并修改查找选项等。

图七:文件搜索到的信息。

步骤八:双击并定位查看指定的搜索信息。双击即可定位并查看查找的结果。

图八:定位并查看指定的搜索信息。

有时需要对工程源码进行从头到尾的学习与消化,因此,查找功能还是比较有用的。从而让变量定义或是函数定义等无处藏身。虽然步骤很多,其实很简单。

最重要的,学习在于积累,有些技术的东西,就要多动手,然后再举一返三,熟能生巧。

张世争

微信公众号

嵌入式开发技术经验分享

打开CSDN,阅读体验更佳

keil c51 关键字_行知zzz的博客_c51扩展关键字

keil c51 关键字 一:KeilCx51扩展的关键字: •at•alien •bdata •bit •code •compac •data •far •idata •interrupt •large •pdata •priority•reentrant...

继续访问

KeilC51基本关键字_dylan_zhouhailiang的博客_c51关键字

KeilC51基本关键字 一、由ANSI标准定义的共32个: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof ...

继续访问

keil编辑环境下_“搜索”功能窗口中_Bookmark All命令的便捷之处

在keil编辑环境下,有时候调用一个函数,这个函数有执行的前提条件,比如要执行函数体内容得满足:if (cmdArrived) 条件; 可是变量:cmdArrived在哪里定义的? 在哪个函数里变量:cmdArrived满足条件,要怎么找比较快呢。 ctrl + F 打开搜索框,输入“cmdArrived”,再点击“Bookmark All”命令,所有的“cmdArrived”调用行全部使用了书签,这样就比较好着了; keil编辑环境工具栏搜索框输入cmdArrived,点击右边搜索命令,再点击“Book

继续访问

Keil 查找功能的使用

keil中如何查找和替换以及一个工程里所有文件所包含查找和替换的内容: 1、点击 edit-find或者快捷键 ctrl+f; 2、在look in中 选择current document就是查找或替换本文件的内容, 选择current project就是查找或替换整个工程的包含的内容 ...

继续访问

MDK keiluvision Volatile关键字的用法_点点墨的博客

MDK keiluvision Volatile关键字的用法 在定义变量时,变量前面加volatile修饰,作用是防止相关变量被优化。 例如对外部寄存器的读写。对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些...

继续访问

Keil中的code关键字_weixin_30823001的博客

Keil中的code关键字 一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间。但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的。其语法举例如下:...

继续访问

keil C51 中的库函数

非常有用的keil c51 库函数文档,受益匪浅,

Keil C51 V9.00/uVision 4基础

br / br /Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大br /可以使用以前的注册文件br /如果全新安装,在VISTA或者WIN 7系统下,请使用管理员方式运行,然后注册即可无限制运行br /注册方法:br / 1. 安装Keil C51 V9.00版本,即uV4br / 2. 打开uVision4,点击File---License Management...,打开License Management窗口,复制右上

继续访问

解决Keil 搜索关键字时不能跳转到所在位置的问题

问题:KEIL搜索结果不能跳转的问题分析过程:最近遇到一个问题:在keil5.1中ctrl+shift+s全局搜索,双击搜索结果后无法跳转。重装软件,换版本,修复电脑我都试了,都没用。最后发现,原先的程序可以跳转,而后来修改的不行。相同的工程在相同的目录下为什么一个可以一个不行呢?发现唯一的区别就是两个工程文件夹名称不同,由于修改过的版本我在工程文件名附加了 “(0922)”,我把括号去掉后就可以...

继续访问

keil5寻找自定义函数的位置

keil中想快速的找到自定义函数的位置,如下所示: 想找到CAN定义的函数位置: 第一步:先对程序进行build(第一步非常重要,如果不build,就不能用后面的快捷键与go to!!!) 第二步:可以光标放到函数的位置右击,然后点击go to definition…或者按F12 ...

继续访问

KEIL5 全局搜索关键字功能用不了的解决办法(CTRL+F)

CTRL+F跳出搜索界面 点击Find in Files 项目卡,选择Current Project即可。

继续访问

STM32F4工程--KEIL--搜索关键字

STM32F4工程--KEIL--搜索关键字 在.C文件或.H文件中搜索一个关键字 方法: ctrl+F 输入关键字即可查询 (问题解决,如果对大佬您有帮助的话,给小丁个赞呗,谢谢大佬)

继续访问

最新发布 如何通过KEIL查看所定义函数入口在内存的地址

如何通过KEIL查看所定义函数入口在内存的地址

继续访问

Keil软件开启“查找变量定义”功能方法

在使用Keil软件编写程序时,有可能将程序的变量定义和使用放在了不同的位置, 有时候想要查看变量的定义,可以使用Keil软件的查找功能。 1、使用Find功能一个个查找变量,在Keil界面输入 Ctrl+F,弹出查找界面。 将要查找的内容输入[Find what]查找框,[Look in]框选择"Current Document",然后点击"Find Next"就可以在当前文件一...

继续访问

Keil使用技巧及常见问题

文章目录Keil的使用快捷键Keil中使用Ctrl+Shift+F:在多个文件中搜索变量/函数(Find in files) Keil的使用快捷键 Keil中使用Ctrl+Shift+F:在多个文件中搜索变量/函数(Find in files) 搜索条件 说明 Find what 输入要搜索的关键字 指定要搜索的文件类型 指定要搜索的文件夹/工程 搜索属性...

继续访问

keil的主要功能和作用_keil进阶教程

前言keil只懂得创建软件工程是远远不够的,如果要想顺心使用,应该要懂得部分配置,这样使用心情顺畅,码代码也会越发高效。设置字号字体点击编辑菜单,会出现很多子目录,找到配置,点击进入设置页面。看到上方的子栏目,去选择colors,进入新界面,单片机用C语言编写·,那就点击编辑c文件,右边会出现字号,字体,字色设置,按照个人需求自行设置。改正错误有时候各种因素会出现编程错误,但自行又找不到错误在何处...

继续访问

KEIL5全局搜索,在find in files框内双击搜索内容,不能跳到相应位置

文件名包含了()括号,去掉就可以了。

继续访问

热门推荐 keil编程关键字没有彩色,找不到Keyword和 C++files解决办法

打开颜色设置,如果没有C/C++ Editor files 你就无法修改你的代码界面关键字颜色。 这种情况,很有可能是你的Keil安装目录下含有中文路径(一般国外专业软件我都放在D盘第一目录下的新建英文文件夹(Softwares)中,养成文件夹存放的好习惯,日后无论是安装还是找路径都会方便许多。),将你的Keil安装文件整个拖到英文目录下,或者修改目录名为英文。 接下来重启软件,就可以设置关键字了。 注意:修改前关闭keil,如果文件名无法修改,说明当前有文件里的东西正在运行。需关闭”修改目录“所在文件里的

继续访问

Keil代码整体偏移和查找功能

选中要偏移的代码,然后按TAB键,所有被选中的代码就会向后偏移TAB,TAB等于多少个空格,可以在“Edit”-“Editor”-“C/C++ Files”下面设置。 如果要返回,则选中目标代码,按Shift+TAB就行了。 Keil的查找功能

继续访问

Keil如何查看函数或变量调用---非Ctrl F

今天公司新人问我,Keil这个编译器怎么查看一个函数都在哪里被调用?我脱口而出 辣鸡软件只能用Ctrl F慢慢找。。要么你就先用SourceInsight编辑代码,改好了再去编译吧。 好好的编译器怎么会没有这个最基本的功能呀?? 想着这个问题,于是就有了今天的意外之喜。 操作方法如下: 在View中调出SourceBrowser这个窗口,将需要查找定义及调用位置的 函数、变量、宏等复制到Symbol处,回车 你就可以看到DefinitionsReferences了,双击可以跳转到对应的代码位置。这

继续访问

keil查找函数引用的方法

1.快捷键ctrl+f 2在Find in Files中填要找的,Find all. 3.ojbk

继续访问

如何在KEIL里面搜索一个函数名或者字符串

使用Ctrl + F 会出现如下弹窗,这个就是一个搜索窗口。 这个弹窗的搜索内容会和你之前选中的字符串一样,同时可以选择在一个文件下找,也可以选择查找那个文件含有这个字符串 查找含有某一个字符串的文件 ...

继续访问

实验一 单片机 绘制原理图

实验一 2.2绘制原理图 1.首先在开始菜单栏里面输入“ISIS”打开软件; 2.1)单击元器件列表窗口上边的按钮P,弹出图2.1所示元器件选择窗口; 图2.1 2)在该窗口左上方的关键字文本框内输入8051,在窗口右上方的栏中将显示出80C51图形符号,同时显示该器件的虚拟仿真模型VSM DLL model(MCS8051.DLL)如图2.2; 图2.2 3) 用鼠标从器件选择窗口中选中需要的器件,单机确定按钮后,选择的器件将出现在预览窗口中如图2.3; 图2.3 4)将鼠标指向编辑窗口并单

继续访问

keil查找关键字

Keil

怎么使用keil51库函数∼请举例说明

#includereg51.h//包含头文件reg51.h

把这句话放在函数开头就可以了

例如:

include reg51.h //此文件中定义了51的一些特殊功能寄存器

void delay(unsigned int i); //声明延时函数

main()

{

P1 = 0x00; //置P0口为低电平

delay(600); // 调用延时程序

P1 = 0xff; //置P0口为高电平

delay(600); // 调用延时程序

}

/*******延时函数*************/

void delay(unsigned int i)

{

unsigned char j;

for(i; i 0; i--)

for(j = 255; j 0; j--);

}

//51编程不像arduino那样有很多内定函数可以使用,很多需要你自己写的哈

怎么让keil代码同时运行两个函数

①混合编程的必要性:也就是为什么需要混合编程,初学者一定会觉得,我C用的好好的为什么要混进汇编呢,不是自找麻烦吗?其实不然,最简单的例子就是延时子程序,用C写的话连你自己也不知道几层的循环后确切地用多少时间吧?但用汇编写你就能很准确地计算出要延时的时间。还有当你要对那些时序要求很高IC模块或步进电机行操作时用汇编来写就能做到操控的直接与精准。

②在进行实际操作前要弄清C与汇编之间的调用关系,C的函数大家都会用了,主要分为无反回参数的和有反回参数的,例如 void delay(void);就是无反回参数的,int readdata(void);就是有返回参数的。还有就是有参数传递和无参数传递的,void delay(void);就是无参数传递的,unsigned int add(unsigned char aa,unsigned char bb);就是有参数传递的函数。在教材上讲起C与汇编的混合编程就会说起寄存器最多传递三个函数,这样可以产生高效代码。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

在参数返回时寄存器的传递规律为:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

下面我们用实际的混合编程操作来讲讲如何实现函数的调用及参数的传递。

打开KEIL,我的用的版本是绿色免安装2.0中文版,编译器为7.0:无程序代码长度限制。现在有3.0版也是绿色免安装版本,好处是已支持双字节中文注释,但是英文版。用哪个版本都无所谓,只要用着习惯功能够用就行。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

下面是版本信息:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

在网上经常有朋友说为什么我下载了KEIL解压出目录后运行却不能编译呢,老是报告出错:

--- Error: can't execute 'E:\old_pc\txz001\单片机c51\KEIL4\C51\BIN\C51.EXE'

--- 错误: 不能执行 'E:\old_pc\txz001\单片机c51\KEIL2_70\Keil2\C51\BIN\C51.EXE'

这是由于编译时,C51.exe编译器没能在你给出的路径上找到。你需要修改路径。

在选择KEIL的菜单栏“工程”--“文件扩展名、书籍和编译环境属性”--“环境设置”的如下图:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

看到上图的“使用TOOLS.INI设定”前的钩了吗?对了,它是按照你TOOLS.INI里给出的路径去找的。因此的得打开那个tools.ini文件修改它。KEIL的目录结构一般是这样的:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

我们KEIL软件运行主程序uvision2是在目录UV2里,而那个设置文件TOOLS.INI文件是在它的上一级目录Keil里,见上图。用记事本打开这个TOOLS.INI文件:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

看见红笔圈出的[C51]下的路径了吗?将它修改正确指向你硬盘上KEIL下C51目录,存盘,运行KEIL。就可以正确编译了。(废话又多了。。。)好!言归正传。

我们在KEIL里创建一个新的工程TEST1。在这个工程里我们添加了两个文件,main.c和delay.c,程序如下:

文件main.c:

#include AT89X52.H

extern void delay(void);

main(void)

{

delay();

}

文件delay.c

#define uchar unsigned char

void delay(void)

{ uchar i;

for(i=255,i0,i--);

}

可以看出,这两个文件里的程序很简单,主程序里先定义了一个外部函数delay();然后就调用了这个无参数函数。而文件delay.c里也就是用for循环做了255次循环。

下面我们先进行编译,调试让程序正确,通过编译。然后我们选择左边工程窗口,选中文件delay.c,鼠标右击它出现下图。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

选择“文件'delay.c'属性”后如下图:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

见上图,有“产生汇编文件”和“汇编源代码文件”两项前的钩选框是灰色的,分别点击它们两次使它呈黑色钩选状态。如下图。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

点击下面的确认钮,回到主界面。这时你再进行一次全部的重新编译,就会发现在你建立这个工程的目录下将多产生一个delay.src文件。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

用记事本打开这个delay.src文件。发现它就是一个汇编文件。

; .\delay.SRC generated from: delay.c

; COMPILER INVOKED BY:

; E:\old_pc\txz001\单片机c51\KEIL2_70\Keil\C51\BIN\C51.EXE delay.c BROWSE DEBUG OBJECTEXTEND SRC(.\delay.SRC)

NAME DELAY

?PR?delay?DELAY SEGMENT CO DE

PUBLIC delay

; #define uchar unsigned char

; void delay(void)

RSEG ?PR?delay?DELAY

delay:

USING 0

; SOURCE LINE # 2

; { uchar i;

; SOURCE LINE # 3

; for(i=255;i0;i--);

; SOURCE LINE # 4

;---- Variable 'i?040' assigned to Register 'R7' ----

MOV R7,#0FFH

?C0001:

DJNZ R7,?C0001

; }

; SOURCE LINE # 5

?C0004:

RET

; END OF delay

END

可以看出原来的C程序都变成了汇编的注释了。我们将注释都去掉。

NAME DELAY

?PR?delay?DELAY SEGMENT CO DE

PUBLIC delay

RSEG ?PR?delay?DELAY

delay:

USING 0

MOV R7,#0FFH

?C0001:

DJNZ R7,?C0001

?C0004:

RET

END

现在看看是不是很简呢。在标号delay:前是程序的说明,就是定义函数的名字,将代码放在哪里等,看不懂也没关系,别乱改它就行。从delay:标号后就是汇编的程序部分了。里面的标号最好也别乱改。添加你要操作的程序就行了,好!我们先不改动程序,就将上面十行汇编别存为delay.asm文件。回到KEIL界面,我们在工程窗里(是KEIL主界面左边的工程窗口而不是在工程目录里)的将delay.c删除。然后再添加上delay.asm程序,如下图:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

这样,你再进行编译,你会发现你已经通过了混合编程的编译,虽然这次你对程序的功能什么都没有改变,但你已经知道如何做出一个C程序调用汇编子程序的例子了。下面我们可以对这个汇编了程序进行一些修改看它是否仍能很好的工作。

今天我们就来对那个汇编的delay子程序进行修改,为了让运行的结果能显示出来,我先加进一个LCD的显示子程序12864put.c。

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

我们先修改主程序如下:

//****************

// 主函数

//****************

main(void)

{ uchar aa,bb;

TMOD=0x01;//定义T0为模式1即16位计数方式

TH0=0;//将计数器高位初值清0

TL0=0;//将计数器低位初值清0

TR0=1;//计数器开始计数

//delay(); //调用汇编的子函数

TR0=0;//停止计数

aa=TH0;//把计数的值高位交给aa

bb=TL0;//把计数的值低位交给aa

LcmInit();//初始化LCD12864

LcmClear();//清屏LCD

LcmPutstr( 0,28,"CA TEST" );//显示

LcmPutstr( 3,0,"TH0:" );

LcmPutstr( 3,24,uchartostr(aa) );

LcmPutstr( 3,46,"TL0:");

LcmPutstr( 3,70,uchartostr(bb) );

LcmPutstr( 5,0,"BLOG:http://" );

LcmPutstr( 6,18,"hi.baidu.com/txz01" );

LcmPutstr( 7,8,"Email:TXZ001@139.com" );

看见上面的程序了吗?我用了T0在调用汇编子函数delay()前开始计数,调用完后就关掉,然后看计数器内的计数值来知道我们这个子函数的精确程度。我先把delay()函数给注释掉,看看开始计数后就立即关掉要用去多少时间。结果显示为1,就是说用了一个脉冲的时间。12M的晶振就是一微秒。见下图:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

看到没有,用了TR0=1;TR0=0;本身就用去了一个脉冲。好!现在我们将那个调用汇编子函数delay()语句启用,但我将汇编内的语句给清空。也就是说我把delay.asm这个子程序让它什么也没做。是个空函数,看它要用掉几个脉冲时间。汇编程序如下:

NAME DELAY

?PR?delay?DELAY SEGMENT CO DE

PUBLIC delay

RSEG ?PR?delay?DELAY

delay:

RET

END

看到了吗?标号delay:下面什么也没有了,直接就RET返回了。好!编译,烧写,运行!如下图:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼结果是用了5个脉冲,其中一个是调用计数器本身用的,也就是说调用一个空函数用了4个脉冲时间。好!我们再来修改一下汇编程序:

NAME DELAY

?PR?delay?DELAY SEGMENT CO DE

PUBLIC delay

RSEG ?PR?delay?DELAY

delay:

mov r7,#100

djnz r7,$

RET

END

在标号delay:下面我加了两行,我们计算一下,第一行MOV r7,#100要用一个机器周期,也就是一个脉冲。第二行djnz r7,$要循环100次每次用2个机器周期,这样算来共是201个脉冲再加上刚才我们计算过的调用函数要4个脉冲和开关计数器用1个,总共是206个。编译,烧写,运行!

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼看来计算的没错呀!我们再循环多些:

NAME DELAY

?PR?delay?DELAY SEGMENT CO DE

PUBLIC delay

RSEG ?PR?delay?DELAY

delay:

mov r7,#100 ;1

loop:mov r6,#50 ;100

djnz r6,$ ;50×100×2

djnz r7,loop ;100×2

RET

END

这次的计算应该是1+100+50×100×2+100×2+5=10306。再次编译烧写运行!

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

高位数值为40,低位数值为66,则总数=40×256+66=10306。精准吧!好了!无参函数的调用就讨论到此。

下面接着说说带参数据函数的调用:

我们重新建立一个目录TEST2(因为一个项目有很多个文件如果都放在一个目录里会很混乱,以后想挪到U盘带到其它机子上用时就很困难了),建立新的项目test2.Uv2,里面还是main.c主程序和12864put.c显示子程序:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼主函数main()如下:

#include AT89X52.H

#include intrins.H

#define uchar unsigned char

#define uint unsigned int

extern void LcmClear( void ); //清屏

extern void LcmInit( void ); //初始化

extern void LcmPutstr( uchar row,uchar y,uchar * str ); //在设定位置显示字符串

//row:是LCD的行数(0-7)

//y:是LCD的列数(0-127)

//str:是字符串的首地址

extern uint add(uchar aa,uchar bb);

extern void inttostr(uint intval,uchar da ta * str);

uchar str[6];//定义四个字节空间用来存放数值转换成的字符值

//****************

// 主函数

//****************

main(void)

{ uchar aa,bb;

uint cc;

aa=145;

bb=236;

cc=add(aa,bb);

LcmInit();//初始化LCD12864

LcmClear();//清屏LCD

LcmPutstr( 0,28,"CA TEST" );//显示

inttostr(aa,str);

LcmPutstr( 3,0,str );

LcmPutstr( 3,18," + " );

inttostr(bb,str);

LcmPutstr( 3,36,str);

LcmPutstr( 3,54," = ");

inttostr(cc,str);

LcmPutstr( 3,72,str);

//LcmPutstr( 3,46,"TL0:");

//LcmPutstr( 3,70,uchartostr(bb) );

LcmPutstr( 5,0,"BLOG:http://" );

LcmPutstr( 6,18,"hi.baidu.com/txz01" );

LcmPutstr( 7,8,"Email:TXZ001@139.com" );

while(1);

}

项目中还有uinttostr.c是无符号整型转字符串子程序和我们要做汇编调用的这个有返回参数有传递参数的子程序add.c,子程序add.c如下。

#define uchar unsigned char

#define uint unsigned int

uint add(uchar aa,uchar bb)

{

uint cc;

cc=aa+bb;

return(cc);

}

我们主要目的是为了表达清楚怎样在C程序里去调用汇编子函数,所以程序还是很简单,就是把主程序传过来的无符号字符型变量aa和bb相加,相加的结果交给无符号整型变量cc返回给主程序。编译前我们还是点取add.c文件属性,让它产生src文件。上面的图已显示了编译的过程信息。现在我们打开这个add.src文件:

; .\add.SRC generated from: add.c

; COMPILER INVOKED BY:

; E:\old_pc\txz001\单片机c51\KEIL2_70\Keil\C51\BIN\C51.EXE add.c BROWSE DEBUG OBJECTEXTEND SRC(.\add.SRC)

NAME ADD?

?PR?_add?ADD SEGMENT CO DE

PUBLIC _add

; #define uchar unsigned char

; #define uint unsigned int

;

; uint add(uchar aa,uchar bb)

RSEG ?PR?_add?ADD

_add:

USING 0

; SOURCE LINE # 4

;---- Variable 'bb?041' assigned to Register 'R5' ----

;---- Variable 'aa?040' assigned to Register 'R7' ----

; {

; SOURCE LINE # 5

; uint cc;

; cc=aa+bb;

; SOURCE LINE # 7

MOV A,R5

ADD A,R7

MOV R7,A

CLR A

RLC A

MOV R6,A

;---- Variable 'cc?042' assigned to Register 'R6/R7' ----

; return(cc);

; SOURCE LINE # 8

; }

; SOURCE LINE # 9

?C0001:

RET

; END OF _add

END

我们还是将注释的部分删去,这样便于我们分析:

NAME ADD?

?PR?_add?ADD SEGMENT CO DE

PUBLIC _add

RSEG ?PR?_add?ADD

_add:

USING 0

MOV A,R5

ADD A,R7

MOV R7,A

CLR A

RLC A

MOV R6,A

RET

END

现在我们首先来看函数名,上面我们讲过的那个无参数函数delay()的调用,产生的汇编子函数名就是delay,而这次我我们原来C的函数名add变成了汇编的_add。前面多了个下划线,这就是有参数函数的特征。C语言函数名转变为汇编函数名的规律为:无参数传递时void func(void)----FUNC。寄存器参数传递时char func(char)----_FUNC。再入函数使用时void func(void) reentrant----_?FUNC。

不过这些名字的变化规律记没记住好象关系并不大。我们想要用到汇编调用时,就先用C做个假函数然后产生汇编文件名字就自然出来,并不用我们去管它的命名,然后去修改成我们想做的汇编程序就行了。

但是,这参数传递的位置规律就必须得知道,否则你就无法使用这个汇编了,我们看上面的汇编程序,第一句是将寄存器R5的值传到A中,第二句将A与寄存器R7相加,第三句将相加的结果A的值传给R7,后面的几句是将刚才相加的进位值C,传给R6,然后返回。对照本篇最上面给的那两张表我们可以看出C子函数add.c的第一个参数aa被传到了汇编的R7,第二个参数bb被传到了R5,将它们相加后,返回值的低位交给了R7,高位交给了R6。完全符合参数传递表和返回值表所述。下面我们将汇编子程序另存为asm文件后替换掉原来的C子程序:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼

编译、烧写后运行:

KEIL的混合编程操作 - 少占鱼-网易 - 少占鱼这个加法函数我们没有改动任何参数当然运行起来是不会错的,下面我们将在汇编里将它改成乘法试试,

将标号_add:下面的语句全都改掉,程序如下?

NAME ADD?

?PR?_add?ADD SEGMENT CO DE

PUBLIC _add

RSEG ?PR?_add?ADD

_add:

USING 0

MOV A,R7

MOV B,R5

MUL AB ;A与B相乘,乘积的高位值在B中,低位值在A中

MOV R7,A ;将低位值传给R7

MOV R6,B ;将高位值传给R6

RET

END

361知讯网

本文链接:http://pdidw.com/keil/49473.html

发表评论

评论列表

还没有评论,快来说点什么吧~