我的程序会将红外信号存储为“0”或“1”到 DS89C450 的 xdata 1kByte SRAM,然后将其显示在我的 MTK 上。
但是,无论我按红外 Remote 上的哪个按钮,显示的数据都只显示字符“F”。(我有一个 CASE 函数,可以将数据转换为 ASCII 代码,在本例中“F”= 0x0F)。 http://img193.imageshack.us/img193/1410/66647882.png
首先:当接收到IR信号时,下降沿中断将每隔38 us触发并存储从引脚到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
最佳答案
至少有一个错误是您没有对 Lookuptable() 调用的结果执行任何操作,因此您正在传输未转换的 MSB 和 LSB 值。
您可能打算做这样的事情:
MSB = lookuptable(MSB);
SerialTx(MSB);
/* ... etc ... */
LSB = lookuptable(LSB);
SerialTx(LSB);
关于c - 为什么MTK只显示 'F',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10595032/