请问有没有人做过51单片机控制PS/2口条形码扫描器的?

2020-02-02 09:17发布

新手一个,请教如何通过PS/2口来接受条形码扫描的信息?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
zzzhangxiang
1楼-- · 2020-02-03 08:57
 精彩回答 2  元偷偷看……
zzzhangxiang
2楼-- · 2020-02-03 12:49
liujinhan 发表于 2012-8-12 14:14
连续解码,不就是一串字符了吗?

扫描枪扫描的速度很快,定义200ms内连续解码。200ms到了,就说明一次扫码 ...

条形码扫描器扫描的时候是扫描到一个数字就像键盘那样有那个数字的通码跟断码输出吗?例如:扫描到第一位数字是6的话,就输出6的通码跟断码(共3个16进制码),假如扫描完一整条共10数的条形码,就得到30个16进制码。

这样理解对吗?
liujinhan
3楼-- · 2020-02-03 14:44
键盘的长度不一样,不都是30个。

第二套扫描码
101 102 和104 键的键盘:

KEY        通码        断码                KEY        通码        断码                KEY        通码        断码
A        1C        F0 1C                9        46        F0 46                [        54        F0 54
B        32        F0 32                `        0E        F0 0E                INSERT        E0 70        E0 F0 70
C        21        F0 21                -        4E        F0 4E                HOME        E0 6C        E0 F0 6C


E0 F0  区别开来就可以了。






转个代码,慢慢看吧。

#include "PS2.h"   
#include "scancode.h"   
//5ms延时   
static unsigned char IntNum = 0; //中断次数计数   
static unsigned char KeyV; //键值   
static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识   
static unsigned char BF = 0; //标识是否有字符被收到   
static unsigned char PS2_ready = 0; //键盘初始化完毕标志   
static unsigned char LEDS=0; //键盘上灯的状态   
   
void wait_us(unsigned int delay)   
{   
delay=delay*OSC_US;   
while (delay--);   
}   
   
   
void Keyboard_out(void) interrupt 2   
{   
if ((IntNum > 0) && (IntNum  9))   
{   
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位   
if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位   
}   
IntNum++;   
while (!Key_CLK); //等待PS/2CLK拉高   
if (IntNum > 10)   
{   
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收   
BF = 1; //标识有字符输入完了   
EX1 = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)   
//PutChar(2,0,KeyV);   
}   
}   
   
void SendKeyCmd(unsigned char cmd){   
bit D0,D1,D2,D3,D4,D5,D6,D7,parity,text1;   
text1=EX1;   
EX1=0;   
      
if (Key_CLK)   
{   
    wait_us(2000);   
    Key_CLK=0;     
    D0=cmd&0x01;D1=cmd&0x02;D2=cmd&0x04;D3=cmd&0x08;   
    D4=cmd&0x10;D5=cmd&0x20;D6=cmd&0x40;D7=cmd&0x80;   
    parity=D0^D1^D2^D3^D4^D5^D6^D7;   
    wait_us(20);   
    Key_Data=0;   
    wait_us(2);   
    Key_CLK=1;   
    while(Key_CLK);   
    Key_Data=D0;    //写D0   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D1;    //写D1   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D2;    //写D2   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D3;    //写D3   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D4;    //写D4   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D5;    //写D5   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D6;    //写D6   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=D7;    //写D7   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=!parity;   //写奇偶校验位   
    while(!Key_CLK);   
    while(Key_CLK);   
    Key_Data=1; //写停止位   
    wait_us(20);   
}   
EX1=text1;   
}   
   
unsigned char Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码   
{   
unsigned char TempCyc,asc=0;   
   
    if (ScanCode==0xAA) PS2_ready=1;   
   
if (!Key_UP) //当键盘松开时   
{   
switch (ScanCode)   
{   
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始   
    Key_UP = 1;   
    break;   
   
case 0xFC :   
    asc=0xFC;  //自检失败   
    break;   
   
case 0xEE:   
    asc=0xEE;  //键盘回复   
    break;   
   
case 0x58: //若按下CapsLock   
    LEDS^=KEY_LED_CAPS;   
    SetKeyLED(LEDS);   
    wait_us(2000);   
    break;   
case 0x77: //若按下NumLock   
    LEDS^=KEY_LED_NUM;   
    SetKeyLED(LEDS);   
    wait_us(2000);   
    break;   
case 0x7E: //若按下ScrollLock   
    LEDS^=KEY_LED_SCROLL;   
    SetKeyLED(LEDS);   
    wait_us(2000);   
    break;   
case 0x12 : // 左 SHIFT   
    Shift = 1;   
    asc=0x10;   
    break;   
   
case 0x59 : // 右 SHIFT   
    Shift = 1;   
    asc=0x10;   
    break;   
   
default:   
           for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<26); TempCyc++);   
            if (UnShifted[TempCyc][0] == ScanCode)   
                {   
                if ((((LEDS&KEY_LED_CAPS)>0)&&(!Shift))||(((LEDS&KEY_LED_CAPS)==0)&&(Shift)))    //判断大写     
                        asc=Shifted[TempCyc][1];   
                        else   
                        asc=UnShifted[TempCyc][1];   
                }   
        if (asc==0)   
        {   
            for (TempCyc = 26;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<47); TempCyc++);   //判断shift   
            if (UnShifted[TempCyc][0] == ScanCode)   
                {   
                    if (Shift)   
                        asc=Shifted[TempCyc][1];   
                        else      
                        asc=UnShifted[TempCyc][1];   
                }   
        }   
        if (asc==0)   
        {   
            for (TempCyc = 47;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);   
            if (UnShifted[TempCyc][0] == ScanCode)   
                {                                                                          //小键盘开关   
                    if ((LEDS&KEY_LED_NUM)>0)   
                        asc=Shifted[TempCyc][1];   
                        else   
                        asc=UnShifted[TempCyc][1];   
                }   
        }   
        if (asc==0)   
        {   
         for(TempCyc = 0; (FuncKey[TempCyc][0]!=ScanCode)&&(TempCyc<34); TempCyc++);   
         if (FuncKey[TempCyc][0] == ScanCode) asc=FuncKey[TempCyc][1];   
        }   
break;   
}   
}   
else   
{   
    Key_UP = 0;   
    switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理   
    {   
        case 0x12 : // 左 SHIFT   
        Shift = 0;   
        break;   
   
        case 0x59 : // 右 SHIFT   
        Shift = 0;   
        break;   
    }   
}   
return asc;   
}   
   
unsigned char KeyInit()   
{   
EX1=1;   
if (BF&&KeyV==0xAA)   
{   
    SetKeyRate(0x1f);   
    //SetKeySet(2);   
    //SetAllKeyType(KEY_TYPE_M);   
    LEDS^=KEY_LED_NUM;   
    SetKeyLED(LEDS);   
    //SendEcho();   
    BF=0;   
    return 1;   
}   
return 0;   
}   
   
bit KeyState()   
{   
    return BF;   
}   
void SetState(bit b)   
{   
    BF=b;   
}   
unsigned char GetCode()   
{   
unsigned char ktmp=KeyV;   
    BF = 0; //标识字符处理完了   
    EX1 = 1;//开键盘中断接收下一数据   
    return ktmp;   
}   
unsigned char LEDState()   
{   
    return LEDS;   
}   
   
void KeyReset()   
{   
    BF=0;   
    ResetKey();   
    EX1=1;   
    LEDS=0;   
}   
unsigned char GetOneKey()   
{   
    unsigned char key;   
    while(1)   
    {   
        if(KeyState())   
        {   
            key=Decode(GetCode());   
            if(key!=0)return key;   
        }   
    }   
}  
jetli
4楼-- · 2020-02-03 18:34
http://www.amobbs.com/forum.php? ... 1%E7%A0%81%E6%9E%AA

这个帖子,Pioneermcu  网友,可惜没提供型号,,,,又没时间去深圳买个一样的,
qd118118
5楼-- · 2020-02-04 00:12
这个要MARK
zzzhangxiang
6楼-- · 2020-02-04 03:43
 精彩回答 2  元偷偷看……

一周热门 更多>