Presentation is loading. Please wait.

Presentation is loading. Please wait.

周国运 Keil C51应用 2005.4 Email:zhouguoyun@sina.com 主 页:http://freeweb.nyist.net/~zhougy/

Similar presentations


Presentation on theme: "周国运 Keil C51应用 2005.4 Email:zhouguoyun@sina.com 主 页:http://freeweb.nyist.net/~zhougy/"— Presentation transcript:

1 周国运 Keil C51应用 2005.4 Email:zhouguoyun@sina.com
主 页:

2 主要内容 第一节 Keil C51变量 第二节 Keil C51函数与中断处理程序 第三节 Keil C51与汇编语言混合编程方法

3 第一节 Keil C51变量 主要内容 1、变量的定义方法 2、变量的绝对定位 3、指针

4 第一节 Keil C51变量(1) 1.1 变量的定义方法 定义格式:[存储类型] [存储空间] 数据类型 变量名;
1.1 变量的定义方法 定义格式:[存储类型] [存储空间] 数据类型 变量名; ([store_mode] [memory_space] type variable_name;) 也可写为: [存储类型] 数据类型 [存储空间] 变量名; 存储类型有:静态变量(static)和动态变量(auto 缺省) 存储空间有:data、idata、bdata;xdata、pdata;和code 例: unsigned char data time0H; unsigned int code timexx[30];

5 第一节 Keil C51变量(1) data 、idata、bdata类型都存放在片内RAM中,分别为直接寻址区、间接寻址区(00---7FH)和可位寻址区(20H---2FH);对于定义在可位寻址区bdata中的数据,即可以按定义的类型操作,也可以按位操作。 xdata 、pdata类型存放在片外RAM中,pdata类型访问范围为1页; code类型存放在程序存储器(作为固定数据表,如数码管显示代码)。 缺省时存储空间为存储模式对应的类型。存储模式有small(对应data型) 、compact(紧凑型,对应pdata型)和large(对应xdata型),括号中为缺省时的存储类型。

6 第一节 Keil C51变量(2) 数据类型有: (1)字符型:char、unsigned char;
(2)整型: int、 unsigned int、 long、 unsigned long; (3)浮点与双精度型: float、 double; (4)C51中扩展的类型:bit、 sfr、 sfr16、 sbit (5)结构体、指针等 bit:比特类型, 如 bit run_flag; sfr:特殊功能寄存器类型, 如 sfr P0=0x80;(0x80为地址) sfr16:16位特殊功能寄存器类型,如 sfr16 DPT=0x82;(即DPTR) sbit:特殊功能寄存器位类型 如 sbit EINT=0xAF; (0xAF为位地址)

7 1.2 变量的绝对定位 第一节 Keil C51变量(3) 用关键字:_at_ 格式: [存储类型] [存储空间] 数据类型 变量名
1.2 变量的绝对定位 用关键字:_at_ 格式: [存储类型] [存储空间] 数据类型 变量名 _at_ constant; constant为定位的地址 如:data char musich _at_ 0x29, musicl _at_ 0x2a;

8 第一节 Keil C51变量(4) 1.3 指针 三、指针存储空间 也可以指定指针所存储的空间 定义格式: 数据类型 *存储空间 指针名;
1.3 指针 一、通用指针 定义时不用指明指针所指向数据的存储空间,指针本身占3个字节。 定义格式: [存储类型] 数据类型 *指针名; 二、专用指针 定义时要指明指针所指向数据的存储空间,指针本身占1个或2个字节。 定义格式: [存储类型] [存储空间] 数据类型 *指针名; 三、指针存储空间 也可以指定指针所存储的空间 定义格式: 数据类型 *存储空间 指针名; 如:int *xdata p1; char *data p2;

9 第二节 Keil C51函数与中断处理程序 主要内容 1、 Keil C51函数格式 2、 Keil C51参数的传递规则
3、 中断处理程序的格式

10 2.1 Keil C51函数格式 第二节 Keil C51函数与中断处理程序(1) 格式:
[return_type] function_name([args]) [small|compact|large][reentrant] [using m] small|compact|large:存储模式 reentrant:重入函数(可被多个进程同时调用执行,并且函数自身可以递归调用) using m:使用的工作寄存器组。m=0---3 例:char add_func(char aa,char bb) using 1

11 第二节 Keil C51函数与中断处理程序(2) 2.2 Keil C51函数中参数的传递规则
参数的传递途径有:寄存器、存储器和堆栈(重入函数); 其返回参数均通过寄存器传递。 一、利用寄存器传递参数的规则 如: int func(int a, int b, char *c) 参数a、b、c分别通过R6/R7、R4/R5、R1/R2/R3传递。 参数编号 char,1字节指针 Int,2字节指针 Long, float 一般指针 1 R7 R6(高),R7(低) R4 (高) ---R7 (低) R1,R2,R3 2 R5 R4(高),R5(低) 使用固定地址 存储类型在R3,地址高位在 R2,低位在 R1 3 R3 R2(高),R3(低)

