|
这个程序是我测试的一个程序:
在主程序开始时声明BYTE str[]={"hello world"};
while (1)
{ /* Loop forever */
if ( UART0Count != 0 )
{
U0IER = IER_THRE | IER_RLS; /* Disable RBR */
UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
UART0Count = 0;
U0IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */
LCD_gotoxy(1,1);
//LCD_puts(( BYTE* )UART0Buffer);
//LCD_putc(UART0Buffer[0]);
LCD_puts(str);
LCD_gotoxy(3,2);
LCD_putc('c');
}
这段程序测试结果,能正常显示,不过有一个可笑的操作,不知道是我的仿真器的事还是我内部设置的问题,我必须全部擦除芯片后,然后在向芯片写程序,正常显示,如果不这样,程序就会和上次写一样,我检查了下我的设置,是在编程时全部擦除的,这是个问题!
这是第二个测试程序:
while (1)
{ /* Loop forever */
if ( UART0Count != 0 )
{
U0IER = IER_THRE | IER_RLS; /* Disable RBR */
UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
UART0Count = 0;
U0IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */
LCD_gotoxy(1,1);
LCD_puts(( BYTE* )UART0Buffer);
//LCD_putc(UART0Buffer[0]);
//LCD_puts(str);
LCD_gotoxy(3,2);
LCD_putc('c');
}
测试结果:显示器显示最后一个字符'0'在第一行,第一个位置,'c'这个字符正常显示在预订的位置。
第三个测试程序:
while (1)
{ /* Loop forever */
if ( UART0Count != 0 )
{
U0IER = IER_THRE | IER_RLS; /* Disable RBR */
UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
UART0Count = 0;
U0IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */
LCD_gotoxy(1,1);
//LCD_puts(( BYTE* )UART0Buffer);
LCD_putc(UART0Buffer[0]);
//LCD_puts(str);
LCD_gotoxy(3,2);
LCD_putc('c');
}
测试结果和第二个程序一样,所以我怀疑UART0Buffer在UART0Send()程序执行完指向了最后一个字符,所以我将UART0Send()做了如下更改:
void UARTSend( DWORD portNum, BYTE *BufferPtr, DWORD Length )
{
int i=0;
if ( portNum == 0 )
{
while ( Length != 0 )
{
/* THRE status, contain valid data */
while ( !(UART0TxEmpty & 0x01) );
//U0THR = *BufferPtr;
U0THR = BufferPtr;
UART0TxEmpty = 0; /* not empty in the THR until it shifts out */
//BufferPtr++;
Length--;
}
}
}
程序还是显示最后一个字符'0',另外一个字符'c'显示正常
谁能给出个更改意见
|
|