📄 keil.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 + -