- UID
- 852722
|
C51编译器能对C语言源程序进行高效率的编译,生成高效简洁的代码,在绝大多数场合采用C语言编程即可完成预期的目的。但有时为了编程直观或某些特殊地址的处理,还须采用一定的汇编语言编程。而在另一些场合,出于某种目的,汇编语言也可调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。下面就以力源公司的10位串行A/D转换器TLC1549 为例说明C语言程序与汇编语言程序的调用。
图1 TLC1549管脚图
1549的管脚图和时序图分别如图1和图2所示,假定DATA OUT接P1.0,CS 接P1.1,CLOCK接P1.2。
1549的具体特性请查阅有关资料。
图2 TLC1549时序图
例2 C语言程序与汇编语言程序的调用,其子程序如下:
|
PUBLIC AD ;入口地址
|
|
SEG_AD SEGMENT CODE ;程序段
|
|
RSEG SEG_AD
|
|
USING 0
|
AD:
|
MOV R6,#00
|
|
MOV R7,#00
|
|
SETB P1.1
|
|
ACALL DELAY
|
|
CLR P1.1
|
|
ACALL DELAY
|
|
MOV R0,#10
|
RR0:
|
SETB P1.2
|
|
NOP
|
|
CLR P1.2
|
|
DJNZ R0,RR0
|
|
ACALL DELAY
|
|
MOV 30H,R6 ;A/D转换的高
|
|
;两位保存在R6中
|
|
ACALL CIR
|
|
MOV R6,30H
|
|
SETB P1.2
|
|
NOP
|
|
CLR P1.2
|
|
MOV 30H,R6
|
|
ACALL CIR
|
|
MOV R6,30H
|
|
MOV R0,#8 ;A/D转换的低
|
|
;8位保存在R7中
|
RR2:
|
SETB P1.2
|
|
NOP
|
|
CLR P1.2
|
|
MOV 30H,R7
|
|
ACALL CIR
|
|
MOV R7,30H
|
|
DJNZ R0,RR2
|
|
RET
|
CIR:
|
CLR C
|
|
MOV C,P1.0
|
|
MOV A,30H
|
|
RLC A
|
|
MOV 30H,A
|
|
RET
|
|
END
|
在以上程序中,函数的返回值为一无符号整型数,根据调用规则,返回值的高位必须在R6中,低位在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。 |
|