12 第二节 Keil C51函数与中断处理程序(3) 二、返回参数传递规则 通过寄存器传递 返回类型 使用的寄存器 说 明 Bit
说 明 Bit 进位标志:Cy 单个位通过进位标志Cy返回 char, 1字节指针 R7 单个字节类型通过R7返回 int, 2字节指针 R6, R7 高字节在R6 long R4---R7 高字节在R4 float 32位IEEE格式 一般指针 R1---R3 存储类型在R3,地址高位 在 R2,低位在 R1

13 2.3 Keil C51中断处理程序的格式 第二节 Keil C51函数与中断处理程序(4) 格式:
void function_name( )[{small|compact|large}] interrupt n [using m] interrupt n:中断号。n=0---4,5--- using m:使用的工作寄存器组。m=0---3 注意:中断处理程序没有入口参数、没有返回值 中断号 1 2 3 4 5--- 中断源 外中断0 T0溢出 外中断1 T1溢出 串行中断 ……

14 主要内容 第三节 Keil C51与汇编语言混合编程方法 1、在C语言中嵌入汇编语言 2、在C51项目中加入汇编语言文件

15 第三节 Keil C51与汇编语言混合编程方法(1)
方法:用编译控制指令“#pragma src” 和 “#pragma asm / #pragma endasm”实现 “src”为编译控制命令,令编译器将C源文件编译成汇编文件; 格式: #pragma src (放在文件的开始) [return_type] function_name([args]) [其它参数] { : (C语言源程序) #pragma asm : (汇编语言源程序) # pragma endasm : (C语言源程序) }

16 第三节 Keil C51与汇编语言混合编程方法(2)
一、KEIL C51对C语言编译成汇编语言的规则 1、 C51中函数名的转换规则 C51函数声明 转换后的函数名 说 明 void func1(void) FUNC1 无参数传递,函数名不改变 type func2(args) _FUNC2 有参数传递,前加“_”,通过寄存器传递 type func3(args) reentrant -?FUNC3 有参数传递,前加“_?”,通过堆栈传递(在调用时也用寄存器传递,在函数中再转存入堆栈中)

17 第三节 Keil C51与汇编语言混合编程方法(3)
段名前缀 存储区类型 说 明 ?PR? code 可执行程序段 ?CO? 程序存储器中的常数数据段 ?BI? bit 内部数据存储区的位类型数据段 ?BA? bdata 内部数据存储区的可位寻址的数据段 ?DT? data 内部数据存储区的数据段 ?FD? far 外部数据存储区的far型数据段 ?FC? const far 程序存储器中的far型常数数据段 ?ID? idata 内部数据存储区的间接寻址的数据段 ?PD? pdata 外部数据存储区的分页数据段 ?XD? xdata 外部数据存储区的一般数据段

18 第三节 Keil C51与汇编语言混合编程方法(4)
分成两大部分 1、声明部分 1)模块名定义格式(在文件开始) NAME 模块名 2)子程序代码段声明格式(在模块名定义之后)如: ?PR?[_|_?]函数名1(子程序名1)?模块名 SEGMENT CODE ?PR?[_|_?]函数名2(子程序名2)?模块名 SEGMENT CODE ?PR?[_|_?]函数名n(子程序名n)?模块名 SEGMENT CODE 3)子程序被调用属性声明格式(紧接前面)如: PUBLIC [_|_?]函数名1(子程序名1) PUBLIC [_|_?]函数名2(子程序名2) PUBLIC [_|_?]函数名n(子程序名n) 示可执行程序段前缀 示通过堆栈传递 参数的重入函数 示通过寄存 器传递参数 声明为公 共子程序

19 第三节 Keil C51与汇编语言混合编程方法(5)
3、 汇编语言文件子程序段声明例子 NAME SHIYAN ?PR?yinyue?SHIYAN SEGMENT CODE ?PR?_youyi?SHIYAN SEGMENT CODE ?PR?Time0_ISR?SHIYAN SEGMENT CODE ?CO?gepub?SHIYAN SEGMENT CODE ?CO?timexb?SHIYAN SEGMENT CODE PUBLIC yinyue PUBLIC _youyi PUBLIC Timer0_ISR PUBLIC gepub PUBLIC timexb

20 第三节 Keil C51与汇编语言混合编程方法(6)
2、子程序部分格式 1)子程序开始 RSEG ?PR?[_|_?]函数名(子程序名)? 模块名 2)子程序内容 [_|_?]函数名(子程序名): :[(读取传递过来的参数,如通过寄存器)] : (子程序源程序) :[(准备返回的参数,如通过寄存器)] RET 例: RSEG ?PR?Timer0_ISR?SHIYAN Timer0_ISR: MOV TH0,time0H MOV TL0,time0L CPL P2.7 RETI

21 第三节 Keil C51与汇编语言混合编程方法(7)
主要有两部分组成。 1、声明外部函数(在文件开始的声明部分) EXTRN CODE([_|_?]函数名) 2、调用方法(在子程序中) : [(准备传递给被调函数的参数,如通过寄存器)] LCALL [_|_?]C语言函数名 : [(处理返回的参数)]

22 第四节 Keil C51使用简介 主要内容 1、界面简介 2、建立项目和文件 3、编译与连接 4、调试方法

23

24


Download ppt "周国运 Keil C51应用 2005.4 Email:zhouguoyun@sina.com 主 页:http://freeweb.nyist.net/~zhougy/"

Similar presentations


Ads by Google