📄 key.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 + -