ARM接ps2键盘

elong2004 2007-06-28 05:49:05
/* 此程序是为Ps/2键盘控制上位机程序,用于采集键盘数据和发送键盘控制信号 */

#define PS2_CLK_SET(x) /* 0=输入 1=输出 2=释放状态 */
#define PS2_DATA_SET(x) /* 0=输入 1=输出 2=释放状态 */
#define PS2_CLK(x)
#define PS2_DATA(x)
#define PS2_DELAY(x)
#define PS2_STATE_CLK /* 读时钟线状态 */
#define PS2_STATE_DATA /* 读数据线状态 */

typedef unsigned char U8;
typedef int INT32;

/* 主机向键盘发送一个字节数据 */
void Ps2_SendData(U8 data)
{
INT32 i;
U8 j,k;

/* 时钟拉低100微妙 */
PS2_CLK_SET(1); // 设置为输出
PS2_CLK(0);
PS2_DELAY(100);
/* 数据线拉低 */
PS2_DATA(0);
/* 释放时钟线 */
PS2_CLK_SET(2); // 设置为释放状态

/* 送8位数据 */
k = 0;
for(i=0;i<8;i++)
{
// 这里的while会不会造成死循环???
while(PS2_STATE_CLK); // 等待时钟拉低
j = (data<<i) & 0x1;
k = k ^ j;
PS2_DATA(j);
while(!PS2_STATE_CLK); // 等待时钟拉高,
}
// 发送奇效验
while(PS2_STATE_CLK);
PS2_DATA(k);
while(!PS2_STATE_CLK);

// 释放数据线
PS2_DATA_SET(2);

while(PS2_STATE_DATA); // 等待数据拉低
while(PS2_STATE_CLK); // 等待时钟拉低

// 等待设备释放数据和时钟,
// 这里怎样才能判断数据和时钟线被释放掉???


}
// 问题...
...全文
342 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Great_Bug 2007-07-01
  • 打赏
  • 举报
回复
最后不要用软件来等键盘的信号了,太浪费CPU了。

用个PLD吧。
elong2004 2007-06-30
  • 打赏
  • 举报
回复
关键还有后面的第2问
上面写错了

ps2->istimeout = 1;
while(ps2->istimeout & PS2_STATE_DATA);
elong2004 2007-06-30
  • 打赏
  • 举报
回复
是不是加个全局状态,定时器触发时修改状态
while(ps2->istimeout);
elong2004 2007-06-30
  • 打赏
  • 举报
回复
不好意思,没有经常关注帖子,谢谢!

不过我觉得这里等待设备时钟变化本来就是很短的时间了,还能拆分成异常的方式来做吗?
呵呵,请大家指点一下,这种方式的实现!
lbing7 2007-06-28
  • 打赏
  • 举报
回复
1.里面的while会不会造成死循环???比如键盘坏了死机什么的

会的哈...

你也可以加入定时机制什么的去做个异常处理...

elong2004 2007-06-28
  • 打赏
  • 举报
回复
1.里面的while会不会造成死循环???比如键盘坏了死机什么的
2.这里怎样才能判断数据和时钟线被释放掉???

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