标题: 51单片机C语言调用汇编子程序的简便方法 [打印本页]

作者: 新洲罗远    时间: 2020-4-23 06:59
标题: 51单片机C语言调用汇编子程序的简便方法
1、在汇编文件中,程序前边加上如下三句话就可以:
PUBLIC   _delay, _binrlc       ;定义公用子程序名,这里定义了两个子程序(有下划线)
LUOYUAN  SEGMENT CODE  ;程序段命名,LUOYUAN,叫啥名都可以
RSEG     LUOYUAN

下边放子程序(程序名要下划线,其它标号不要下划线)

;汇编语言文件
PUBLIC  _delay, _binrlc;定义子程序名
LUOYUAN  SEGMENT CODE  ;命名LUOYUAN的程序段
RSEG     LUOYUAN

_delay:  MOV P1,#55H
             MOV R2,#30H
        DJNZ R2,$
        RET
;**********************************************;P3.2  74LS595锁存口
;P3.3  74LS595时钟口;P3.4  74LS595数据口
;P3.5  工作指示
;**********************************************
_binrlc: CLR P3.2                ;锁存
         MOV A,R7
         ;XRL A,#0FFH    ;显示要取反
         MOV R3,#8H        
binrl1: CLR  P3.3       ;时钟位下降
        RLC A           ;连同进位左移1位
            MOV P3.4,C      ;进位到直接寻址位
        SETB P3.3       ;时钟位上升
        DJNZ R3,binrl1

        SETB P3.2       ;锁存
                CPL P3.5   ;取反闪亮
        RET
END


2、在C程序中,先声明外部函数,不然编译找不到函数错误,然后就如同C程序中调用C函数一样

     binrlc(SBUF);   不要下划线。
本程序89C51接收PC 串口来的数据,送到74LS595驱动的LED显示。

//89C51串口0方式驱动74LS595
// 11.0532
// P3_4控制锁存
#include "AT89X51.h"

void initUart(void)
{
TMOD|=0x20;
SCON=0x50;
PCON|=0x80;
TH1=0xfa;
TL1=0xfa;
TR1=1;
ES=1;
}
extern void binrlc(char);      //外部函数声明

void uart(void) interrupt 4
{
if(RI)
{
    RI=0;
     binrlc(SBUF);    //调用汇编子程序,方式同C子程序一样
         P1= SBUF;
}
else
    TI=0;
}
void main(void)
{
initUart();
EA=1;
while(1);
}

以上Keil代码工程下载::
Keil工程文件.7z (13.52 KB, 下载次数: 34)


作者: mkkop    时间: 2020-10-28 17:27
从C语言调用汇编语言中看到,从C语言传递数据到汇编语言里面的R7,可是没有看到任何声明R7的语句,请问我们怎么知道C语言的数据是传给R7的?为什么不是R0或R5之类的寄存器???
作者: 188610329    时间: 2021-8-29 01:32
mkkop 发表于 2020-10-28 17:27
从C语言调用汇编语言中看到,从C语言传递数据到汇编语言里面的R7,可是没有看到任何声明R7的语句,请问我们怎 ...

规定,C语言传参,Char的话, 第一变量 R7, 第二变量 R5, 第三变量 R3  short 的话,第一变量 R6,R7 第二变量R4,R5,第三变量 R2R3, long 的话 R4R5R6R7, 指针的话 R1R2R3 bit的话 C  返回值同理,
作者: csmyldl    时间: 2021-8-29 22:40
编译出现A33的错误,下载的压缩包没有595汇编.asm,照上面的说明打了,编译不能通过,无法验证
作者: heicad    时间: 2021-11-26 01:25
csmyldl 发表于 2021-8-29 22:40
编译出现A33的错误,下载的压缩包没有595汇编.asm,照上面的说明打了,编译不能通过,无法验证

楼主现在已经修复了
作者: madell    时间: 2021-11-26 10:50
heicad 发表于 2021-11-26 01:25
楼主现在已经修复了

您好怎么修复的?同样的问题




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1