?? 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 + -