打印

请教PS2键盘问题,请大家帮帮忙

[复制链接]
1915|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cjb114b|  楼主 | 2007-5-12 18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我设计一个键盘,打算把键盘上的键值发到电脑上显示,可以插上键盘后,按下键就听到嘟了一声,放开键就嘟两声,如果长按下键就会嘟嘟不停,放开后又嘟两声,但是电脑什么都不显示!
问题:1:请问在电脑和另外一个键盘启动后,拔掉插进自己设计的键盘,这样可行吗?
    2:我怀疑我对键盘的初始化不对,才使电脑显示不出来.
  下面是我的程序:请大家给给意见
#include <avr/io.h>
#include <avr/delay.h> 
#include <avr/interrupt.h>
#include <avr/signal.h> 
#include <avr/wdt.h>
#include <stdio.h>
#include <avr/eeprom.h> 
//#define 时钟线  PB0
//#define 数据线  PB7
unsigned char del_1,key_data,key_down,got,se_data,key,key_,can_sead,fig_check_data,check_data,song_black;
void send_0(void)    //发送启事位
  {
    PORTB|=_BV(PB7)|_BV(PB0);
    DDRB|=_BV(PB7)|_BV(PB0);
    _delay_us(20);
    PORTB&=~_BV(PB7);
    _delay_us(20);
    PORTB&=~_BV(PB0);
    _delay_us(40);
    PORTB|=_BV(PB0);
    _delay_us(20);
  }
void send_1(void)    //发送结束位
  {
    PORTB|=_BV(PB7)|_BV(PB0);
    DDRB|=_BV(PB7)|_BV(PB0);
    _delay_us(20);
    PORTB|=_BV(PB7);
    _delay_us(20);
    PORTB&=~_BV(PB0);
    _delay_us(40);
    PORTB|=_BV(PB0);
    _delay_us(20);
  }
void send(unsigned char dat_sent)
  {
    PORTB|=_BV(PB7)|_BV(PB0);
    DDRB|=_BV(PB7)|_BV(PB0);
  char fg_i;
  for(fg_i=0;fg_i<8;fg_i++)
   {
    _delay_us(20);
    if(dat_sent&0x01)
    PORTB|=_BV(PB7);
    else
    PORTB&=~_BV(PB7);
    _delay_us(20);
    PORTB&=~_BV(PB0);
    _delay_us(40);
    PORTB|=_BV(PB0);
    _delay_us(20);
     dat_sent>>=1;
     //  if(check_data==1)
     //   {
          DDRB&=~_BV(PB7);
         PORTB|=_BV(PB7);
          if(((PINB&0x80)!=0x00))
           fg_i=11;
    //       check_data=0;
    //       fig_check_data=1;
      //  }
    }
  }
void on_of(unsigned char jiou)    //发送奇偶位
  {
    unsigned char fh,fg;
    for(fh=0;fh<8;fh++)
      {
        if(jiou&0x80)
          fg++;
        jiou<<=1;
      }
      if(fg%2==1)  send_0();
      else send_1();
  }
void send_yda(unsigned char dat_fa)   //应答电脑回复0xfa数
  {
    PORTB|=_BV(PB7)|_BV(PB0);
    DDRB|=_BV(PB7)|_BV(PB0);
  char fg_i;
  for(fg_i=0;fg_i<8;fg_i++)
   {
    _delay_us(20);
    if(dat_fa&0x01)
    PORTB|=_BV(PB7);
    else
    PORTB&=~_BV(PB7);
    _delay_us(20);
    PORTB&=~_BV(PB0);
    _delay_us(40);
    PORTB|=_BV(PB0);
    _delay_us(20);
     dat_fa>>=1;
     //  if(check_data==1)
     //   {
          DDRB&=~_BV(PB7);
         PORTB|=_BV(PB7);
          if(((PINB&0x80)!=0x00))
           fg_i=11;
          // check_data=0;
         //  fig_check_data=1;
     //   }
    }
  }
void read_data(void)     //接收电脑发过来的数据,数据忽略
   {
     unsigned char ten;
          DDRB|=_BV(PB0);
          DDRB&=~_BV(PB7);
         PORTB|=_BV(PB7);
      for(ten=0;ten<12;ten++)
        {
          _delay_us(30);
          PORTB&=~_BV(PB0);
          _delay_us(50);
         PORTB|=_BV(PB0);
          _delay_us(20);
           //check_data=0;
          // fig_check_data=1;
      //  }
        }
          song_black=0xfa;
          DDRB&=~_BV(PB7);
          PORTB|=_BV(PB7);
          while(((PINB&0x80)!=0x80))
          {
          _delay_us(30);
          PORTB&=~_BV(PB0);
          _delay_us(50);
         PORTB|=_BV(PB0);
          _delay_us(20);
          song_black=0xfc;
          }
   }
