【问题标题】:Why does MTK only display 'F'为什么MTK只显示'F'
【发布时间】:2012-05-22 15:04:31
【问题描述】:

我的程序会将 IR 信号作为“0”或“1”存储到 DS89C450 的 xdata 1kByte SRAM 中,然后在我的 MTK 上显示。

但是,无论我在红外遥控器上按什么按钮,显示的数据都只显示字符“F”。(我有一个将数据转换为 ASCII 码的 CASE 函数,在这种情况下,'F' = 0x0F)。 http://img193.imageshack.us/img193/1410/66647882.png

首先:当接收到 IR 信号时,下降沿中断将触发并将每 38 us 从 pin 到 x[i] 的每个数据存储并设置 Data_Ready 为 1。

/******************************FALLING EDGE INTERRUPT*************************/
void ex_int0(void)interrupt 0     
{
       unsigned char p;
       unsigned int u;
       unsigned int i;
       EA=0;

       for(i=0;i<500;i++)       //Loop for 500 bytes
       {
          for(u=0;u<8;u++)      //Bit Shift Loop
          { 
             timer0();          //Call timer0 function(38us)    
             x[i] = x[i] << 1;  //Left Bit Shift by 1
             p = Tsignal;       //Store Tsignal to Buffer p
             x[i] |= p;         //OR Masking of p with x[i]

          } 
       }

   EA=1;
   IE1 = 0;              
   Data_Ready = 1;             //Set Data_Ready = 1

 }//end 

接下来,将存储数据逐字节转换为ASCII码。 (例如 1111 1111 = FF)

/******************************DISPLAY_BYTE***********************************/
void Display_Byte()
{
   unsigned char Data_LK;
   unsigned char MSB;
   unsigned char LSB;
   unsigned int v;  
   TR1=1;                          //Enable Serial Port                                              
   for(v=0;v<500;v++)
   {    
      Data_LK = x[v];                      //Store x[v] in Data_LK
      MSB = Data_LK >> 4;                  //Shift Right Bits by 4      
      MSB &= 0x0F;                         //Mask bits of MSB
      MSB = lookuptable(MSB);              //Send MSB to lookuptable function                           
      SerialTx(MSB);                       //Send Converted Data to transmit

      LSB = x[v];                          //Store x[v] in LSB
      LSB &= 0x0F;                         //Mask bits of LSB
      LSB = lookuptable(LSB);              //Send LSB to lookuptable 
      SerialTx(LSB);                       //Send converted data to transmit
   }

   Data_Ready = 0;                         //Set Data_Ready to 0
   TR1 = 0;                                //Turn off Serial Port   
}

这是查找表:

/***********************LOOKUP TABLE*************************************/
unsigned char lookuptable(unsigned char t)
{
  switch(t)
  {
     case 0x00 : return '0';
     break;
     case 0x01 : return '1';
     break;
     case 0x02 : return '2';
     break;
     case 0x03 : return '3';
     break;
     case 0x04 : return '4';
     break;
     case 0x05 : return '5';
     break;
     case 0x06 : return '6';
     break;
     case 0x07 : return '7';
     break;
     case 0x08 : return '8';
     break;
     case 0x09 : return '9';
     break;
     case 0x0A : return 'A';
     break;
     case 0x0B : return 'B';
     break;
     case 0x0C : return 'C';
     break;
     case 0x0D : return 'D';
     break;
     case 0x0E : return 'E';
     break;
     case 0x0F : return 'F';
     break;
     default: break;
 }// end switch
}// end function

【问题讨论】:

  • 你的代码在哪里?根据最后几个问题,我假设它是同一个项目。您很可能没有正确采样输入流并且只得到 1s。
  • @AdamCasey 是的,它基于同一个项目。这是我项目的代码:My Program

标签: c serial-port hex ascii microcontroller


【解决方案1】:

至少其中一个错误是您没有对调用 lookuptable() 的结果做任何事情,因此您正在传输未转换的 MSB 和 LSB 值。

你可能打算这样做:

MSB = lookuptable(MSB);
SerialTx(MSB);
/* ... etc ... */
LSB = lookuptable(LSB);
SerialTx(LSB);

【讨论】:

  • 在我的查找函数下,我确实返回了值。返回值不是存放在 MSB 下还是 LSB 下?
  • @xrainxfallx:当您从 C 中的函数返回值时,您需要将其分配给某物或将该函数用作表达式的一部分以使用返回值。因此,例如lookuptable(LSB); 从lookuptable() 返回值,但从调用函数的位置丢弃返回的值。 LSB = lookuptable(LSB); 将返回该值并将其存储在 LSB 变量中的调用点。我已经编辑了我的帖子以使其更加明确。
  • 嗯,好的,谢谢。但是,现在我测试的问题是,每当我运行程序时,总是会触发外部中断(将由下降沿触发)。我什至换了不同的外部中断(INT3,INT5),结果还是一样。为什么呢 ? img829.imageshack.us/img829/5997/faultyserialport.png
  • @xrainxfallx:可能是因为您在配置边缘检测之前启用了中断。尝试将EA = 1; 行放在IT = 1; 行之后。但我不确定,我对 8051 没有太多经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多