|
楼主 |
发表于 2010-8-6 10:40:15
|
显示全部楼层
回复【40楼】wkman 鱼片
-----------------------------------------------------------------------
38楼 tear: 我是廊坊师范的, 呵呵
我用的手柄是那种很老的在电视上玩的游戏机手柄(魂斗罗,忍者龟,超级玛丽...), 几块钱一个,应该快淘汰了.
上面有9个引脚,上边5个, 下边4个, 有4个线是起固定作用的, 剩下5根线是电源+,-,CP,D,RST. 那引脚排列哈~~等下我研究研究,
再把引脚图传上来. 和单片机相连的就是那3个线, 时序和CD4017类似, 先给RST复位信号, 再依次通过CP送8个脉冲, 各个按键的
状态就依次在数据线D上输出. 各个键可以同时按, 互不相关. 下面是读键盘程序, 返回当前键值, 不是标准C语言有些稀奇古怪的语法, 反正大体意思大家一看就懂,很容易改到Keil上的.
//游戏手柄元件,返回当前按键值, 为1表示对应键按下.
//这个是库函数的代码,所以三个控制引脚定位到一个中间元件上
unit game_pad
{
//初始化
public void init()
{
d = high;
cp = low;
reset = high;
}
//读取键盘按键
public uint8 read()
{
uint8 key_data;
reset = high;
loop( 8 ) {
key_data <<= 1;
key_data.0 = d;
reset = low;
cp = high;
cp = low;
}
return key_data;
}
//键盘枚举值, 用相与判零的方式检测按下
public const uint8 right = 0b0000_0001;
public const uint8 left = 0b0000_0010;
public const uint8 down = 0b0000_0100;
public const uint8 up = 0b0000_1000;
public const uint8 start = 0b0001_0000;
public const uint8 select = 0b0010_0000;
public const uint8 a = 0b0100_0000;
public const uint8 b = 0b1000_0000;
//手柄信号线定义
bit cp = @game_pad_port.cp;
bit d = @game_pad_port.d;
bit reset = @game_pad_port.reset;
}
//接口,这个元件类型是由用户定义的,根据具体的硬件连接设置端口
unit game_pad_port
{
bit cp = @sfr.P1.0;
bit d = @sfr.P1.1;
bit reset = @sfr.P1.2;
}
原来制表符显示不了啊.. |
|