2015年2月4日 星期三

MCU 8051 39R08A5 printf to uart / SM39R08A5 printf out to uart

單晶片MCU 8051 8052 8 bit keil
Function Description :SyncMos SM39R08A5 printf out to UART
                                    SyncMos OB39R08A5 printf out to UART

#step1.#include "stdio.h" // for printf
           init_UART0(); //Initial uart
           TI=1;                //
#step2.void UART0_ISR()  do not clear TI,
#step3.uint8_t i8Cnt;
   unsigned int i16Cnt;
   putchar(0x20);
           printf("bd=%bd \r\n", i8Cnt); //%bd for 8 bits variable
           printf(" d=%d  \r\n", i16Cnt); //%d for 16 bits variale
           printf(" %x",i16Cnt);

//===============================================================
below is sample code:
//===============================================================
#include "SM39R16A3.h"
#include "UART0.h"
#include "stdio.h" // for printf

#define d_S0RELH 0x03
#define d_S0RELL 0xFA
bit bU0TX = 0;

void init_UART0(void)
{
S0RELH = d_S0RELH;
S0RELL = d_S0RELL;
AUX |= 0x80; // BRS = 1
PCON |= 0x80; // SMOD =1
IEN0 |= 0x90; // EA=1, ES0=1, interrupt enable
// S0CON = 0x50; // mode 1, SM20=0, Revice enable
S0CON = 0x40; // mode 1, SM20=0, Revice disable
TI=1; //linjj++ for printf
}

void UART0_ISR(void) interrupt d_UART0_Vector
{
unsigned char RXBUF0;

if(RI) // INT_RX
{
RI = 0; // RI clear
RXBUF0 = S0BUF; // Read BUF, user code...
}
else // INT_TX
{
bU0TX =0;
//linjj++ for printf, do not clear TI,   TI =0; // TI clear
}
}

void UART0_TX(unsigned char n_temp0)
{
bU0TX = 1;
S0BUF = n_temp0;
while(bU0TX)
{
;
}
}

//=========================================================================

void main(void)
{
uint8_t i8Cnt;
unsigned int i16Cnt;
unsigned long i32Cnt;

init_UART0();
i8Cnt = 0;

putchar(0x20);
putchar(0x31);
// putchar('q');
// printf("Aa ");
// printf("Bb ");
printf("Cc\r\n");
printf("ver.01 SM39R08A5, printf out to UART0_TX ,baud rate:115200bps \r\n");
for (i8Cnt=1; i8Cnt<10; i8Cnt++)
printf("bd=%bd \r\n", i8Cnt); //%bd for 8 bits variable

for (i16Cnt=1; i16Cnt<10; i16Cnt++)
printf(" d=%d  \r\n", i16Cnt); //%d for 16 bits variale

printf("\r\n");
for (i16Cnt=0xff01; i16Cnt<0xff08; i16Cnt++)
printf(" %x",i16Cnt);

printf("\r\n");
for (i32Cnt=0x2ff11; i32Cnt<0x2ff18; i32Cnt++)
printf(" %x",(unsigned int)(i32Cnt));//printf do not support 32bit variable

while(1);
}

1 則留言:

  1. **printf DO support 32bit variable**

    printf(" %x",(unsigned int)(i32Cnt));//printf do not support 32bit variable
    將此行換成以下便可正確輸出" 2ff11 2ff12 2ff13 2ff14 2ff15 2ff16 2ff17":

    printf(" %lx",i32Cnt);

    回覆刪除