C51 FATAL-ERROR - ACTION: PARSING SOURCE-FILE ERROR: PREPROCESSOR: MACROS TOO NESTED C51 TERMINATED.
PLEASE TELL ME HOW TO SOLVE THIS ERROR.
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".
It is a Keil proprietary keyword: http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm
Note that all the product manuals are available online: http://www.keil.com/support/man_c51.htm
instead of banging back and forth, why do you not post your code in a readable (see instructions) form
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':
Why? It's in the books.
So don't do that, then!
there are directions above the reply message field, they are there for a reason
For the same code I am getting the error as C51 fatal error Error: preprocessor macros too nested C51 terminated
the top is unreadable due to missing line breaks, the bottom is unreadable due to no indentions.
<AnsaForCompleteAndUtterDumbo> YOU DIDN'T EVEN SAY WHAT ERROR YOU'RE GETTING! </AnsaForCompleteAndUtterDumbo>
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
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; } } }
<AnsaForDumbo>SIMPLIFY THE MACRO!</AnsaForDumbo>
Or more likely: get rid of the infinite recursion, i.e. a macro expanding to itself.
View all questions in Keil forum