原创 实现PS/2标准接口的通讯程序

2008-8-22 14:13 4087 5 6 分类: 通信

这是PS/2接口的键盘的通讯程序,程序只是实现了接收数据和发送数据,其中还有很多BUG之处,但功能完全可以实现,放在这城供大家学习,如果有人用于商业用途,请和我联系。magicchip@163.com


 


/******************************************************/
/*                                                       */
/*                                                       */
/* 文件名称:.c                                          */
/* 文件标识:                                            */
/* 摘 要:                                               */
/*                                                       */
/* 当前版本:                                            */
/* 作 者:   magicchip                                   */
/* 完成日期:                                            */
/* 修改版本:                                            */
/*                                                       */
/*                                                       */
/*********************************************************/
#i nclude "..\src\config.h"

 

/**********************************************************************************
** PS2.c操作部分.定义了ps2.c文件中的变量和常量。
** 这些量同时适用于对时钟芯片的操作.
***********************************************************************************/
struct ps2struct
{
 uint16  buf[10];        //PS2命令代码缓冲区
 uint8   flag;           //PS2操作标志
 uint8   bits;           //每字节接收的位数
 uint8   bytes;          //接收的字节数
};
extern struct ps2struct ps2;

#define   PS2DATA     (1<<28)      //p0.28
#define   PS2CLK      (1<<30)      //p0.30


#define  ps2txdflag  0x01           //发送标志
#define  ps2rxdflag  0x02           //接收标志
#define  ps2txdok    0x04           //以送完为1
#define  ps2rxdok    0x08           //
#define  ps2parity   0x80           //奇偶校验位.

#define  startbit       0x0001      //起始位
#define  paritybit      0x0200      //校验位
#define  stopbit        0x0400      //停止位

struct ps2struct ps2;


/**********************************************************************************
** 函数名称:   void EINT3_Init(void)
** 函数功能:   对外部中断3进行初始化,.
** 入口参数:   无
** 出口参数:   无
** 说明:    
** create by:   magicchip
** create data: 2007/12/05
*************************************************************************************/
void EINT3_Init(void)
{
  PINSEL1 |= ((PINSEL1 & 0xccffffff) | (0x20000000));   //EINT3,p0.30,clk = p0.30,sda = p0.28
 
  EXTMODE |= 0x08;             //EINT3边沿中断
  EXTPOLAR |= 0x00;            //EINT3下降沿中断
  EXTINT |= 0x08;       //清除EINT3中断标志


  install_irq(EINT3_INT,EINT3Prio,(void *)IRQ_EINT3); 
  ps2.flag = (0x00 | ps2parity);
  ps2.bits = 0x00;
  ps2.bytes = 0x00;
 
}


/**********************************************************************************
** 函数名称:   void  ps2txd(uint8 txdbuf)
** 函数功能:  
** 入口参数:   无
** 出口参数:   无
** create by:   magicchip
** create data: 2007/12/06
*************************************************************************************/
void  ps2txd(uint8 txdbuf)
{
   uint16 a;
   if (ps2.bits<10)                     //接收位数小于10
   {
      ps2.flag &= ~ps2txdok;
      ps2.flag |= ps2txdflag ;
      PINSEL1 = (PINSEL1 & 0xcfffffff);   //GPIO P0.30.
      IO0DIR |= (PS2CLK|PS2DATA);         //out
      IO0CLR = PS2CLK;                    //clk = 0 
      DelayNS(10);
      ps2.bits = 0x00;
      ps2.bytes = 0x00;
      ps2.buf[0] = (((uint16)txdbuf) | (stopbit>>1) | (paritybit>>1));
      IO0CLR = PS2DATA;                   //data = 0
      IO0DIR &= ~PS2CLK;                  //clk in
      PINSEL1 |= ((PINSEL1 & 0xccffffff) | (0x20000000));   //EINT3,p0.30,clk = p0.30,sda = p0.28


   }  
}


