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 に答える