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

📄 key.c

📁 在开发FPGA上比较有用
💻 C
字号:
/**************************************************************
程序说明      :PS2键盘实验
类    型      :Nios II
说    明      :
              通过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 0x20


void *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_INST_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  keybord()
{
  int iRet;
  alt_u16 status,data;
  alt_u8 key;
  
  iRet=init_ps2(FREEDEV_PS2_INST_BASE);
  iRet=read_ascii(&key); 
 return key;
}


⌨️ 快捷键说明

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