When program running to "printf()",the PC always stop at
C:0X0A2A 3099FD JNB TI(0X98.1),C:0A2A
ES = 0; //UART INT is Enable before TI = 1; printf("%bd",3); ES = 1;
PUTCHAR.C: /***********************************************************************/ #include <reg51.h> #define XON 0x11 #define XOFF 0x13 /* * putchar (full version): expands '\n' into CR LF and handles * XON/XOFF (Ctrl+S/Ctrl+Q) protocol */ char putchar (char c) { if (c == '\n') { if (RI) { if (SBUF == XOFF) { do { RI = 0; while (!RI); } while (SBUF != XON); RI = 0; } } while (!TI); TI = 0; SBUF = 0x0d; /* output CR */ } if (RI) { if (SBUF == XOFF) { do { RI = 0; while (!RI); } while (SBUF != XON); RI = 0; } } while (!TI); TI = 0; return (SBUF = c); } #if 0 // comment out versions below /* * putchar (basic version): expands '\n' into CR LF */ char putchar (char c) { if (c == '\n') { while (!TI); TI = 0; SBUF = 0x0d; /* output CR */ } while (!TI); TI = 0; return (SBUF = c); } /* * putchar (mini version): outputs charcter only */ char putchar (char c) { while (!TI); TI = 0; return (SBUF = c); } #endif
There are knowledgeable people here who emphasize reading the manuals because no number of short answers from someone else can substitute for your own learning. TI must be polled because it takes the transmit module time to transmit the byte after it is loaded into the Tx buffer, at 9600baud it's around 1 ms, this is a LONG time for the cpu. It can do alot and come back around with the next byte to send before the Tx module is done sending the first byte. So the cpu polls the TI bit and waits until the transmission is complete because the TI bit is set at that time. After power up you don't need to set the TI bit, just load the Tx buffer with the first byte after transmission and interrupts are enabled. The module will set TI after the byte is sent and your isr will be called. Most of my applications set TI in "main loop" code to request transmission because there is some sort of packet structure and it's just neater to keep all of the state machine/error handling in the isr.
There are knowledgeable people here who emphasize reading the manuals because no number of short answers from someone else can substitute for your own learning. Stating the same in another way: If you study for a week, you can get going in a week. If you do not study and ask here for every step you will get going in a year. Erik