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);
}
}
}
}
}
|