1. 程式人生 > >STC15程式設計之矩陣尋跡(第五天)

STC15程式設計之矩陣尋跡(第五天)

言之者無罪,聞之者足以戒。 - “詩序”

其實前兩天我就以為自己的矩陣已經調好了,我得出這個結論並不是編造的,而是它已經能夠完成尋跡了,只是有些不完美,就是總會有些搖頭晃腦,我自己本身也是想調的更好一些,所以我就仔細的檢查了自己的程式碼,認真的過一遍邏輯,又用Debug除錯了一遍,發現還是有些錯誤的。

我們先看一下之前的資料處理的程式:

/*資料處理函式*/
void Data_Handling()
{
		u8 i,j;
		u8 sum_l[5] = {0},sum_r[5] = {0}; 
		float sum[5] = {0};
		if(Data_Flag == 1)
		{
			Data_Flag = 0;
			for(j = 0;j < 5;j++)
			{
					Bit_Buf[0] = (Row_Col[j]) & (0X01);
					Bit_Buf[1] = (Row_Col[j]) & (0X02);
					Bit_Buf[2] = (Row_Col[j]) & (0X04);
					Bit_Buf[3] = (Row_Col[j]) & (0X08);
					Bit_Buf[4] = (Row_Col[j]) & (0X10);
					Bit_Buf[5] = (Row_Col[j]) & (0X20);
					Bit_Buf[6] = (Row_Col[j]) & (0X40);
					if(Bit_Buf[0] != 0)
					{
						sum_l[j] = 0;
					}
					else
					{
						for(i = 0;i < 7;i++)
						{
							if(Bit_Buf[i] < Bit_Buf[i+1])
							{
									sum_l[j] = i+1;
									break;
							}
						}
					}
					if(Bit_Buf[6] != 0)
					{
						sum_l[j] = 6;
					}
					else
					{
						for(i = 0;i < 7;i++)
						{
							if(Bit_Buf[i] > Bit_Buf[i+1])
							{
									sum_r[j] = i;
									break;
							}
						}
					}
					sum[j] = (float)((sum_l[j] + sum_r[j])/2.0 - 3); 
			}
			Sum_All = sum[0] + sum[1] + sum[2] + sum[3] + sum[4]; 
		}
}

這個處理程式的問題在於,如果有一行沒有沒有掃到黑線,那麼我們希望的是左右邊線的座標都是零,但是事實上不是零,所以轉彎的時候會總是晃半天才能過去。這就是因為左右邊線的值不是零所以計算出來的結果和我們預想的不一樣。

針對上面的問題,我做了一些改動,下面看一下我改過之後的資料處理程式:

/*資料處理函式*/
void Data_Handling()
{
		u8 i,j;
		u8 sum_l[5] = {0},sum_r[5] = {0}; 
		float sum[5] = {0};
			for(j = 0;j < 5;j++)
			{
					Bit_Buf[0] = (Row_Col[j]) & (0X01);
					Bit_Buf[1] = (Row_Col[j]) & (0X02);
					Bit_Buf[2] = (Row_Col[j]) & (0X04);
					Bit_Buf[3] = (Row_Col[j]) & (0X08);
					Bit_Buf[4] = (Row_Col[j]) & (0X10);
					Bit_Buf[5] = (Row_Col[j]) & (0X20);
					Bit_Buf[6] = (Row_Col[j]) & (0X40);
					if(Bit_Buf[0] != 0)
					{
						sum_l[j] = 0;
					}
					else
					{
						for(i = 0;i < 6;i++)
						{
							if(Bit_Buf[i] < Bit_Buf[i+1])
							{
									sum_l[j] = i+1;
									break;
							}
							if((i == 5) && (sum_l[j] == 0))
								sum_l[j] = 0;
						}
						
					}
					if(Bit_Buf[6] != 0)
					{
						sum_r[j] = 6;
					}
					else
					{
						for(i = 0;i < 6;i++)
						{
							if(Bit_Buf[i] > Bit_Buf[i+1])
							{
									sum_r[j] = i;
									break;
							}
							if((i == 5) && (sum_r[j] == 0))
								sum_r[j] = 0;
						}
					}
					if(sum_r[j] != 0)
						sum[j] = (float)((sum_l[j] + sum_r[j])/2.0 - 3); 
			}
			Sum_All = sum[0] + sum[1] + sum[2] + sum[3] + sum[4]; 
}

這樣處理之後的出來的結果就是正確的了,再拐直角彎道的時候就比以前順利多了。