找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5250|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机C语言调用汇编子程序的简便方法

  [复制链接]
跳转到指定楼层
楼主
ID:716413 发表于 2020-4-23 06:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:65297 发表于 2020-10-28 17:27 | 只看该作者
从C语言调用汇编语言中看到,从C语言传递数据到汇编语言里面的R7,可是没有看到任何声明R7的语句,请问我们怎么知道C语言的数据是传给R7的?为什么不是R0或R5之类的寄存器???
回复

使用道具 举报

板凳
ID:624769 发表于 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  返回值同理,
回复

使用道具 举报

地板
ID:235200 发表于 2021-8-29 22:40 | 只看该作者
编译出现A33的错误,下载的压缩包没有595汇编.asm,照上面的说明打了,编译不能通过,无法验证
回复

使用道具 举报

5#
ID:262 发表于 2021-11-26 01:25 | 只看该作者
csmyldl 发表于 2021-8-29 22:40
编译出现A33的错误,下载的压缩包没有595汇编.asm,照上面的说明打了,编译不能通过,无法验证

楼主现在已经修复了
回复

使用道具 举报

6#
ID:99987 发表于 2021-11-26 10:50 | 只看该作者
heicad 发表于 2021-11-26 01:25
楼主现在已经修复了

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表