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