SIGNAL(SIG_OVERFLOW0)
     {TCNT0=0X00;
       cli();
       if(fig_check_data==1)
        {
          unsigned int timeme;
          if(timeme++>=40)
          {
           fig_check_data=0;
           check_data=1;
          }
         }
         if(((PINB&0x08)==0x00)&&(key_==0))
          {
          key_=1;
          key_down=0x1c;
          can_sead=1;
          }
         if(((PINB&0x08)==0x08)&&(key_==1))
          {
          key_=0;
          can_sead=2;
          }
         if(((PINB&0x04)==0x00&&(key_==0)))
          {
          key_=2;
          key_down=0x32;
          can_sead=1;
          }
         if(((PINB&0x04)==0x04)&&(key_==2))
          {
          key_=0;
          can_sead=2;
          }
         if(((PINB&0x02)==0x00)&&(key_==0))
          {
          key_=3;
          key_down=0x21;
          can_sead=1;
          }
         if(((PINB&0x02)==0x02)&&(key_==3))
          {
          key_=0;
          can_sead=2;
          }
       sei();
       }
//本程序想在电脑上显示a字符,发送流程是先发送a的通码,再发0xff,接着发a的断码,请问我这样做对吗?PB0接clk  PB7接data
int main(void)
  {
         DDRB&=~_BV(PB0);
         DDRB&=~_BV(PB7);
         PORTB|=_BV(PB7);
         PORTB|=_BV(PB0);
        TIMSK=2;//允许溢出中断
        TCNT0=0X00;//初值为0
        TCCR0=2;//使用8分频
        SREG=0x80;//开全中断 
        bei_cal0:
          DDRB&=~_BV(PB0);
          PORTB|=_BV(PB0);
           while((PINB&0x01)!=0x01);   //判断clk是否为low
           _delay_us(50);
           if((PINB&0x01)!=0x01) //判断clk是否为high  否--等待
            goto bei_cal0;
          DDRB&=~_BV(PB7);
          PORTB|=_BV(PB7);
          if((PINB&0x80)!=0x80) //判断clk是否为high  否--等待
            {
              _delay_us(20);      //0
          read_data();
        bei_call2:
          DDRB&=~_BV(PB0);
          PORTB|=_BV(PB0);
           while((PINB&0x01)!=0x01);   //判断clk是否为low
           _delay_us(50);
           if((PINB&0x01)!=0x01) //判断clk是否为high  否--等待
            goto bei_call2;
          DDRB&=~_BV(PB7);
          PORTB|=_BV(PB7);
          if((PINB&0x80)!=0x80) //判断clk是否为high  否--等待
          goto read;
             _delay_us(40);      //0
             send_0();           //启示位
             send_yda(song_black);  //发a字符
             on_of(song_black);  //奇偶位
             send_1();  //结束位
             _delay_ms(80);
            goto bei_cal0;
            }
             _delay_ms(20);      //0
             send_0();           //启示位
             send(0xaa);  //发a字符
             on_of(0xaa);  //奇偶位
             send_1();  //结束位
           _delay_ms(80);
    while(1)
     {
        bei_call:
          DDRB&=~_BV(PB0);
          PORTB|=_BV(PB0);
           while((PINB&0x01)!=0x01);   //判断clk是否为low
           _delay_us(50);
           if((PINB&0x01)!=0x01) //判断clk是否为high  否--等待
            goto bei_call;
          DDRB&=~_BV(PB7);
          PORTB|=_BV(PB7);
          if((PINB&0x80)!=0x80) //判断clk是否为high  否--等待
            goto bei_call;
             if(can_sead==1)
              {
             _delay_us(20);      //0
             send_0();           //启示位
             send(key_down);  //发a字符
             _delay_us(40);      //0
             on_of(key_down);  //奇偶位
             send_1();  //结束位
           _delay_ms(80);
           can_sead=0;
             }  
             else if(can_sead==2)
              {
             _delay_us(40);      //0
             send_0();    //启示位
             send(0xf0);  //发a字符
             on_of(0xf0);  //奇偶位
             send_1();  //结束位
             //se_data=0x1c;   //发送A的断码
           _delay_us(30);
           _delay_ms(80);
           can_sead=3;
            }
            else if(can_sead==3)
            {
             send_0();    //启示位
             send(key_down);  //发a字符
             on_of(key_down);  //奇偶位
             send_1();  //结束位
           _delay_ms(80);
          can_sead=0;
         }
         goto bei_call;
         read:
             _delay_us(20);      //0
          read_data();
        bei_call1:
          DDRB&=~_BV(PB0);
          PORTB|=_BV(PB0);
           while((PINB&0x01)!=0x01);   //判断clk是否为low
           _delay_us(50);
           if((PINB&0x01)!=0x01) //判断clk是否为high  否--等待
            goto bei_call1;
          DDRB&=~_BV(PB7);
          PORTB|=_BV(PB7);
          if((PINB&0x80)!=0x80) //判断clk是否为high  否--等待
          goto read;
             _delay_us(40);      //0
             send_0();           //启示位
             send_yda(song_black);  //发a字符
             on_of(song_black);  //奇偶位
             send_1();  //结束位
             _delay_ms(80);
     }
  }
沙发
ocon| | 2007-5-12 18:34 | 只看该作者

我怀疑谁会有时间分析完这么长的代码,

你可以用单片机把你做的键盘发来的数据转到串口去显示来调试,一般PC键盘有几种数据模式,电脑会自动识别,具体可以参考论坛里的博客。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

7

帖子

0

粉丝