|
之前弄的要用到扫描枪的CASE,现在将驱动说明如下:
此扫描枪为PS2接口,应用于某工厂的流水线产品上,用STC的单片机进行驱动PS2接口
标准C51驱动如下:
扫描枪与普通的电脑键盘的编码是完全一样的,测试扫描枪可以新键一个记事本,然后扫描条码,条码上的数字就会显示在记事本上,相当于你依次按下了那几个数字按键.
0,硬件连接,PS2_CLK连接到单片机外部中断,PS2_DATA连接到普通单片机输入/输出脚
1,设置外部中断为下降沿触发中断。
void Init_Ext(void)
{
EX0=1; // 允许外部中断
IT0=1; // INT0触发方式为下降沿触发,由高到低负跳变
PX0=1; // 优先级最高
EA=1; // 开中断
}
2,中断处理程序为:
void ISR_INT0 (void) interrupt 0
{
EX0=0;
PS2CntBusy=200; // 定时器会将此变量每1ms减1,等于0后通知主程序处理数据
PS2Temp>>=1; // 右移一个空位准备接收新的数据位
if(PS2_DATA==1) // 如果等于1,则置位该位
PS2Temp=PS2Temp|0x8000;
if(++PS2Len>=11) // 是第11位了吗?
{
PS2Temp=PS2Temp>>6; // 处理接收到的数据,提取有效位, ASxx,xxxx,xxS0,0000
BufPS2[PS2Pt]=PS2Temp&0x0ff; // 存放到PS2的接收缓冲区去
PS2Pt++; // 指针调整
PS2Len=0; // 位数长度计数器清0,准备接收下一个数据
}
EX0=1;
}
3,在定时器中(1ms中断一次)加入下面代码,用来检测PS2接收空闲时,设置标志来通知主程序
(如果收到一个有效PS2码就通知主程序,那扫描一下扫描枪,一般有十多个码,这样处理太频烦了,所以收到一串码再通知主程序,也即空闲时)
if(PS2CntBusy!=0)
{
PS2CntBusy--;
if(PS2CntBusy==0)
{
PS2Len=0;
PS2NumReceive=PS2Pt;
FlagPS2RecOK=1;
}
}
4,在主程序中检测标志并处理
main( )
{
Other( );
while(FlagPS2RecOK==1)
{
FlagPS2RecOK=0; // 清除接收完标志,方便下一次接收
PS2_Decode( ); // 解码PS2数据
Deal( ); // 处理
}
}
PS2_Decode()是将收到的PS2编码解码成对应的的键盘,
比如小键盘部分,按下数字1,收到的是0x70,如果按住不住,则一直会收到0x70,松手后,会收到0xf0,0x70.表示按键松手了,PS2编码百度下吧!
在华强北入货的枪,要设置参数就对着说明书里面的条码进行扫描
![]()
(原文件名:T2iXRoXe8XXXXXXXXX_!!169224229.jpg)
随便用普通打印机打印出来的条码供条码枪扫描测试:
![]()
(原文件名:T2rXtoXmhaXXXXXXXX_!!169224229.jpg)
现有两问题也顺便问下:
1,如果用USB接口的,再加个普通的USB转PS2座,能不改代码就可以应用于我的CASE上吗?
2,读键盘码可以了,但设置键未OK,比如要将键盘的小键盘灯点亮,应该怎样发送,我发送程序未完成 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|