I have made the new function putchar for redirect the output to LCD already. But by default, I also want to use this as output to serial port on the same program. I do not understand how to use both output function in parallel or other way to switch between each other. Please tell me if possible. With my thanks.
"So I can not switch between output function (e.g. lcd_putchar and putchar) which I can do in PIC-C(C compiler for PIC Microcontroller) very flexible as: - printf("......",.....);//default serial port - printf(lcd_putc,"......",.....);//redirect to LCD"
char (* putchar_fp)(char c); char lcd_putchar(char c) { /* Your LCD output handler goes here */ } char ser_putchar(char c) { /* Body of Keil's putchar goes here */ } char putchar(char c) { /* Body of Keil's putchar moved to ser_putchar() * and replaced with... */ return putchar_fp(c); } int my_printf(char (* which_putchar_fp)(char), const char *format, ...) { int ret_val; va_list ap; putchar_fp = which_putchar_fp; va_start(ap, format); rtn = vprintf(format, ap); va_end(ap); return ret_val; } int main(void) { my_printf(lcd_putchar, "Hello world on %s\n", "LCD"); my_printf(ser_putchar, "Hello world on %s\n", "SER"); }
And for good measure, you'd probably want to 'reset' putchar_fp back to putchar so that any subsequent calls to normal printf() used ser_putchar() as originally indended. So make that...
int my_printf(char (* which_putchar_fp)(char), const char *format, ...) { int ret_val; va_list ap; putchar_fp = which_putchar_fp; va_start(ap, format); ret_val = vprintf(format, ap); va_end(ap); putchar_fp = ser_putchar; return ret_val; }
One more comment, should you choose to use function pointers, would be to have you take a look at Keil's function pointer appnote. http://www.keil.com/appnotes/docs/apnt_129.asp
Dear Dan Henry, Andy Neil Thank you very much for your guide and C51 module. After receiving your replies, I tested on two way successfully. The first one I simply use a global variable to switch functions and on the other one I write codes like your guide which used function pointer. Again thank you so much, see you next post.