/**********************************************************************************
** 函数名称:   void  __irq  IRQ_EINT3(void)
** 函数功能:  
** 入口参数:   无
** 出口参数:   无
** create by:   magicchip
** create data: 2007/12/06
*************************************************************************************/
void  __irq  IRQ_EINT3(void)
{
  uint16 *string;
  if ((ps2.flag & ps2txdflag) == ps2txdflag)   //发送数据.
  {
    DelayNS(1);
    if (ps2.bits < 10)
    {
       if ((ps2.buf[0] & (1<<ps2.bits)) == (1<<ps2.bits))   //send 1
       { 
          IO0SET = PS2DATA;
          ps2.buf[0] ^= (paritybit>>1);
          ps2.bits++;
       }
       else                                                 //send 0
       {
          IO0CLR = PS2DATA;
          ps2.bits++;
       }
    }
    /*
    else if (ps2.bits == 9)                                //send stop
    {
       IO0SET = PS2DATA;
       ps2.bits++;
    }
    */
    else                                                  //ack
    {
       IO0DIR &= ~PS2DATA;                  //DATA in
       ps2.flag &=~ps2txdflag;
       ps2.bits = 0x00;
    }
  }
  else                                         //接收数据
  {
    if ((IO0PIN & PS2DATA) == PS2DATA)
    {
      ps2.buf[ps2.bytes] |= (1<<ps2.bits);
      if (ps2.bits < 9)
        ps2.flag ^= ps2parity; 
    }
    else
    {
      ps2.buf[ps2.bytes] &= ~(1<<ps2.bits);
    }   
    ps2.bits++;
    if (ps2.bits == 11)
    {
      ps2.bits = 0x00;     
      ps2.flag |= ps2rxdflag;               //接收数据标志. 
      ps2.buf[ps2.bytes] = ((ps2.buf[ps2.bytes]>>1) & 0x00ff);
      string =ps2.buf; 
      ps2.bytes=0x00;
      //                                起始位,停止位,奇偶校验位检查。
      /*
      if ((((ps2buf[ps2bytes] & paritybit) >> 2) == (ps2flag & ps2parity))
          && ((ps2buf[ps2bytes] & stopbit) == stopbit)
         && ((ps2buf[ps2bytes] & startbit) != startbit))
      {
        ps2.flag |= ps2parity;       
      }
      */  
    }
  }


  EXTINT |= 0x08;       //清除EINT3中断标志
  VICVectAddr = 0;            // 通知中断控制器中断结束  
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1447181 2008-9-5 13:21

感觉有点乱,写成头文件更好
相关推荐阅读
用户138170 2008-08-22 14:15
SST39VF6401操作的API接品函数
HI ,大家好,今天是2008年的第一天,不知大家上班是否很忙呢?随着项目的进展,工作也越来起忙了,虽然是第一天也没有一点空闲呀,上午写了一个对SST39VF6401操作的API函数,这也是我整个项目...
用户138170 2008-08-22 14:10
AT89C2051比较器的应用
这是AT89C2051的一个特殊应用,用它的比较器做一个光强调节器,应用在全静态LED显示屏上。当初的情况是原有LED 显示屏的光控是用专用的AD转换芯片做的,比较贵。最后用这个方案做为一个补丁用了一...
用户138170 2008-08-22 14:09
24c01~24c1024全系列EEPROM的读写程序
这是我写的一个读写全系列EEPROM的程序,现贴出来让大家享用,不知对大家是否有一定的帮助,以后再有好的程序还会贴出来和大家分享。//*********************************...
用户138170 2008-08-22 08:55
led 显示屏控制系统之软件设计
前段时间上传了一个关于LED显示屏的硬件设计,现上传一个软件,这个软件比较简单,是上学时间写的一个小程序,程序虽小,但它也是一个显示程序,它的框架和现实LED显示的程序是一样的,如果把这个程序和上一次...
用户138170 2008-08-22 08:53
led 显示屏控制系统之硬件设计
led 显示屏控制系统之硬件设计                                设计人:magicchip   LED点阵式显示屏发展到今天在朝着两个方向发展,高端产品主要是全彩色显示...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条