0

我正在尝试使用以下代码从 p89v664 在串行终端上打印消息,

#include<P89V66x.H>
#include<stdio.h>
char putchar(char c) {

if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}   
TI = 0;
S0BUF = c;    
while (!TI);
return c;

}

int printf(char*str) {

unsigned int cnt = 0;
while(*str != '\0')
{
    putchar(*str);
    cnt++;
    str++;
}
}

void delay(unsigned int i) {
int d = 100;
for(;i!=0;i--) {
    for(;d!=0;d--);
    d = 100;
}
}

int main(void) {
/**Serial init*/
S0CON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 0xF6;                   /* TH1:  reload value for 9600 baud         */
TR1   = 1;                    /* TR1:  timer 1 run                        */
TI = 1;
while(1) {
    printf("Hello\n");
    delay(300);
    printf("Hello World\n");
    delay(10000);
}
}

上面的程序工作正常,直到该程序中的 printf 函数定义没有被注释。如果上面程序中的 printf 函数被注释为使用标准库中的 printf ,那么垃圾字符将打印在串行控制台上。(我用腻子)。我使用了 Keil uVision V4.14.4.0 编译器。

有什么遗漏吗?我不明白这个程序有什么问题。

4

1 回答 1

1

经过一些实验,我发现问题出在 keil uVision4 评估版上。我使用 sdcc 编译了这段代码并运行它并且它工作。可能是keil评估版的限制造成了问题。非常感谢 Mellowcandle 的所有回复。

编辑:

#include <P89V66x.H>
#include<stdio.h>

void putchar(char c) {

TI = 0;
S0BUF = c;  
if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}
while (!TI);
}
int main(void) {

/**Serial init*/
unsigned short int c = 65334;
S0CON  = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                 /* TMOD: timer 1, mode 2, 8-bit reload      */
/**For 11.0592 crystal
value should TH = -3 or
TH1 = FD*/
TH1   = 0xF6;                 /* TH1:  reload value for 9600 baud  for 
                              18 Mhz cyrstal */
TR1   = 1;                    /* TR1:  timer 1 run                        */

while(1) {
    printf("Hello %u\n", c);
    delay(300);
    printf("Hello World %u\n" ,c);
    delay(10000);
}
}

用于编译此代码的命令是,

sdcc {文件名}

于 2013-05-29T03:30:10.043 回答