Putchar in Keil C, take 8051 as an instance, putcharkeil
In Keil C, it is necessary to implement char putchar (char c), or the powerful function printf wocould not work.
We shoshould notice in here: new line command for serial output be "\ r \ n" (line feed: LF, 0x0a + carriage return: CR, 0x0d ), not only "\ n" in Keil C.
I do not want to write too much tedious word in here, below is my putchar code for 8051, use timer 1 as interrupt:
#define FCLK 22118400UL #define BAUDRATE 9600UL /* ref http://csserver.evansville.edu/~blandfor/EE354/SFRegisters.pdf */void InitUART(void){ EA = 0; TMOD &= 0x0F; /*timer 1 clean*/ TMOD |= 0x20; /*mode 2: 0~255, auto-reload */ REN = 0; /*forbid 8051 receive data*/ SM1 = 1; /* Serial Control Register be set by timer*/ /* BaudRate = OscillatorFreq/(N*256-TH1) if SMOD = 0, N = 384 if SMOD = 1, N = 192 SMOD is PCON.7 , Serial mode bit */ TH1 = 256 - FCLK/(BAUDRATE*12*16); TL1 = 256 - FCLK/(BAUDRATE*12*16); PCON |= 0x80; ES = 1; /*Enable Serial port interrupt */ REN = 1; /*allow 8051 receive data */ EA = 1; /*Enable interrupt*/ TI = 1; /* the transmitting has been done */ RI = 0; /* the receiving is not done yet */ TR1 = 1; /*Timer 1 is turned on*/}/*InitUART*/void UartInterrupt(void) interrupt 4{#if(0) if(RI) { } else { }#endif}/*UartInterrupt*/char putchar(char c) { /* \n -> \r\n \r -> carriage return, 13 */ if ('\n' == c) { SBUF = 0x0d; while(0 == TI); TI = 0; } SBUF = c; while(0 == TI); TI = 0; return c;}/*putchar*/
If you want to use the code, you shocould modify the FCLK macro constant for your micro chip, I use maid, crystal be 22.1184 MHz.
The baud rate, for most use, be 9600, you cocould modify the parameter in your serial communication software. (I suggest sscom)