首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C51程序设计技巧-2

C51程序设计技巧-2

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()即可。 

返回列表