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