⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2_keyboard.c

📁 这是一个使用ps2 ip core的范例
💻 C
字号:
/**************************************************************程序说明      :PS2键盘实验类    型      :Nios II作    者      :柳军胜公    司      :杭州自由电子科技            :http://www.freefpga.com电   话       :0571-85084089修    改      :日期时间      :20060613说    明      :              通过FreeDev ps2 ipcore实现键盘驱动,接收键盘数据输入**************************************************************/#include <stdio.h>#include <io.h>#include <system.h>#include <alt_types.h>// 读取键盘状态或数据超时次数#define PS2_TIMEOVER  100000// FreeDev PS2寄存器 OFFSET#define PS2_STATUS 0x02#define PS2_DATA  0x03// FreeDev PS2状态位#define PS2_NOACK 0x0001#define PS2_TX_WRITE_ACK 0x0002#define PS2_RX_DATA_READY 0x04#define PS2_SHIFT_KEY_ON 0x08#define PS2_RX_RELEASED 0x10#define PS2_RX_EXTENDED 0x20void *gPS2Base;/*********************************************函数名:wait_rx_ready功  能:等待键盘数据就绪输  入:返  回: 备  注:      使用PS2全局地址gBaseAddr;循环n次等待数据就绪**********************************************/int wait_rx_ready(int count,alt_u16 *pStatus){  int iRet;  alt_u16 status,data;  int i;    if(count==0)  {    do{      status=IORD(gPS2Base,PS2_STATUS);      }while(!(status & PS2_RX_DATA_READY));     *pStatus=status;     return 0;  }else  {    for(i=0;i<count;i++)    {        status=IORD(gPS2Base,PS2_STATUS);      if(status & PS2_RX_DATA_READY)      {        *pStatus=status;        return 0;      }    }    return -1;   }   return -1; } /*********************************************函数名:read_scan_code功  能:读取扫描码输  入:返  回: 备  注:      使用PS2全局地址gBaseAddr**********************************************/int read_scan_code(alt_u8 *scan_code){  int iRet,i;  alt_u16 status,data;      if(wait_rx_ready(0,&status)<0)    return -1;  data=IORD(gPS2Base,PS2_DATA);  *scan_code = (data & 0xff00)>>8;    return 0;    }  /*********************************************函数名:read_ascii功  能:读取扫描码输  入:返  回: 备  注:      使用PS2全局地址gBaseAddr**********************************************/int read_ascii(alt_u8 *code){  int iRet;  alt_u16 status,data;    // 读键盘断码  while(1)  {      if(wait_rx_ready(0,&status)<0)      return -1;    if((status & PS2_RX_RELEASED))      break;    // 读通码    data=IORD(gPS2Base,PS2_DATA);  }    // 读断码数据  data=IORD(gPS2Base,PS2_DATA);  *code = data & 0x00ff;   return 0; } /*********************************************函数名:init_ps2功  能:初始化键盘输  入:返  回: 备  注:      保存PS2全局地址gBaseAddr**********************************************/int init_ps2(void *base_addr){  int iRet;  unsigned char i;  alt_u16 status,data;  alt_u8 key;    gPS2Base=base_addr;    IOWR(FREEDEV_PS2_0_BASE,PS2_DATA,0xFF);    printf("reset keyboard......\n");  while(1)  {    iRet=read_scan_code(&key);    if(iRet<0)    {      printf("读取键盘自测试字节错误");      return -1;    }        if(key==0xfa)      continue;    else if(key!=0xaa)      IOWR(gPS2Base,PS2_DATA,0xFF);    else      break;  }  printf("reset keyboard OK!!\n");    return 0;}int main(){  int iRet;  alt_u16 status,data;  alt_u8 key;    printf("PS2 键盘测试!\n");   iRet=init_ps2(FREEDEV_PS2_0_BASE);    while(1)  {    iRet=read_ascii(&key);    printf("%c",key);   }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -