CCD紅外掃描槍,PS/2接口,如果用232接口的價格貴點,MCU那邊程序處理好一點,掃描出來的條碼掃描槍按照PS/2協議自動發送給上位機,默認形式下有個終止符,就是回車鍵,鍵值是0x5a,0xf0,0x5a,現在的情況是掃描EAN-13型的條碼,當然對接收的數據可以采用兩種辦法,判斷接收的位數,因為位數是死的,到那個位數值就處理判斷,然后送LCD顯示看一下,還有一種就是判斷有沒有碰到終止符,碰到就說明一組數據傳輸完畢,畢竟條碼有長有短,為了靈活運用,偶還是采用了判斷終止符的辦法。奇怪無比郁悶的是老是成功閱讀了若干個條碼后會無法判斷識別出終止符了。MCU肯定沒死機,執行其他程序是OK的,因為沒有仿真器,所以設置了幾個點亮關閉LED的動作來判斷程序到底出錯在哪里。折騰了三天了,急死了。唉,附一些程序。
void Receive_Data(void)
{
if((Int_counter>0)&&(Int_counter<9)) //第1位起始位低電平拋棄,故從第2次中斷開始到第9次中斷是8位數據
{
Key_buf=Key_buf>>1;
if((DATA_STATUS))
Key_buf|=0x80;//如果數據線是高電平,則為1
}
Int_counter++;
while(!(CLK_STATUS));//等待PS/2的CLK拉高
if(Int_counter>10)
{
Int_counter=0;
Receive_status|=BIT(0);//成功接收一個數據后設置一個判斷位
}
}
/********************************INT1中斷**************************************/
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
if(IsEnd==FALSE)
{
Receive_Data();
if(Receive_status&0x01)
{
Receive_status&=~BIT(0);
PS2_Receive.buf[PS2_Receive.cnt]=Key_buf;//第0個即存放第一個數據
PS2_Receive.cnt++;
LED_GREEN_ON;
if(PS2_Receive.buf[PS2_Receive.cnt-1]==0x5a)//碰到"ENTER"終止符,通碼+斷碼為0x5a+0xf0,0x5a
{
IsEnd=TRUE;
Endcnt=0;
LED_RED_ON;
}
if(PS2_Receive.cnt>64)//正常的話,數據接收不可能超過64個,如果成功閱讀碰到終止符,程序跳轉執行完后會自動清PS2_Receive.cnt;無法閱讀,LED_GREEN老是接收了滿數據后暗滅交替,IsEnd老是為FALSE,也就是判斷不到0x5a啊,就是郁悶在這里。
{
LED_GREEN_OFF;
}
}
}
else
{
Receive_Data();
if(Receive_status&0x01)
{
PS2_Receive.buf[PS2_Receive.cnt]=Key_buf;
PS2_Receive.cnt++;
Receive_status&=~BIT(0);
Endcnt++;
if(Endcnt==2)
{
if((PS2_Receive.buf[PS2_Receive.cnt-1]==0x5a)&&(PS2_Receive.buf[PS2_Receive.cnt-2]==0xf0))
{
if((SendToRBuf(PS2_Receive)==COMM_NO_ERR))
{
Comm_status|=BIT(7);
}
IsEnd=FALSE;
Endcnt=0;
PS2_Receive.cnt=0;
LED_GREEN_OFF;
}
else
{
IsEnd=FALSE;
Endcnt=0;
PS2_Receive.cnt=0;
Scan_error|=BIT(7);
}
}
}
}
}
|