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

📄 c_asm00.c

📁 伟福 WAVE6000 环境下MCS51 C51调用汇编例程
💻 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 + -