PS2kb.docx
- 文档编号:9160155
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:17.26KB
PS2kb.docx
《PS2kb.docx》由会员分享,可在线阅读,更多相关《PS2kb.docx(16页珍藏版)》请在冰豆网上搜索。
PS2kb
Kb.c
#include"kb.h"
#include"altera_avalon_pio_regs.h"
/***********************************************/
#defineOUT1
#defineIN0
/***********************************************/
KEYBOARD_STRUCTkey1_lut[]=
{
0x16,0x31,0x21,0,0,//{1}{!
}
0x1e,0x32,0x40,0,0,//{2}{@}
0x26,0x33,0x23,0,0,//{3}{#}
0x25,0x34,0x24,0,0,//{4}{$}
0x2e,0x35,0x25,0,0,//{5}{%}
0x36,0x36,0x5e,0,0,//{6}{^}
0x3d,0x37,0x26,0,0,//{7}{&}
0x3e,0x38,0x2a,0,0,//{8}{*}
0x46,0x39,0x28,0,0,//{9}{(}
0x45,0x30,0x29,0,0,//{0}{)}
0x1c,0x61,0x41,0,0,//{a}{A}
0x32,0x62,0x42,0,0,//{b}{B}
0x21,0x63,0x43,0,0,//{c}{C}
0x23,0x64,0x44,0,0,//{d}{D}
0x24,0x65,0x45,0,0,//{e}{E}
0x2b,0x66,0x46,0,0,//{f}{F}
0x34,0x67,0x47,0,0,//{g}{G}
0x33,0x68,0x48,0,0,//{h}{H}
0x43,0x69,0x49,0,0,//{i}{I}
0x3b,0x6a,0x4a,0,0,//{j}{J}
0x42,0x6b,0x4b,0,0,//{k}{K}
0x4b,0x6c,0x4c,0,0,//{l}{L}
0x3a,0x6d,0x4d,0,0,//{m}{M}
0x31,0x6e,0x4e,0,0,//{n}{N}
0x44,0x6f,0x4f,0,0,//{o}{O}
0x4d,0x70,0x50,0,0,//{p}{P}
0x15,0x71,0x51,0,0,//{q}{Q}
0x2d,0x72,0x52,0,0,//{r}{R}
0x1b,0x73,0x53,0,0,//{s}{S}
0x2c,0x74,0x54,0,0,//{t}{T}
0x3c,0x75,0x55,0,0,//{u}{U}
0x2a,0x76,0x56,0,0,//{v}{V}
0x1d,0x77,0x57,0,0,//{w}{W}
0x22,0x78,0x58,0,0,//{x}{X}
0x35,0x79,0x59,0,0,//{y}{Y}
0x1a,0x7a,0x5a,0,0,//{z}{Z}
0x0e,0x60,0x7e,0,0,//{`}{~}
0x4e,0x2d,0x5f,0,0,//{-}{_}
0x55,0x3d,0x2b,0,0,//{=}{+}
0x5d,0x5c,0x7c,0,0,//{\}{|}
0x54,0x5b,0x7b,0,0,//{[}{{}
0x5b,0x5d,0x7d,0,0,//{]}{}}
0x4c,0x3b,0x3a,0,0,//{;}{:
}
0x52,0x27,0x22,0,0,//{'}{"}
0x41,0x2c,0x3c,0,0,//{,}{<}
0x49,0x2e,0x3e,0,0,//{.}{>}
0x4a,0x2f,0x3f,0,0,//{/}{?
}
0x5a,0xff,0xff,0,0,//{enter}
0x29,0x20,0x20,0,0,//{space}49
0x05,0xff,0xff,0,"F1",
0x06,0xff,0xff,0,"F2",
0x04,0xff,0xff,0,"F3",
0x0c,0xff,0xff,0,"F4",
0x03,0xff,0xff,0,"F5",
0x0b,0xff,0xff,0,"F6",
0x83,0xff,0xff,0,"F7",
0x0a,0xff,0xff,0,"F8",
0x01,0xff,0xff,0,"F9",
0x09,0xff,0xff,0,"F10",
0x78,0xff,0xff,0,"F11",
0x07,0xff,0xff,0,"F12",//61
0x66,0xff,0xff,0,"BKSP",
0x0d,0xff,0xff,0,"TAB",
0x14,0xff,0xff,0,"L_CTRL",
0xe01f,0xff,0xff,0,"L_GUI",
0x11,0xff,0xff,0,"L_ALT",
0xe014,0xff,0xff,0,"R_CTRL",
0xe027,0xff,0xff,0,"R_GUI",
0xe011,0xff,0xff,0,"R_ALT",
0xe02f,0xff,0xff,0,"APPS",
0x76,0xff,0xff,0,"ESC",
0xe070,0xff,0xff,0,"Ins",
0xe06c,0xff,0xff,0,"Home",
0xe07d,0xff,0xff,0,"PgUP",
0xe071,0xff,0xff,0,"Del",
0xe069,0xff,0xff,0,"End",
0xe07a,0xff,0xff,0,"PgDn",
0xe075,0xff,0xff,0,"U_ARROW",
0xe06b,0xff,0xff,0,"L_ARROW",
0xe072,0xff,0xff,0,"D_ARROW",
0xe074,0xff,0xff,0,"R_ARROW",//81
0xe04a,0x2f,0x2f,0,"KP_/",
0x7c,0x2a,0x2a,0,"KP_*",
0x7b,0x2d,0x2d,0,"KP_-",
0x79,0x2b,0x2b,0,"KP_+",
0xe05a,0xff,0xff,0,"KP_EN",
0x71,0x2e,0x2e,0,"KP_.",
0x70,0x30,0x30,0,"KP_0",
0x69,0x31,0x31,0,"KP_1",
0x72,0x32,0x32,0,"KP_2",
0x7a,0x33,0x33,0,"KP_3",
0x6b,0x34,0x34,0,"KP_4",
0x73,0x35,0x35,0,"KP_5",
0x74,0x36,0x36,0,"KP_6",
0x6c,0x37,0x37,0,"KP_7",
0x75,0x38,0x38,0,"KP_8",
0x7d,0x39,0x39,0,"KP_9",//97
0xe037,0xff,0xff,0,"Power",
0xe03f,0xff,0xff,0,"Sleep",
0xe05e,0xff,0xff,0,"Wake",
0,0xff,0xff,0,0,//101
};
#defineKEY_LSHIFT_MASK(0x12)
#defineKEY_RSHIFT_MASK(0x59)
#defineKEY_CAPS_MASK(0x58)
#defineKEY_NUM_MASK(0x77)
#defineKEY_SCROLL_MASK(0x7e)
#defineKEY_LSHIFT_INDEX(0)
#defineKEY_RSHIFT_INDEX
(1)
#defineKEY_CAPS_INDEX
(2)
#defineKEY_NUM_INDEX(3)
KEYBOARD_STRUCTkeys_lut[]=
{
KEY_LSHIFT_MASK,0,0,0,0,//L_shift
KEY_RSHIFT_MASK,0,0,0,0,//R_shift
KEY_CAPS_MASK,0,0,0,0,//caps
KEY_NUM_MASK,0,0,0,0,//num
0,0,0,0,0,
};
/*************************************************/
voidPS2_K_Restart(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_CLK_BASE,OUT);
//clkanddatadirectionisoutput
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_DAT_BASE,OUT);
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE,0);
//driveclkanddatalow总线初始化
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,1);//为1不请求发送
usleep(200);
}
alt_u8ps2_K_input(void)//键盘输出
{
alt_u16i,dat;
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_CLK_BASE,IN);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_DAT_BASE,IN);
for(i=0;i<11;i++)
{
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringClocklow.
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01));
//WaitforthedevicetobringClockHigh.
dat>>=1;
if(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE))
dat|=0x200;//初始位为0,屏蔽
}
returndat&0xff;
return;
}
alt_u8LightFlag;
alt_8ps2_K_getch(void)//键盘接收
{
alt_u16i;
alt_u8status,ps2_dat;
alt_8mchar;
ps2_dat=ps2_K_input();
//printf("0x%x\n",ps2_dat);
if(ps2_dat==0xf0)//断码
{
ps2_K_input();
return0xff;
}
else//通码
{
for(i=0;i<50;i++)
if(ps2_dat==key1_lut[i].mask)
mchar=key1_lut[i].value;
returnmchar;
}
}
Voidps2_K_command(alt_u8cmd)//键盘指令
{
alt_u16i,j;
//MastertoI/O
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_CLK_BASE,OUT);
//clkanddatadirectionisoutput
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_DAT_BASE,OUT);
//为1输出
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE,0);
//启始位driveclkanddatalow
usleep(200);//拉低clkdata
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,0);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_CLK_BASE,IN);
//ReleasetheClockline.
usleep(10);
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringtheClocklinelow.
for(i=0,j=0;i<8;i++)//写数据
{
if(cmd&0x01)//Set/resettheDatalinetosendthefirstdatabit.
{
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,1);
j++;//校验用
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,0);
}
cmd>>=1;
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01));
//WaitforthedevicetobringClockhigh.
usleep(20);
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringClocklow.
usleep(20);
}
if(!
(j&0x01))//奇0偶1
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,1);
//发校验位Sendparitybit
else
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,0);
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01));
//WaitforthedevicetobringClockhigh.
usleep(20);
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringClocklow.
usleep(20);
IOWR_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE,1);
//发停止位Sendstopbit
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01));
//WaitforthedevicetobringClockhigh.
usleep(20);
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringClocklow.
usleep(20);
IOWR_ALTERA_AVALON_PIO_DIRECTION(PS2_K_DAT_BASE,IN);;
//ReleasetheDataline.
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE)&0x01);
//WaitforthedevicetobringDatalow.
while(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01);
//WaitforthedevicetobringClocklow.
usleep(20);
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_CLK_BASE)&0x01));
//WaitforthedevicetobringClockhigh.
while(!
(IORD_ALTERA_AVALON_PIO_DATA(PS2_K_DAT_BASE)&0x01));
//WaitforthedevicetobringDatahigh.
}
Kb.h
#ifndefKB_H_
#defineKB_H_
#include
#include
#include
#include"system.h"
#include"alt_types.h"
/**********************************************/
#defineOUT1
#defineIN0
#defineKEY_UP0
#defineKEY_DOWN1
typedefstruct_KEYBOARD_STRUCT//结构类型
{
alt_u16mask;
alt_u8value;
alt_u8up_value;
alt_u8state;
alt_8*desc;
}KEYBOARD_STRUCT;//名字
voidPS2_K_Restart(void);
alt_u8ps2_K_input(void);
alt_8ps2_K_getch(void);
Voidps2_K_command(alt_u8cmd);
#endif/*KB_H_*/
Main.c
#include"kb.h"
#include"altera_avalon_pio_regs.h"
#include
#include
#include
#include
#include"system.h"
#defineucharunsignedchar
/***********************************************/
VoidWriteDataLCM(ucharWDLCM);
VoidWriteCommandLCM(ucharWCLCM);
//ucharReadDataLCM(void);
//ucharReadStatusLCM(void);
VoidLCMInit(void);
VoidDisplay(uchar*p);
//voidDelay(intcnt);
uchartab1[]={"KeyboardTest"};
uchartab2[]={""};
ucharkey;
/***********************************************/
intmain(void)
{
uchari=0;
printf("\nPS/2KeyboardtesttoFPGABoard!
\n");
ps2_K_command(0xff);//复位键盘
LCMInit();
WriteCommandLCM(0x80);//首行初址
usleep(10000);
Display(tab1);
while
(1)
{
usleep(100);
PS2_K_Restart();
key=ps2_K_getch();//读取键值
if(key<0x80)
{
tab2[15]=key;
WriteCommandLCM(0xc0);//末行初址
usleep(10000);
Display(tab2);
for(i=0;i<=14;i++)
{
tab2[i]=tab2[i+1];
}
}
}
return0;
}
//写数据
voidWriteDataLCM(ucharWDLCM)
{
usleep(10000);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_E_BASE,0);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_BASE,1);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RW_BASE,0);
usleep(10000);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_E_BASE,1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DATA_BASE,0xff);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_BASE,WDLCM);
IOWR_ALT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PS2kb