📄 c_asm00.c
字号:
/* 你可以在 http://www.wave-cn.com 网站下载到更 */
/* 多单片机编程方面的示例。你可以转载本例,但请保证 */
/* 本例的完整,请保留本公司版权信息。 */
/* 南京伟福实业有限公司 版权所有 */
/* 本例主要介绍如何用C51模块调用ASM模块,以及在 */
/* 调用过程中常见的数据定义、数据传递、数据处理方法。*/
/* 模块定位: 在LINK命令行最后加上 */
/* code(PROC(100h),?PR?MAIN?C_ASM(200H),300H) */
/* 其中:PROC为汇编程序模块的段名,定位在100H */
/* ?PR?MAIN?C_ASM为C语言的MAIN函数,定位200H */
/* 其它函数定位在300H。 */
/* C语言程序模块:*/
#include <reg52.h>
/* 此函数在汇编模块中定义 */
alien unsigned int readword(unsigned int tt);
alien unsigned char readbyte(unsigned char tt);
unsigned char g_char;
unsigned char counter;
unsigned int g_int;
xdata unsigned char gx_char;
/* 外部数据的定位,有的C51编译器不支持 _at_ 方式 */
/* 请用 XBYTE[] 方式定位外部数据 */
xdata unsigned int gx_int _at_ 0x4321;
/* 程序代码中包含的数据,在汇编模块定义,在C语言模块调用 */
extern code unsigned char mydata[];
#define Tick 10000 /* 10000 x 100us = 1s */
#define T100us (256-50) /* 100us时间常数(6M) */
unsigned char Hour, Minute, Second;
unsigned int C100us; /* 100us记数单元 */
/* 定时中断处理函数,此函数被ASM模块调用 */
/* 当然可以在C语言模块中定义中断。这只是 */
/* 个用汇编调用C的例子 */
void t0int()
{
C100us--;
if (C100us == 0) {
C100us = Tick; /* 100us 记数器为0, 重置记数器 */
Second++;
if (Second == 60) {
Second = 0;
Minute++;
if (Minute == 60) {
Minute = 0;
Hour++;
if (Hour == 24) Hour = 0;
}
}
}
}
void main()
{
unsigned char i,m,n;
unsigned int j;
n = mydata[0];
m = mydata[1];
TMOD = 0x02; /* 方式2, 定时器 */
TH0 = T100us;
TL0 = T100us;
IE = 0x82; /* EA=1, IT0 = 1 */
Hour = 0;
Minute = 0;
Second = 0;
C100us = Tick;
TR0 = 1; /* 启动定时器0 */
g_char = 0x23;
g_int = 0x1234;
gx_char = 0x56;
gx_int = 0x2345;
while(1){
i = readbyte(0x11);
g_char += i;
j = readword(0x1234);
j += gx_int;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -