This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

MACROS TOO NESTED

C51 FATAL-ERROR - ACTION: PARSING SOURCE-FILE ERROR: PREPROCESSOR: MACROS TOO NESTED
C51 TERMINATED.

PLEASE TELL ME HOW TO SOLVE THIS ERROR.

Parents Reply Children
  • <AnsaForDumbo>SIMPLIFY THE MACRO!</AnsaForDumbo>

    Or more likely: get rid of the infinite recursion, i.e. a macro expanding to itself.

  • Thanks for the Reply.Just one more help please .Just look at this code and please try to solve my error .I will be very thankful to you.Since many days i m trying to resolve this but i couldn't.

    PROGRAMS:

    LCD
    #include <REGX52.H>
    #define data P1
    #define rs P3_5
    #define rw P3_4
    #define en P3_3
    unsigned char msg[88];
    void delay(unsigned int);
    void LCD_busy();
    void LCD_command(unsigned char var);
    void LCD_data(unsigned char var);
    void LCD_string(unsigned char *var);
    void LCD_init(void);
    void LCD_READY(void);
    void LCD_init(void) { LCD_command (0x38); LCD_command (0x0C); LCD_command (0x01); LCD_command (0x06); }

    void LCD_command(unsigned char var) { LCD_READY(); data = var; //Function set: 2 Line, 8-bit, 5x8 dots rs = 0; //Selected command register rw = 0; //We are writing in instruction register en = 1; //Enable H->L en = 0; }
    void LCD_string(unsigned char *var) { while(*var) //till string ends LCD_data(*var++); //send characters one by one }
    void LCD_data(unsigned char var) { LCD_READY(); data = var; //Function set: 2 Line, 8-bit, 5x7 dots rs = 1; //Selected data register rw = 0; //We are writing en = 1; //Enable H->L en = 0; }
    void LCD_READY(void) { P1_7=1; rs=0; rw=1; do { en=0; en=1; delay(1); }while(P1_7); }
    void delay(unsigned int m) { unsigned int i,j; for(i=0;i<m;i++) for(j=0;j<10;j++); }

    KEYPAD

    #include <regx52.H>
    #include "lcd.c"
    char key_scan();
    unsigned char key[4][3]={'1','2','3', '4','5','6', '7','8','9', '*','0','#'};

    char key_scan()
    { unsigned char col, row;
    P2=0xF0;
    while(1) { do { col=P2&0x70; }while(col!=0x70); do { do { delay(20); col=P2&0x70; }while(col==0x70); delay(20); col=P2&0x70; }while(col==0x70);
    while(1)
    { P2=0x7E; col=P2&0x70; if(col!=0x70) { row=0; break; }

    P2=0x7D; col=P2&0x70; if(col!=0x70) { row=1; break; } P2=0x7B; col=P2&0x70; if(col!=0x70) { row=2; break; } P2=0x77; col=P2&0x70; row=3; break;
    } if(col==0x60) return(key[row][0]);
    else if(col==0x50) return(key[row][1]);
    else if(col==0x30) return(key[row][2]); }
    }

    RTC

    #include <regx52.H>
    #include <absacc.h>
    #include "lcd.c"
    #include "rtc1.c"
    #include "keypad.c"

    void rtc_init()
    { XBYTE[10]=0x20;
    delay(100);
    }

    void time_set()
    { unsigned char temp[3];
    XBYTE[11]=0x83;
    LCD_command(0x01);
    LCD_string("Enter the Time : ");
    LCD_command(0xC0);
    LCD_string("HH:mm:ss");
    LCD_command(0xC0);
    //Enter hour
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    LCD_string(":");
    XBYTE[4]=int_value(temp);
    //Enter min
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    LCD_string(":");
    XBYTE[2]=int_value(temp);
    //Enter sec
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    XBYTE[0]=int_value(temp);
    delay(500);
    XBYTE[11]=0x03;
    }

    void alarm_set()
    { unsigned char temp[3];
    XBYTE[11]=0x83;
    LCD_command(0x01);
    LCD_string("Enter the Time : ");
    LCD_command(0xC0);
    LCD_string("HH:mm:ss");
    LCD_command(0xC0);
    //Enter hour
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    LCD_string(":");
    XBYTE[5]=int_value(temp);
    //Enter min
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    LCD_string(":");
    XBYTE[3]=int_value(temp);
    //Enter sec
    temp[0]=key_scan();
    LCD_data(temp[0]);
    temp[1]=key_scan();
    LCD_data(temp[1]);
    XBYTE[1]=int_value(temp);
    delay(800); LCD_command(0x01);
    LCD_string("Enter OFF Time:");
    LCD_command(0xC0);
    temp[0]=key_scan();
    LCD_data(temp[0]);
    if(temp[0]=='#')
    {XBYTE[11]=0x03;return;}
    temp[1]=key_scan();
    LCD_data(temp[1]);
    XBYTE[14]=int_value(temp);
    XBYTE[11]=0x03;
    }

    void bcdconv(unsigned var)
    { unsigned char x,y;
    x=var&0x0F;
    y=y>>4;
    y=y|0x30;
    LCD_data(y);
    LCD_data(x);
    }

    int int_value(unsigned char var[])
    { int val;
    val=(var[0]<<4)|(var[1]&0x0F);
    return(val);
    }

    MAIN PROGRAM

    #include <regx52.H>
    #include <absacc.h>
    #include "lcd.c"
    #include "rtc1.c"
    #include "keypad.c"
    int time;
    void update();
    void relay();
    void time_display();
    void alarm_display();

    int main()
    { int irq;
    irq=XBYTE[12];
    P3_2=1;
    rtc_init();
    LCD_init();
    while(1)
    { LCD_command(0x01);
    time_display();
    if(XBYTE[12]&0x20)
    relay();
    if(P3_2==0)
    update();
    alarm_display();
    delay(7500);
    } }

    void update()
    { char n;
    LCD_command(0x01);
    LCD_string("1. Time Update");
    LCD_command(0xC0);
    LCD_string("2. ALARM UPDATE");
    n=key_scan();
    switch(n) { case '1' : time_set(); break; case '2' : alarm_set(); break; default : LCD_command(0x01); LCD_string("Try Again"); delay(100); LCD_command(0x01); }

    }

    void time_display()
    { unsigned char hr,min,sec;
    LCD_command(0x80);
    LCD_string("TIME : ");
    hr=XBYTE[4];
    min=XBYTE[2];
    sec=XBYTE[0];
    bcdconv(hr);
    LCD_string(":");
    bcdconv(min);
    LCD_string(":");
    bcdconv(sec);
    }

    void alarm_display()
    { LCD_command(0xC0);
    LCD_string("PW_OFF: ");
    bcdconv(XBYTE[5]);
    LCD_string(":");
    bcdconv(XBYTE[3]);
    LCD_string(":");
    bcdconv(XBYTE[1]);
    }

    void relay()
    { int al_hr,al_min,hh,mm,temp;
    temp=XBYTE[12];
    time=XBYTE[14];
    time=(((time>>4)*10)+(time&0x0F));
    P3_1=0;
    hh=XBYTE[5];
    mm=XBYTE[3];
    hh=(((hh>>4)*10)+(hh&0x0F));
    mm=(((mm>>4)*10)+(mm&0x0F));
    al_min=time+mm;
    al_hr=al_min/60;
    al_hr=al_hr+hh;
    al_min=al_min%60;
    al_hr=al_hr%24;
    al_min=(((al_min/10)<<4)|(al_min%10));
    al_hr=(((al_hr/10)<<4)|(al_hr%10));
    XBYTE[3]=al_min;
    XBYTE[5]=al_hr;
    LCD_command(0xC0);
    LCD_string("PWR_ON: ");
    bcdconv(al_hr);
    LCD_string(":");
    bcdconv(al_min);
    LCD_string(":");
    bcdconv(XBYTE[1]);
    mm=(((mm/10)<<4)|(mm%10));
    hh=(((hh/10)<<4)|(hh%10));
    while(1)
    { time_display();
    if(XBYTE[12]&0x20)
    { P3_1=1;
    XBYTE[3]=mm;
    XBYTE[5]=hh;
    break;
    } }
    }

  • <AnsaForCompleteAndUtterDumbo>
      YOU DIDN'T EVEN SAY WHAT ERROR YOU'RE GETTING!
    </AnsaForCompleteAndUtterDumbo>
    

  • the top is unreadable due to missing line breaks, the bottom is unreadable due to no indentions.

  • For the same code I am getting the error as C51 fatal error
    Error: preprocessor macros too nested
    C51 terminated

  • there are directions above the reply message field, they are there for a reason

  • You define 'data', don't do that.

    #define data P1
    

    Don't do that in 'keypad':

    #include <regx52.H>
    #include "lcd.c"
    

    Don't do that in 'rtc':

    #include <regx52.H>
    #include <absacc.h>
    #include "lcd.c"
    #include "rtc1.c"
    #include "keypad.c"
    

    Don't do that in 'main program':

    #include <regx52.H>
    #include <absacc.h>
    #include "lcd.c"
    #include "rtc1.c"
    #include "keypad.c"
    

    Why? It's in the books.

  • instead of banging back and forth, why do you not post your code in a readable (see instructions) form


  • Look at this picture: www.danlhenry.com/.../keil_code.png - follow the instructions.

    If that's not clear, try following the link, "Tips for Posting Messages".