?? 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 + -