⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keil.c

📁 keilc混合编程经典例子
💻 C
字号:
混合编程例子程序

    一、C语言程序部分

//C语言与汇编语言混合编程演示程序。2004.11.20。

#pragma small
//#pragma src 
#include "at89x52.h" 
#include "stdio.h"

int dida,sec,minu,hour;
char aa _at_ 0x39,bb _at_ 0x3a; //0x39,0x3a在shiyan.asm中被改变

void yinyue(void);
int hunhe(char,char);

void init_time()
{
    TMOD=0X11;
    TL0=0XB0;
    TH0=0X3C;
    IE=0X8A;
    TCON=0X50;
/*
#pragma asm
    MOV TMOD,#11H
    MOV TL0,#0B0H
    MOV TH0,#3CH
    MOV IE,#8AH
    SETB TR0
    SETB TR1
#pragma endasm
*/
}

int count1(int a,int b) reentrant
{
    return a+b;
}

int count2(int a)
{
    return a+16;
}

int count3(int a,int b)
{
    return a+b;
}

void time0()interrupt 1
{
    TL0=0XB0;
    TH0=0X3C;
    dida--;
    if(dida==0)
    {
        dida=10;

        sec++; 
        if(sec==60)
        {
            sec=0;
            minu++;
            if(minu==60)
            {
                minu=0;
                hour++;
                if(hour==12) hour=0;
            }
        }
    }
} 

void time1()interrupt 3
{
    TL1=bb;
    TH1=aa;
    P2_7=~P2_7;
}

main(void)
{
    char sec1;
    int aa;

    dida=10;
    sec=0;
    minu=0;
    hour=0;
    sec1=0;

    init_time();
    SCON=0x50; //为观察屏幕显示而设置
    TI=1;

    aa=count1(16,260);

    aa=count2(12);

    aa=hunhe(1,4); //函数在汇编语言文件“shiyan.asm”中

//     yinyue();

    printf("hour : %2d; minu : %2d; second : %2d\n",hour,minu,sec);

    while(1)
    {
        if(sec1!=sec)
        {
            printf("hour : %2d; minu : %2d; second : %2d\r",hour,minu,sec);
            sec1=sec;
        }
    }

}

    二、汇编语言程序部分

;C语言与汇编语言混合编程演示程序。2004.11.20。

NAME SHIYAN
?PR?_hunhe?SHIYAN SEGMENT CODE
?PR?yinyue?SHIYAN SEGMENT CODE

EXTRN CODE(_count2)
EXTRN CODE(_count3)


PUBLIC _hunhe 
PUBLIC yinyue 
;********************************************************
    RSEG ?PR?_hunhe?SHIYAN

_hunhe:                 ;传递过来的为两个字符型参数,第一个在R7中,第二个在R5中
                        ;返回的为整型数据,在R6R7中,R6中为高字节
    NOP
    MOV A,R7
    MOV R6,A
    MOV A,R5
    MOV R7,A
    LCALL _count2         ;传递过去的为一个整型参数,在R6R7中,R6中为高字节;返回的为整型数据
    MOV 60H,R6
    MOV 61H,R7
    NOP

    MOV R6,#1
    MOV R7,#4
    MOV R4,#1
    MOV R5,#24
    LCALL _count3         ;传递过去的为两个整型参数,在R6R7和R4R5中,R6、R4中为高字节;返回的为整型数据
    MOV 62H,R6
    MOV 63H,R7
    NOP

    MOV A,61H
    ADD A,R7
    MOV 65H,A
    MOV R7,A
    MOV A,60H
    ADDC A,R6
    MOV 64H,A
    MOV R6,A
    RET                     ;返回的为整型数据,在R6R7中,R6中为高字节

;********************************************************
    RSEG ?PR?yinyue?SHIYAN


DIAOL EQU 30H
DIAOH EQU 31H         ;存放音调的首地址
PUL EQU 32H
PUH EQU 33H             ;存放乐谱的首地址
PUSHU EQU 34H         ;存放乐谱的音节数目
BIAN EQU 35H         ;存放演奏的遍数
SHUNXU EQU 36H         ;存放演奏取数据的顺序
PAIL EQU 37H         ;存放演奏速度
PAIH EQU 38H         ;存放延时时间数
                    ;39H,3AH:存放演奏时间常数,即T1的初值

yinyue:
                    ;音乐演奏子程序
    MOV DPTR,#BEDIAO
    MOV DIAOL,DPL
    MOV DIAOH,DPH
    MOV DPTR,#PU1
    MOV PUL,DPL
    MOV PUH,DPH
    MOV PAIL,#180
    MOV BIAN,#3
    MOV PUSHU,#130
YANYUELP:
    MOV SHUNXU,#0FFH
YANYUELP1:
    INC SHUNXU
    MOV A,SHUNXU
    MOV DPL,PUL
    MOV DPH,PUH
    MOVC A,@A+DPTR
    MOV R3,A

    SWAP A
    ANL A,#0FH
    JZ YANNT1
    RL A
    MOV R4,A
    MOV DPL,DIAOL
    MOV DPH,DIAOH
    MOVC A,@A+DPTR
    MOV TH1,A 
    MOV 39H,A
    MOV A,R4
    INC A
    MOVC A,@A+DPTR
    MOV TL1,A 
    SETB TR1 
    MOV 3AH,A
YANNT1:
    MOV A,R3
    ANL A,#0FH
    MOV PAIH,A
    LCALL DELAY

    CLR TR1

    MOV A,SHUNXU
    CJNE A,PUSHU,YANYUELP1

    DJNZ BIAN,YANYUELP
    NOP
    RET

;延时子程序
DELAY:
    MOV R6,PAIL
    NOP
LP2: MOV R5,#249
LP3: NOP
    NOP
    DJNZ R5,LP3
    NOP
    DJNZ R6,LP2
    NOP
    DJNZ PAIH,DELAY
    NOP
    RET


;音乐:让我们荡起双浆
BEDIAO: DW 0,63568,63783,63974
        DW 64062,64222,64366,64431,64552,64659,64755
        DW 64799,64876,64948
        ;降E调l5~h1

PU1:    DB 02H,42H,52H,62H,84H,94H,02H,22H,42H,52H,64H,84H     ;过门29个
        DB 02H,12H,12H,44H,64H,52H,61H,51H,42H,32H,24H,22H,22H,22H,02H,02H,22H
        DB 02H,22H,42H,52H,66H,82H,62H,42H,54H,28H             ;唱段70个
        DB 02H,42H,52H,62H,86H,82H,81H,94H,54H,6CH
        DB 62H,82H,98H,86H,92H,0B2H,0A1H,91H,82H,92H,64H
        DB 42H,52H,66H,82H,44H,24H,42H,52H,62H,92H,8CH,04H
        DB 68H,96H,92H,82H,72H,64H,58H,66H,82H,22H,42H,54H
        DB 04H,42H,52H,64H,83H,81H,84H,0B4H,0A2H,92H,82H,62H,98H,98H,88H
        DB 62H,0A1H,91H,81H,71H,61H,51H,62H,81H,71H,61H,51H,41H,31H     ;过门32个
        DB 42H,61H,51H,41H,31H,21H,11H,22H,61H,61H,62H,62H
        DB 92H,0D1H,0D1H,0D2H,0D2H,92H

    END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -