51单片机模拟PS2协议制作5X5矩阵工业键盘 - 51单片机 - 电子工程世界网
51单片机模拟PS2协议制作5X5矩阵工业键盘
14:19:20来源: eefocus
根据客户的要求利用制作一个小的工控键盘,将下面对应的键值发送到电脑显示,利用的协议就是PS2,单片机型号为,晶振为12M;
#include "PS2.H"
BYTE PS2RecChar=0xCC;
BOOL KeyBoardFlag=FALSE;
#define Key_line P0&//键盘行入口
#define Key_list P2&//键盘列入口
#define PS2_1&&&&& 0& //16
#define PS2_0&&&&& 1&& //45
#define PS2_6&&&&& 2&//36
#define PS2_5&&&&& 3& //2e
#define PS2_4&&&&& 4&& //25
#define PS2_3&&&&& 5&&& //26
#define PS2_2&&&&& 6&&& //1e
#define PS2_7&&&&& 7&&& //3d
#define PS2_8&&&&& 8&&& //3e
#define PS2_9&&&&& 9&&& //46
#define PS2_dec&&& 10&&& //4e
#define PS2_eq&&&& 11&&& //55
#define PS2_y&&&&& 12&&& //35
#define PS2_u&&&&& 13&&//3c
#define PS2_i&&&&& 14&& //43
#define PS2_o&&&&& 15&& //44
#define PS2_p&&&&& 16&&//4d
#define PS2_q&&&&& 17&&& //15
#define PS2_w&&&&& 18&&//1d
#define PS2_e&&&&& 19&&& //24
#define PS2_r&&&&& 20&&& //2d
#define PS2_t&&&&& 21&&& //2c
//第二套键盘码
unsigned char PS2Value[22]={0x16,0x45,0x36,0x2e,0x25,0x26,0x1e,0x3d,0x3e,0x46,0x4e,0x55,0x35,0x3c,
&&&&&&&&0x43,0x44,0x4d,0x15,0x1d,0x24,0x2d,0x2c};
unsigned char Key_Press(void)
unsigned temp3;
&unsigned char flag=0;&& //设定标志位
&Key_line=0xe0;&&&& && //将P0口低5位全部设置位0
&temp3=Key_&&&& //读取P2口的状态,若果P2口的值temp3:(temp3&0xff)!=0xff成立,表示有键按下
&if(((temp3&0xff)!=0xff))& //有键按下条件判断
&&& flag=1;
&&& //Key_line=0XFF;&&&& //清零键盘行端口
&&& Key_list=0&&& &&& //清零键盘列端口
&&& flag=0;&&&&&&&&& //无键按下标志
void delay(unsigned int ms)
&unsigned int i,j;
&for(i=i>0;i--)
&&for(j=100;j>0;j--);
unsigned char Key_Scan(void)
&unsigned char temp2=0,temp3=0; //temp2用来保存行键盘数据,temp3保存列键盘数据
&unsigned char temp=0,flag=0;&&&& //函数返回值temp
&unsigned char i=0,key=0;&& //i位循环控制变量,给行送数据,key保存检测键盘按下的标志位
&if((key=Key_Press())!=0)&& //判断是否有键按下
&&delay(30);
&&if((key=Key_Press())!=0)
&&&&for(i=0x01;i!=0x20;i=i<<1)& //循环控制变量,扫描5行
&&&&&Key_line=(~i);&&&&&&& //将循环控制变量赋值行地址
&&&&&temp2 =(~i);&&&& //保存行地址
&&&&&//temp2=Key_
&&&&&temp3=Key_&&&&&&//读取列地址数据
&&&&&switch((temp3&0xff))&//判断是那列有键按下
&&&&&&case 0xfe:&&&//第一列有键按下
&&&&&&&switch((temp2&0xff)) //判断第一列有键按下时,对应的行按键&&&
&&&&&&&&case 0xfe:
&&&&&&&&&&temp=23; & //第一行有键按下
&&&&&&&&&&& //该键无键盘号定义
&&&&&&&&case 0xfd:& & //第二行有键按下
&&&&&&&&&&temp=PS2_6;flag=1;& //对应键值位PS2键盘的数字6,对应的键盘扫描码为0x36&
&&&&&&&&&&
&&&&&&&&case 0xfb:& & //第三行有键按下
&&&&&&&&&&temp=PS2_7; flag=1;//对应键值位PS2键盘的数字7,对应的键盘扫描码为0x3d&
&&&&&&&&&&
&&&&&&&&case 0xf7:& &&//第四行有键按下
&&&&&&&&&&temp=PS2_y; flag=1; //对应键值位PS2键盘的字母y,对应的键盘扫描码为0x35
&&&&&&&&&&
&&&&&&&&case 0xef:& &&//第五行有键按下
&&&&&&&&&&temp=PS2_flag=1;& //对应键值位PS2键盘的字母q,对应的键盘扫描码为0x15
&&&&&&&&&&
&&&&&&case 0xfd:&&
&&&&&&&switch((temp2&0xff))&&&& // 第二列有键按下
&&&&&&&&case 0xfe:& && //第一行有键按下
&&&&&&&&&&temp=23;& //该键无键盘号定义
&&&&&&&&&&&&&& &&
&&&&&&&&case 0xfd:& && //第二行有键按下
&&&&&&&&&&temp=PS2_5;flag=1;& //对应键值位PS2键盘的数字5,对应的键盘扫描码为0x2e
&&&&&&&&&&
&&&&&&&&case 0xfb:& &&& //第三行有键按下
&&&&&&&&&&temp=PS2_8;&flag=1;& //对应键值位PS2键盘的数字8,对应的键盘扫描码为0x8e
&&&&&&&&&&
&&&&&&&&case 0xf7:& &&& //第四行有键按下
&&&&&&&&&&temp=PS2_u;flag=1;&& //对应键值位PS2键盘的字母u,对应的键盘扫描码为0x3c
&&&&&&&&&&
&&&&&&&&case 0xef:& &&&& //第五行有键按下
&&&&&&&&&&temp=PS2_ flag=1;& //对应键值位PS2键盘的字母w,对应的键盘扫描码为0x1d
&&&&&&&&&&
&&&&&&case 0xfb:
&&&&&&&switch((temp2&0xff))&&& // 第三列有键按下
&&&&&&&&case 0xfe:& &&&//第一行有键按下
&&&&&&&&&&temp=23;&&//该键无键盘号定义
&&&&&&&&&&&&&& &&
&&&&&&&&case 0xfd:& &&&//第二行有键按下
&&&&&&&&&&temp=PS2_4;&flag=1;&//对应键值位PS2键盘的数字4,对应的键盘扫描码为0x25
&&&&&&&&&&
&&&&&&&&case 0xfb:& &&&//第三行有键按下
&&&&&&&&&&temp=PS2_9;&flag=1;&//对应键值位PS2键盘的数字9,对应的键盘扫描码为0x46
&&&&&&&&&&
&&&&&&&&case 0xf7:& &&&//第四行有键按下
&&&&&&&&&&temp=PS2_i;&flag=1;&//对应键值位PS2键盘的字母i,对应的键盘扫描码为0x43
&&&&&&&&&&
&&&&&&&&case 0xef:& &&& //第五行有键按下
&&&&&&&&&&temp=PS2_e; flag=1;&& //对应键值位PS2键盘的字母e,对应的键盘扫描码为0x24
&&&&&&&&&&
&&&&&&case 0xf7:
&&&&&&&switch((temp2&0xff))&&&&& // 第四列有键按下
&&&&&&&&case 0xfe:& &&& //第一行有键按下
&&&&&&&&&&temp=PS2_1;&flag=1;& //对应键值位PS2键盘的数字1,对应的键盘扫描码为0x16
&&&&&&&&&&&&&& &&
&&&&&&&&case 0xfd:& &&& //第二行有键按下
&&&&&&&&&&temp=PS2_3;&flag=1;& //对应键值位PS2键盘的数字3,对应的键盘扫描码为0x26
&&&&&&&&&&
&&&&&&&&case 0xfb:& &&& //第三行有键按下
&&&&&&&&&&temp=PS2_flag=1;& //对应键值位PS2键盘的减号,对应的键盘扫描码为0x4e
&&&&&&&&&&
&&&&&&&&case 0xf7:& &&&& //第四行有键按下
&&&&&&&&&&temp=PS2_o;&flag=1;&& //对应键值位PS2键盘的字母o,对应的键盘扫描码为0x44
&&&&&&&&&&
&&&&&&&&case 0xef:& &&& //第五行有键按下
&&&&&&&&&&temp=PS2_r; flag=1; && //对应键值位PS2键盘的字母r,对应的键盘扫描码为0x2d
&&&&&&&&&&
&&&&&&&}&&&&&&&&
&&&&&&case 0xef:
&&&&&&&switch((temp2&0xff))&&&&& // 第五列有键按下
&&&&&&&&case 0xfe:& &&&&&& //第一行有键按下
&&&&&&&&&&temp=PS2_0;&flag=1;&&&//对应键值位PS2键盘的数字0,对应的键盘扫描码为0x45
&&&&&&&&&&&&&& &&
&&&&&&&&case 0xfd:& &&&&&& //第二行有键按下
&&&&&&&&&&temp=PS2_2;&flag=1;&&&& //对应键值位PS2键盘的数字2,对应的键盘扫描码为0x1e
&&&&&&&&&&
&&&&&&&&case 0xfb:& &&&&&//第三行有键按下
&&&&&&&&&&temp=PS2_flag=1;&&&& //对应键值位PS2键盘的等号,对应的键盘扫描码为0x55
&&&&&&&&&&
&&&&&&&&case 0xf7:& &&&&&//第四行有键按下
&&&&&&&&&&temp=PS2_p;flag=1;&&&& //对应键值位PS2键盘的字母p,对应的键盘扫描码为0x4d
&&&&&&&&&&
&&&&&&&&case 0xef:& &&&&& //第五行有键按下
&&&&&&&&&&temp=PS2_t;flag=1; &&&//对应键值位PS2键盘的字母t,对应的键盘扫描码为0x2c
&&&&&&&&&&
&&&&//P0=0XFF;&&&&&&&&& //每当检测完一行时清零行端口和列端口
&&&&//P2=0
&&&&if((key=Key_Press())!=0);
&&&&delay(30);
&else& temp=23;&&&& //无键按下返回数字23,对应数组内的0;
&if(flag==1)
&&&&//返回按键扫描值
&&&& return 23;
void OnKeyBoardOnline(BOOL i)
&KeyBoardFlag=i;
//---------------------------------------------------------------------------
void OnPS2ReceiveChar(BYTE ReceChar,BOOL P)
&BOOL ParityBit=0;
&ACC=ReceC
&ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
&if(P==ParityBit);
&PS2RecChar=ReceC
//---------------------------------------------------------------------------
void OnPS2SendChar(BYTE dat)
&BOOL ParityB
&ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
&CLSSIGNAL();
&CT_KB=OFF;
&H_DATA=0;Delay10us();//start bit
&Delay10us();
&Delay30us();
&for(i=0;i<8;i++)
&&if(dat&0x01==0x01){H_DATA=1;Delay10us();}
&&else {H_DATA=0;Delay10us();}
&&dat>>=1;
&&H_CLK=1;
&&Delay10us();
&&H_CLK=0;
&&Delay30us();
&H_DATA=ParityBDelay10us();//parity bit
&Delay10us();
&Delay30us();
&H_DATA=1;Delay10us();//stop bit
&Delay10us();
&Delay30us();
&H_DATA=1;
&CT_KB=ON;
&Delay30us();
//---------------------------------------------------------------------------
void ExternInterrupt0(void)
&BOOL ParityBit=0,CLKFlag=1;
&BYTE i=0,j=8,dat=0x00;
&while(CLKFlag)
&&if(H_CLK==1)CLKFlag=0;
&&if(i>0xEE)
&while(j--)//延时等待大键盘的动作
&&for(i=0;i<0x88;i++)//检查是否有数据处理&0x88
&&&if(H_CLK==0)//有动作则是大键盘存在
&&&&OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
&&&&IE0=0;
&&&&EX0=1;
&&&&//存在的话置标志位,并返回
&OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
&//转到接收
&for(i=0;i<8;i++)//read 8bit
&&Delay30us();
&&H_CLK=0;&&&&&&&&&&&
&&Delay30us();
&&H_CLK=1;
&&dat=dat>>1;&&&
&&if(H_DATA)dat|=0x80;
&&if(H_CLK==0){&&}//如果时钟被拉低,则有错误发生
&&&&&&&&&&
&Delay30us();
&H_CLK=0;&&&&&&&&&&&
&Delay30us();
&if(H_DATA)ParityBit=1;
&else ParityBit=0;
&Delay30us();
&H_CLK=0;&&&&&&&&&&&
&Delay30us();
&H_CLK=1;//STOP BIT H_DATA 0 ERR
&Delay10us();
&H_DATA=0;&//ACK bit
&Delay10us();
&Delay30us();Delay30us();
&Delay30us();
&H_DATA=1;
&OnPS2ReceiveChar(dat,ParityBit);
//---------------------------------------------------------------------------
void ProcessPS2(void)
&if(KeyBoardFlag==FALSE)//大键盘不存在
&&if(PS2RecChar==0xF3)//1
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0x00)//11
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0x02)//111
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0x20)//1111
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xED)//2
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xF0)//3
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xF2)//4
&&&OnPS2SendChar(0xFA);
&&&Delay30us();
&&&OnPS2SendChar(0xAB);
&&&Delay30us();
&&&OnPS2SendChar(0x83);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xEF)//5
&&&OnPS2SendChar(0xFA);
&&&Delay30us();
&&&OnPS2SendChar(0xBF);
&&&Delay30us();
&&&OnPS2SendChar(0xB0);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xF3)//6
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xFE)//7 //resend
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xEE)//8
&&&OnPS2SendChar(0xEE);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xEE)//9
&&&OnPS2SendChar(0xEE);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xF1)//10
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xF4)//11
&&&OnPS2SendChar(0xFA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xAA)//12
&&&OnPS2SendChar(0xAA);
&&&PS2RecChar=0xCC;
&&else if(PS2RecChar==0xFF)//13
&&&OnPS2SendChar(0xFA);
&&&Delay30us();
&&&OnPS2SendChar(0xAA);
&&&Delay30us();
&&&PS2RecChar=0xCC;
//---------------------------------------------------------------------------
void PS2Init(void)
&IT0=0;&//低电平触发中断
//---------------------------------------------------------------------------
extern void ProcessPS2(void);
extern void PS2Init(void);
void main(void)
&PS2Init();
&ProcessPS2();
&&tem=Key_Scan();
&&switch(tem&0xff)
&&&case 23 :
&&&default:
&&&&OnPS2SendChar(PS2Value[tem]);
&&//开机应答,使电脑能识别到键盘
&&//other code
仿真电路图,该电路未连接PS2,但可通过灯观察每个按键按下之后的键值返回知否和第二套键盘码对应一致
第二套键值码对应表:
关键字:&&&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或***通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。查看: 13085|回复: 102
【PS2】【原创】铁甲人:地球静止之日日版【ISO】(115永久)
猥币160910
在线时间5879 小时
阅读权限150
帖子猥币巴士票
本帖最后由 acehayato 于
14:08 编辑
游戏编号:SLPM-62526
中文名称:铁甲人:地球静止之日
日文名称:ジャイアント·ロボ THE ANIMATION 地球が静止する日
英文名称:Giant Robo: The Animation - Chikyuu ga Seishisuru Hi
游戏平台:PS2
游戏类型:FTG
游戏制式:NTSC-J
游戏版本:日版
游戏语言:日语
游戏载体:DVD5*1
游戏人数:1-2人
记忆容量:64KB以上
制作发行:D3
发售日期:日
发售地区:日本
适合年龄:全年龄
下载地址:
游客,如果您要查看本帖隐藏内容请
本帖子中包含更多资源
才可以下载或查看,没有帐号?
猥币2145497
在线时间217 小时
阅读权限100
帖子猥币巴士票
封面挂了貌似....
猥币102139
在线时间649 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1165, 距离下一级还需 835 积分
由 D3 Publisher 开发,以日本名漫画家 衡山光辉 原作漫画最新改编卡通动画为基础所制作的 PS2 对战动作游
戏《Giant Robot:地球静止之日》,于 PlayStation 官方网站公布了游戏宣传影片,供玩家欣赏。
《Giant Robot:地球静止之日》是由衡山光辉(代表作:三国志、铁人 28 号)原作,知名卡通动画导演 今
川泰宏 执导的同名卡通动画为基础所制作,叙述继承了父亲遗留巨大机器人“GR-1”的 12 岁少年草间大作,与
国际POLICE机构的成员们,共同对抗神秘**“BF 团”的故事。
卡通动画版除了采用当年漫画原作的设定之外,还加入了许多衡山光辉其他名作漫画的人物,包括铁人 28 号
、水浒传、三国志,巴比伦二世...等漫画的人物,都被巧妙的结合到卡通动画的剧情中。
本次的改编游戏中,将有包括草间大作、银铃、幻夜...等,以及包括 GR-1、GR-2、银铃机器人、大怪球...
等卡通动画中的角色与机器人登场。游戏采取操作人物角色与操作机器人两种模式动态切换的方式进行,玩家需视
状况选择操作其中一方,当操作人物角色时,则以下达命令的方式来指挥机器人,操作机器人时则可以进行更精确
更细微的操控。
游戏模式分为三种,分别为依循故事剧情,操作草间大作与 GR-1,以打败由 BF 团幻夜所操作的大怪球为目
的的“战斗模式”,以及可自由选择机器人进行一对一战斗,亦可两人同游的“对战模式”,以及欣赏各种机器人
的“鉴赏模式& &”
猥币105146
在线时间707 小时
阅读权限80
帖子猥币巴士票
猥风八面 Lv.8, 积分 22176, 距离下一级还需 7824 积分
女主的衣服是天朝买的么!
猥币2143406
在线时间332 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1298, 距离下一级还需 702 积分
这货不是超级机器人大战ALPHA 里的那个很笨重的机器人嘛
猥币2143406
在线时间332 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1298, 距离下一级还需 702 积分
记得有一招,叫全力一拳很暴力攻击高
猥币100232
在线时间12 小时
帖子猥币巴士票
猥不足道 Lv.2, 积分 62, 距离下一级还需 138 积分
thk a&&lot
猥币625338
在线时间95 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1195, 距离下一级还需 805 积分
猥币100373
在线时间5 小时
帖子猥币巴士票
猥不足道 Lv.2, 积分 94, 距离下一级还需 106 积分
纯支持!!!!!!!!!!!
猥币100160
在线时间91 小时
帖子猥币巴士票
猥不足道 Lv.2, 积分 125, 距离下一级还需 75 积分
最后幸存者【稀有成就】
恭喜你成为最后幸存者,奖励一颗……药丸?(***G区理想?四周年祭活动成就)
展会先锋【普通成就】
每当有游戏展会,我都有很多事情要做,根本停不下来!(参与任何游戏展会报道直播及其他相关内容制作)
上海欢迎你【光辉事迹】
湖赢湖赢,捏列湖赢,妹子跨类,基佬吸开!(参加过一次由论坛管理员或版主组织的上海线下聚会并和编辑/版主合影)
玩最大【稀有成就】
我是索狗,我自豪,特爽特牛逼!!(每月达标的PM组员)
S?P?Y【稀有成就】
呵呵想揭下我的面具看看我的真实身份吗?知道的人都死光了哦……(同时列名于3个以上用户组)
水元素【普通成就】
水、H2O、みず、water,额...总之怎么叫都行了
(累计发帖1000即可解锁)
浮云爱好者【普通成就】
一朵,两朵,三朵,呵呵呵… (累计获得1000朵浮云)
浮云收藏家【稀有成就】
已经收藏到这么多浮云了吗,不错嘛!(累计获得5000朵浮云)
管理团队【光辉事迹】
猥皮大本营管理团队特有的红色令牌。象征权力与责任的契约之证。(担任过论坛各级版主)
常客【普通成就】
《我的业余生活》从前有一个论坛叫TGBUS…(在线时间超过1000小时)
正版党【光辉事迹】
不是咱要晒正版,实在是游戏太好玩(自曝拥有任意平台10款以上的正版游戏)
浮云鉴定砖家【光辉事迹】
浮云对你来说,已经没有秘密了!(累计获得10000朵浮云)
略疼【稀有成就】
(续《我的业余生活》2)我在那里…消磨了大量的… (在线时间超过5000小时)
Powered by