搜索
bottom↓
回复: 192

发个51模拟ps2键盘的程序,经过实际应用是没问题的。(期望给个酷)

  [复制链接]

出0入0汤圆

发表于 2008-5-21 21:11:41 | 显示全部楼层 |阅读模式
点击此处下载 ourdev_289823.rar(文件大小:93K) (原文件名:PS2.rar)

已修改好错误

//用法-以下文件在main.c--------------------------------------------------------------------------
//把PS2.C Delay.asm加入工程
extern void ProcessPS2(void);
extern void PS2Init(void)
void main(void)
{
        //往PC上发按键使用OnPS2SendChar();
        //OnPS2SendChar(0x15);//Q//发送通码

        //OnPS2SendChar(0xF0);
        //OnPS2SendChar(0x15);//Q//发送断码
        PS2Init();
        while(1)
        {
                ProcessPS2();//开机应答,使电脑能识别到键盘
                //other code
        }
}

出0入0汤圆

发表于 2008-5-21 21:19:11 | 显示全部楼层
不错

出0入0汤圆

 楼主| 发表于 2008-5-21 21:25:20 | 显示全部楼层
附上电路图

(原文件名:未命名副本.jpg)

出0入0汤圆

发表于 2008-5-22 08:33:56 | 显示全部楼层
8错,以前的好像都没有注意开机应答,不能真正当pc键盘用。

出0入0汤圆

 楼主| 发表于 2008-5-22 08:37:39 | 显示全部楼层
对啊,网上我找了好多程序都是没有开机应答的,要么就是模拟host的,而且还不能用,不过还是可以参考

出0入0汤圆

发表于 2008-5-22 08:41:06 | 显示全部楼层
有错误,少hardware.h文件。。。

(原文件名:aaa.JPG)

出0入0汤圆

 楼主| 发表于 2008-5-22 08:44:06 | 显示全部楼层
与hardware.h无关
我整理的时候忘了删除
删除即可

出0入0汤圆

发表于 2008-5-22 08:45:45 | 显示全部楼层
to  jim166783 :
还是把你完整的keil工程发上来吧,看是漏了什么东西。。。。晕

出0入0汤圆

发表于 2008-5-22 08:51:30 | 显示全部楼层
BYTE
FASLE

你的这几个定义在哪里?一编译这个就报错,
BYTE应该是
#define BYTE unsigned char
#define 。。。。。

这样吧,没有这样的语句不完整的。

出0入0汤圆

 楼主| 发表于 2008-5-22 08:54:44 | 显示全部楼层
好的
点击此处下载 ourdev_289822.rar(文件大小:119K) (原文件名:TestPS2prj.rar)

出0入0汤圆

 楼主| 发表于 2008-5-22 08:55:13 | 显示全部楼层
都弄好了

出0入0汤圆

发表于 2008-5-22 09:01:40 | 显示全部楼层
楼主,应该把PS/2协议也放在上面

出0入0汤圆

发表于 2008-5-24 08:36:32 | 显示全部楼层
lz,可以正确编译了,我这里显示3个warning,不过可以用!呵呵。楼上,ps2协议论坛一搜索一大把。

出0入0汤圆

发表于 2008-5-24 08:49:04 | 显示全部楼层
谢谢,先收藏

出0入0汤圆

 楼主| 发表于 2008-5-24 23:11:30 | 显示全部楼层
呵呵

出0入0汤圆

发表于 2008-5-25 14:16:28 | 显示全部楼层
谢谢!收藏备用,正想搞一个VOD的遥控接收器

出0入296汤圆

发表于 2008-5-25 14:19:29 | 显示全部楼层
想给你送个裤子……但是发现没有这个权限……

出0入0汤圆

 楼主| 发表于 2008-5-25 14:48:28 | 显示全部楼层
呵呵,有大名鼎鼎的傻孩子来捧场已经心满意足了,^_^

出0入0汤圆

发表于 2008-5-28 14:14:55 | 显示全部楼层
不错,支持一下~!

出0入0汤圆

发表于 2008-5-29 14:38:51 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2008-8-2 16:13:47 | 显示全部楼层
支持支持

出0入0汤圆

发表于 2008-8-2 16:41:34 | 显示全部楼层
不错,谢楼主。

出0入0汤圆

发表于 2008-8-2 17:17:45 | 显示全部楼层
谢谢!收藏

出0入0汤圆

发表于 2008-8-3 20:46:12 | 显示全部楼层
不懂 ,但是不错啊 顶!!

出0入0汤圆

发表于 2008-8-3 23:39:00 | 显示全部楼层
不错,模拟PS2键盘的程序不多见。

出0入0汤圆

发表于 2008-11-29 19:15:49 | 显示全部楼层
看看。支持下

出0入0汤圆

发表于 2008-11-30 00:01:30 | 显示全部楼层
太感谢了.之前还在为这个苦恼.

出0入0汤圆

发表于 2008-11-30 00:14:11 | 显示全部楼层
不错,收藏了

出0入0汤圆

发表于 2009-4-29 10:03:25 | 显示全部楼层
您好:
    可以把整个电路图和工程填上吗?参考一下。

出0入0汤圆

发表于 2009-4-30 09:14:05 | 显示全部楼层
可以把整个电路图和工程填上吗?参考一下

出0入0汤圆

发表于 2009-4-30 13:31:56 | 显示全部楼层
记号一下   是好东西啊  哈哈

出0入0汤圆

发表于 2009-4-30 13:38:57 | 显示全部楼层
这个程序我测试过了,发送SHIFT的时候会有问题.无法断开SHIFT.也可能是我应用的问题吧.

出0入0汤圆

发表于 2009-5-2 00:40:02 | 显示全部楼层
可以把整个电路图和工程填上吗?参考一下。

出0入0汤圆

发表于 2009-5-4 10:14:08 | 显示全部楼层
mark。

出0入0汤圆

发表于 2009-6-20 12:35:32 | 显示全部楼层
楼主这个好像没有键盘扫描的处理程序啊

出0入0汤圆

发表于 2009-6-20 18:22:33 | 显示全部楼层
好东东,先收藏

出0入0汤圆

发表于 2009-6-20 18:45:24 | 显示全部楼层
支持~!

出0入0汤圆

发表于 2009-10-6 14:45:56 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-10-6 17:38:05 | 显示全部楼层
看看,顶一下!

出0入0汤圆

发表于 2009-10-6 18:09:19 | 显示全部楼层
我也想弄明白啊!

出0入0汤圆

发表于 2009-10-10 21:48:25 | 显示全部楼层
记号。

出0入0汤圆

发表于 2009-10-10 23:35:24 | 显示全部楼层
不错,顶下

出0入0汤圆

发表于 2009-10-10 23:46:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-27 19:26:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-24 14:51:43 | 显示全部楼层
哪位大侠能把这段汇编转成c代码吗?主要是晶振频率比较少见,想改又不懂汇编,呵呵。
        H_DATA                BIT         P3.2
        H_CLK                BIT                P3.4

        ?PR?DELAY30US SEGMENT CODE
        PUBLIC DELAY30US
        RSEG ?PR?DELAY30US
       
        ;        abc        XDATA        0A00H
       
;35.8US
DELAY30US:
                PUSH        05H           ;2
                MOV                r5,#50        ;25
DE30S1:
                DJNZ        r5,DE30S1     ;2*14=28
                POP        05h           ;2
                RET
;******************************************************************
        ?PR?DELAY10US SEGMENT CODE
        PUBLIC DELAY10US
        RSEG ?PR?DELAY10US
;16.3US
DELAY10US:      
                PUSH        05H          ;2
                MOV     r5, #20       ;10
DE10S1:
                DJNZ    r5, DE10S1   ;5*2=10
                POP        05H             ;2
                RET

        ?PR?CLSSIGNAL SEGMENT CODE
        PUBLIC CLSSIGNAL
        RSEG ?PR?CLSSIGNAL
CLSSIGNAL:         
;WHEN SYSTEM SEND INFORMATION TO PINPAD, SEND STOP BIT AT END, THEN NEXT A
;SEND OPERATION. SO WAITTING STOP BIT FINISHED.
CLSL1:         
                PUSH    05H
CLSL1_U:
                MOV     R5, #6EH
CLSL2:  JNB     H_DATA, CLSL1_U
                JNB     H_CLK, CLSL1_U
                DJNZ    R5, CLSL2
                POP     05H
                RET

                END

出0入0汤圆

发表于 2010-1-25 10:05:45 | 显示全部楼层
记号,不错

出0入0汤圆

发表于 2010-1-25 13:28:30 | 显示全部楼层
good

出0入0汤圆

发表于 2010-1-25 16:57:39 | 显示全部楼层
看看。。

出0入0汤圆

发表于 2010-1-29 15:41:53 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-30 14:42:55 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-3-2 16:53:07 | 显示全部楼层
回复【楼主位】jim166783
-----------------------------------------------------------------------

正在设计 工控键盘
学习一下!

出0入0汤圆

发表于 2010-3-2 21:35:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-2 22:12:49 | 显示全部楼层
jh

出0入0汤圆

发表于 2010-3-3 18:36:28 | 显示全部楼层
楼主的程序,我昨天下载,今天试验,调试通过,在Windows XP记事本中,收到了来自MCU程序发送的字符。
(1)硬件连接附加说明如下:
//sbit H_DATA                =        P3^2;                //连接PS/2键盘插头(公头)的管脚Pin1
//sbit H_CLK                =        P3^4;                 //连接PS/2键盘插头(公头)的管脚Pin5
//sbit CT_KB                =        P1^4;                 //不用连接,不用2楼的那个附加电路。
//PS/2键盘插头(公头)朝向你自己,从左上角开始,依次是管脚5-3-1-2-4-6
//其中,Pin3是GND,Pin4是Vcc(+5V)

(2) main()函数作如下改造,以便于MCU自动发送字符,不需要按键扫描(这个需要以后自己补充):
程序打包,这是能运行的工程文件,运行在Keil c51 V9.01 (uV4,2010最新)
ourdev_536282.rar(文件大小:177K) (原文件名:TestPS2.rar)

!!!!!!!!! 谢谢楼主提供如此好程序 !!!!!!!!!

出0入0汤圆

发表于 2010-3-17 17:00:10 | 显示全部楼层
楼上的能不能把还是把你完整的keil工程发上上来?我的晶振是12M的,修改延时程序怎么不行,PC机识别不了键盘。

出0入0汤圆

发表于 2010-3-17 17:08:34 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2010-3-18 11:24:52 | 显示全部楼层
53楼的 char code dx516[3] _at_ 0x003B;没用啊。
能不能把整个keil工程发过来?
另外能否解释下面函数的作用:谢谢!!!!
extern void CLSSIGNAL(void);
        H_DATA                BIT         P3.2
        H_CLK                BIT                P3.4


        ?PR?CLSSIGNAL SEGMENT CODE
        PUBLIC CLSSIGNAL
        RSEG ?PR?CLSSIGNAL
CLSSIGNAL:         
;WHEN SYSTEM SEND INFORMATION TO PINPAD, SEND STOP BIT AT END, THEN NEXT A
;SEND OPERATION. SO WAITTING STOP BIT FINISHED.
CLSL1:         
                PUSH    05H
CLSL1_U:
                MOV     R5, #60H
CLSL2:  JNB     H_DATA, CLSL1_U
                JNB     H_CLK, CLSL1_U
                DJNZ    R5, CLSL2
                POP     05H
                RET

                END

出0入0汤圆

发表于 2010-3-18 22:57:43 | 显示全部楼层
回复【54楼】lixinjun1786
-----------------------------------------------------------------------
我先用22.1184M的晶振,可以检测到MCU模拟的键盘
12M晶振,要修改ASM文件的延时程序。我明天调试一个发在这里。

延时的要求就是CLK脉冲周期 T=高电平40us+低电平40us=~80us


另外,提醒一下:
PS2键盘鼠标要在PC机上电开机之前接到PS2接口上,在BIOS运行时就要检测键盘和鼠标。
只有这时检测到存在键盘鼠标,在Windows运行时才能成功。

为了试验方便,可以用一个USB转PS2口的转换线。要带芯片(好像是CSC0101A)的那种,有2个PS2口。这样不用频繁开关机。
这个USB驱动的PS2,有热插拔功能,PS2键盘鼠标电路可以在任何时间接上,它每隔一段时间都检测一下PS2接口。
不带芯片的转换头是不行的。

(原文件名:USB to PS2.jpg)

出0入0汤圆

发表于 2010-3-19 08:19:12 | 显示全部楼层
非常感谢楼上的兄弟!我看你的程序延时没有CLK脉冲周期 T=高电平40us+低电平40us=~80us ?能否留下联系方式?我想请教大虾。我的邮箱lixinjun1786@126.com

出0入0汤圆

发表于 2010-3-19 09:17:30 | 显示全部楼层
mark,收藏下

出0入0汤圆

发表于 2010-3-19 11:22:54 | 显示全部楼层
回复【57楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------
我一直感觉 高电平是10us低电平30us,希望解释一下。谢谢!
         H_DATA=ParityBit;Delay10us();//parity bit
        H_CLK=1;
        Delay10us();//感觉这个地方高电平10us
        H_CLK=0;
        Delay30us();//感觉这个高电平30us,一直不明白啊................

        H_DATA=1;Delay10us();//stop bit
        H_CLK=1;
        Delay10us();
        H_CLK=0;
        Delay30us();

出0入0汤圆

发表于 2010-3-19 11:24:07 | 显示全部楼层
回复【60楼】lixinjun1786
回复【57楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------
我一直感觉 高电平是10us低电平30us,希望解释一下。谢谢!
         H_DATA=ParityBit;Delay10us();//parity bit
H_CLK=1;
Delay10us();//感觉这个地方高电平10us
H_CLK=0;
Delay30us();//感觉这个低电平30us,一直不明白啊................
H_DATA=1;Delay10us();//stop bit
H_CLK=1;
Delay10us();
H_CLK=0;
Delay30us();
-----------------------------------------------------------------------

出0入0汤圆

发表于 2010-3-19 14:44:50 | 显示全部楼层
回复楼上以及在【54楼】提及的问题
-----------------------------------------------------------------------

DELAY30US:
                PUSH        05H           ;2
                MOV                r5,#5        ;延时常数?5 for 11.0592MHz
DE30S1:
                DJNZ        r5,DE30S1     ;2*14=28
                POP        05h           ;2
                RET
;******************************************************************
        ?PR?DELAY10US SEGMENT CODE
        PUBLIC DELAY10US
        RSEG ?PR?DELAY10US
;16.3US
DELAY10US:      
                PUSH        05H          ;2
                MOV     r5, #10       ;10 for 11.0592MHz
DE10S1:
                DJNZ    r5, DE10S1   ;5*2=10
                POP        05H             ;2
                RET



;关于高低电平延时时间问题:
;40us+40us是符合PS2协议的。原来的程序是楼主发来的,确实是如你所说,但是,可以用。
;为了通用性好,还是要按PS2协议规定作时序。

出0入0汤圆

发表于 2010-3-19 23:47:55 | 显示全部楼层
唉!使用汇编语言的人怎么那么少啊?

出0入0汤圆

发表于 2010-3-20 16:13:13 | 显示全部楼层
回复【62楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

谢谢HONY0411 小蜜蜂.能否将你编译通过的整个keil工程发过来(11.0592M)?

出0入0汤圆

发表于 2010-3-21 01:08:00 | 显示全部楼层
楼主有没有模拟PS2鼠标的啊?希望能给我发一个,谢谢了,我急用。我的邮箱zsy4.22@qq.com

出0入0汤圆

 楼主| 发表于 2010-3-21 07:18:11 | 显示全部楼层
#include <intrins.h>

void Delay30us(void)//for 11.0592MHz
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

void Delay10us(void)//for 11.0592MHz
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

确定延时的方法:
1、随便找一普通pc键盘,我用的是双飞燕的,先找到CLK、DATA、GND线
2、插到电脑上,找一示波器,按一个键看CLK的周期,记下来是xx us
3、修改Delay30us() Delay10us()实现xx us的功能即可
如果你的延时和普通pc键盘的延时是一样的话,兼容性会比较好,插到不同主板上都可以正常使用

出0入0汤圆

发表于 2010-3-21 09:05:04 | 显示全部楼层
回复【66楼】jim166783
-----------------------------------------------------------------------
非常感谢楼主,我是刚学单片机,有好多地方不懂,还望大虾指教。

什么键盘都应该符合ps2协议啊。你的意思是说不一定高电平为40us低电平为40us?
我看不出来高电平为40us低电平为40us,不知道哪句话是实现高电平40us,低电平40us?
不明白此函数的作用void CLSSIGNAL()及BYTE PS2RecChar=0xCC(为什么是0xcc?),
while(CLKFlag)
        {
                i++;
                if(H_CLK==1)CLKFlag=0;
                if(i>0xEE)////这里0xEE什么意思???????????????
                {
                        IE0=0;
                        EX0=1;
                        return ;
                }
        }

出0入0汤圆

发表于 2010-3-21 12:41:25 | 显示全部楼层
回复【62楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

小蜜蜂,我也是大连的,正好在弄这个键盘程序,可否留给联系方式,想请你帮忙搞定这里。这个程序我测试了。编译通过,就是不执行,估计是电路哪不对。我用的是18.432晶振,不知道为什么不行。难道晶振必须的用22的晶振?
估计可能是延迟时间的误差,18.432可能需要从新算。我是搞PC程序的,还是第一次搞51,希望大狭指点一些。
我的联系方式QQ:292507883

出0入0汤圆

发表于 2010-3-21 12:45:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-21 18:38:17 | 显示全部楼层
回复【62楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

真是奇怪了,我用AT89C51 和22.1184M的晶振,也用一个USB转PS2口的转换线,把你的程序直接在Keil 下,并设置晶振22.1184,然后编译,把hex烧到AT89C51中,单片机40针脚接ps2公头4针脚,单片机20针脚接ps2公头3针脚,单片机12针脚接公头1针脚,单片机14针脚接ps2公头5针脚,单片机RST也就是9针角接1k电阻接地,同时接1uf电容接vcc,晶振接单片机18,19针脚,然后接两30p电容接地,插到计算机上,结果就是不好用,郁闷死我了。小蜜蜂大狭,救救我呀,我的邮箱292507883@qq.com和QQ:292507883
小弟在此地跪谢了。

出0入0汤圆

发表于 2010-3-21 18:38:31 | 显示全部楼层
小蜜蜂大狭,救救我呀,我的邮箱292507883@qq.com和QQ:292507883

出0入0汤圆

发表于 2010-3-22 13:52:31 | 显示全部楼层
回复【70楼】pwljbb
-----------------------------------------------------------------------

(1)你先写一个高低电平设置程序输出到P1口,烧写好测量单片机管脚的电压。目的是看看你的单片机是否工作了。
(2)如果证明是好用的,下载下面的HEX代码,烧写到单片机里,看看好用不?晶振18~22M都可以用。
点击此处下载 ourdev_540214.rar(文件大小:1K) (原文件名:22M_Keyboard.rar)


还有,你自己能找到我们单位,我就帮你做好你要的代码。我也是刚入门的!

出0入0汤圆

发表于 2010-3-22 14:04:12 | 显示全部楼层
尊敬的【楼主位】jim166783
-----------------------------------------------------------------------
你的一个PS2键盘源码,帮助了这么多人,有做成的,也还有不少人在学习。
    在这里,我对你表示十分敬佩!
借用你的宝地,和一起试验你的代码的同学交流经验,
    还请你多包涵,不对的地方,请不吝赐教!

如果你不反对,我可以将我调试过的工程文件发到这里,也许能帮助后来者。


我们的莫大,希望能给这个帖子加点油啊!

出0入0汤圆

发表于 2010-3-22 14:27:51 | 显示全部楼层
不错!

出0入0汤圆

发表于 2010-3-22 17:29:43 | 显示全部楼层
非常支持!!!

出0入0汤圆

发表于 2010-3-22 18:21:26 | 显示全部楼层
小蜜蜂,你的HEX我实验了,还是不好用。单片机肯定是工作中,因为我写程序测试了。单片机是好用的。我的At89C51系统应该是没有问题的。找到你的公司很容易,大连华锐重工数....应该是这个家吧,甘井子区新水泥路666号。呵呵,这程序我觉得是有问题的,觉得和计算机握手部分应该是有问题的。不知道你怎么看这个问题。小蜜蜂,帮我这个忙,我请你去黑石焦吃海鲜,呵呵。总觉得这个程序读计算机部分的代码问题比较大。发送部分应该没问题。

出0入0汤圆

 楼主| 发表于 2010-3-22 18:34:17 | 显示全部楼层
不明白此函数的作用void CLSSIGNAL()及BYTE PS2RecChar=0xCC(为什么是0xcc?),
while(CLKFlag)
{
    i++;
    if(H_CLK==1)CLKFlag=0;
    if(i>0xEE)////这里0xEE什么意思???????????????  这里就是等待H_CLK的超时时间
    {
        IE0=0;
        EX0=1;
        return ;
    }
}            
//-----------------------------------------------------------------------
BYTE PS2RecChar=0xCC(为什么是0xcc?),

ps2收到的数据存放在PS2RecChar,进行if判断后,将其清空成其他值

出0入0汤圆

 楼主| 发表于 2010-3-22 18:36:13 | 显示全部楼层
to HONY0411 小蜜蜂

发到这里就是大家一起讨论的,所以也请把相关的心得发上来给大家分享

出0入0汤圆

发表于 2010-3-22 19:21:31 | 显示全部楼层
今天看了一天PS2协议,看的有点头晕,代码部分也明白一点,小弟是做PC程序的,刚刚接触这么低层的东西,请大家多多指教。我之前弄了个二极管放到p1^0的位置上,然后在ExternInterrupt0这个中写了p1_0 = 0;结果就没看到二极管亮(无论是否关机后再开机)。而我在main中写p1_0 = 0;灯就可以亮。
void main(void)
{
               
        PS2Init();
        while(1)
        {
                                ProcessPS2();//接收到上位机PC的信息,应答PC,使PC能识别到键盘
                                P1_0 = 0;
                                delay_ms(1000);
                                P1_0 = 1;
                                delay_ms(1000);
                               
        }
}
这样写可以亮
而下面的写法就不能亮了
void ExternInterrupt0(void) interrupt 0
{
        BOOL ParityBit=0,CLKFlag=1;
        BYTE i=0,j=8,dat=0x00;

        EX0=0;
        P1_0 = 0;       //只要有中断就点亮二极管,结果就是不亮,郁闷中。。。。
        while(CLKFlag)
        {
                i++;
                if(H_CLK==1)CLKFlag=0;
                if(i>0xEE)
                {
                        IE0=0;
                        EX0=1;
                        return ;
                }
        }

出0入0汤圆

 楼主| 发表于 2010-3-22 20:26:41 | 显示全部楼层
PS2一般调试是这样
1、发送部分
这个比较简单,只要用工程里面的程序并处理好延时
然后
void main(void)
{
        //往PC上发按键使用OnPS2SendChar();


        while(1)
        {
            OnPS2SendChar(0x15);//Q//发送通码
            //最好加上延时,如1s
            OnPS2SendChar(0xF0);
            OnPS2SendChar(0x15);//Q//发送断码

            //可以延时xx秒后再发
        }
}

2、接收部分
这部分刚开始确实比较麻烦,但本工程里面的程序是经过调试成功的
像 pwljbb 的情况,应该手动将<外部中端口>置低,
看如下P1_0会不会亮---即引起中断,如果没有可能是<外部中断没有设置好>或者<中断没有打开>

void ExternInterrupt0(void) interrupt 0
{
BOOL ParityBit=0,CLKFlag=1;
BYTE i=0,j=8,dat=0x00;

EX0=0;
P1_0 = 0;       //只要有中断就点亮二极管,结果就是不亮,郁闷中。。。。
while(CLKFlag)
{
i++;
if(H_CLK==1)CLKFlag=0;
if(i>0xEE)
{
IE0=0;
EX0=1;
return ;
}
}

设置外部中断 PS2.C
void PS2Init(void)
{
        IT0=0;        //低电平触发中断
        PX0=1;       
        EX0=1;       
}

还需检查EA是否为1

出0入0汤圆

发表于 2010-3-23 08:49:06 | 显示全部楼层
回复【81楼】jim166783
-----------------------------------------------------------------------

楼主jim166783,终于现身啦!这里还真是挺热闹。现将我调试的代码发到这里献丑:
(也算是对【72楼】和【73楼】还有【76楼】 pwljbb  的承诺的回应了)

(1)已经调试通过的模拟PS/2键盘工程文件
(2)我自己编写的检测PS/2接口的监听软件
(3)正在制作中的工控键盘,刚开好PCB,机壳外观还没有喷塑着色呢...

点击此处下载 ourdev_540420.rar(文件大小:189K) (原文件名:PS2 Keyboard.rar)

这是晶振22.1184MHz,89S52单片机的版本,在P3.5、P3.6、P3.7管脚输入低电平实现按键,往PC发送数字2、3和回车。
仿真键盘接在普通PC机的PS/2键盘口,测试可用。
程序还有一些问题,有待改进提高。

出0入0汤圆

发表于 2010-3-23 08:54:18 | 显示全部楼层
回复【82楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

ourdev_540214.rar(文件大小:1K) (原文件名:22M_Keyboard.rar)
这个文件用18M和22M开机都不能正常初始化,总是提示键盘初始化错误。

出0入0汤圆

发表于 2010-3-23 09:37:27 | 显示全部楼层
查了一下EA是做什么的,这回明白了,EA应该接VCC上,请问大狭们,EA是否可以用程序控制,比如EA = 1;
汇编部分的延迟程序好象有点问题。
我改了一下,不知道算的对不对,因为用的22.1184的晶振,所以12/22.1184 = 0.542534722 us
/*
*  应该延迟30us
*/
DELAY30US:
                PUSH        05H           ;2个机器周期
                MOV                r5,#24        ; 1个机器周期
DE30S1:
                DJNZ        r5,DE30S1     ;   48个机器周期
                POP        05h           ;2个机器周期
                RET                     ;2个机器周期
/*****************************
*  一共55个周期    55*0.542534722 us = 29.839
*  下面的一个道理计算。
******************************/
;******************************************************************
        ?PR?DELAY10US SEGMENT CODE
        PUBLIC DELAY10US
        RSEG ?PR?DELAY10US
;16.3US
DELAY10US:      
                PUSH        05H          ;2
                MOV     r5, #6       ;10
DE10S1:
                DJNZ    r5, DE10S1   ;5*2=10
                POP        05H             ;2
                RET

出0入0汤圆

发表于 2010-3-23 16:26:13 | 显示全部楼层
回复【82楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

现在用你提供的程序,我的晶振也是22.1184的,不知道怎么回事还是通不过,编译时还有警告?延时要修改?
怎么不把编译通过的整个keil工程发上来?
真的很急!!谢谢啦!!!!!!!!!!!!!

出0入0汤圆

发表于 2010-3-23 17:14:11 | 显示全部楼层
回复【82楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------
HONY0411 小蜜蜂:能不能发个开机自检可以通过的keil工程?不用USB to PS2 ,直接插在ps2的插孔。
谢谢!!!急!!!!!!!!!!

出0入0汤圆

发表于 2010-3-23 18:34:35 | 显示全部楼层
蜜蜂的那个程序有问题。自检这里不同的机器检查出来的效果不一样,比如intel的主板,就发的命令和其他主板不一样,这个我明天写个程序监视一下(小弟不会用示波器,打算按上8个灯,通过01来检查主机发来的数据。)今天修改了一下楼主的发送函数(把楼主的程序和PS2协议对比了一下,发现出入比较大,尤其是延迟部分,我改了改,完全按照PS2协议做的。测试通过)。

出0入0汤圆

发表于 2010-3-23 19:43:23 | 显示全部楼层
回复【88楼】pwljbb
-----------------------------------------------------------------------

能否将调试后的发送函数发上来,特别是延时函数.
谢谢!!!!!

出0入0汤圆

发表于 2010-3-24 01:06:47 | 显示全部楼层
回复【86楼】lixinjun1786  【88楼】 pwljbb
-----------------------------------------------------------------------
(1)在【82楼】的文件里,有PS2口线 监测程序。但是要用到仿真器。或者用串口(程序里没含有,需要再添加)。

(2)我的工程文件是可以直接编译的!这一点没问题。编译器 Keil UV4 V9.01最新版本。
老板本UV2,你可以新建工程,添加文件就可以。

(3)那个程序基本是原来的样子,时序我没调,确时不完全符合PS2协议。但是,我不用USB转接也能通过。
(4)改进版本,我正在做工程实验,STC12,1T的CPU,发上来也不通用。

出0入0汤圆

发表于 2010-3-24 08:19:01 | 显示全部楼层
回复【90楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

小蜜蜂:
能否将不用USB转接也能通过的程序发上来?
谢谢了。

出0入0汤圆

发表于 2010-3-25 20:50:53 | 显示全部楼层
回复【91楼】lixinjun1786
-----------------------------------------------------------------------

【82楼】的工程,就是不用USB转换器的,直接 接到台式机的键盘口,测试好用。

出0入0汤圆

发表于 2010-3-26 08:21:01 | 显示全部楼层
回复【93楼】HONY0411 小蜜蜂
-----------------------------------------------------------------------

奇怪了!我用82楼的PS2.C,PS2.H,main.c,Delay.asm这四个文件,没用mkey.c文件。晶振也是22.1184的
不知道怎么回事,我的就是不行。
我现在按协议上的要求写程序也是不行。期望给点指教!!!!!!!!!

出0入0汤圆

发表于 2010-3-28 19:18:11 | 显示全部楼层
新手来.学习一下,

出0入0汤圆

发表于 2010-4-21 10:37:57 | 显示全部楼层
小蜜蜂:
能否将不用USB转接也能通过的程序发上来?以前的程序开机都是检测不到的!!开机都不能应答!!
谢谢了。

出0入0汤圆

发表于 2010-5-25 10:16:50 | 显示全部楼层
lixinjun1786 小蜜蜂
-----------------------------------------------------------------------
小蜜蜂我都调试了一个星期多了。还没有通过。能给个联系方式吗?想和你交流交流。我QQ137957919

我现在做单片机模拟PS/2键盘。我的不用电脑键盘。直接用单片机做的键盘。现在就是接收数据有问题。发送的我试过没有问题。
期待你的回复。。。。。。。急。。。急。。。。急。。。。。。

出0入0汤圆

发表于 2010-5-28 12:33:48 | 显示全部楼层
回复【97楼】lihaijun
-----------------------------------------------------------------------
你说:单片机能发送数据到PC机的PS2接口,但是单片机不能接收来自PC机的数据?
能发送就说你已经初始化成功了,也就是你已经接收和正确应答了PC机的初始化指令。
平时,你发送按键的键码,PC机是没有反馈的。
除非你按下大写锁定键等,PC机发送数据改变LED指示灯的亮灭状态。
或者,你发送数据出错,PC机才反馈一下。

出0入0汤圆

发表于 2010-5-29 07:17:21 | 显示全部楼层
太好了,谢谢楼主及各位。

出0入0汤圆

发表于 2010-5-31 16:17:00 | 显示全部楼层
回复【97楼】lihaijun
-----------------------------------------------------------------------

你好。。我发送是电脑键盘自检通过了。才插的单片机。就是说,电脑开机。开了机后,把电脑键盘拔了。插_我的单片机键盘。就可以发送数据。要是一开机就插_我单片机键盘。电脑识别不了。没有显示有键盘。单片机键盘也不能用。

出0入0汤圆

发表于 2010-5-31 16:18:05 | 显示全部楼层
lixinjun1786 小蜜蜂
-----------------------------------------------------------------------

你好。。我发送是电脑键盘自检通过了。才插的单片机。就是说,电脑开机。开了机后,把电脑键盘拔了。插_我的单片机键盘。就可以发送数据。要是一开机就插_我单片机键盘。电脑识别不了。没有显示有键盘。单片机键盘也不能用。

出0入0汤圆

发表于 2010-5-31 16:38:39 | 显示全部楼层
lixinjun1786 小蜜蜂  
-----------------------------------------------------------------------  
我做了快两个星期了。还没有做出来。我刚来个新公司老板就给了个这个任务。看来要是做不出来。还得再找工作,求你了。帮个忙把。真的很急。。我只需要问几个问题关键电脑开机了。单片机做什么。是不是在等电脑发数据(FFH),然后单片机发(FAH)再发(AAH)一开机单片机需不需要延时等呀。是一开机直接等电脑发过来数据吗?还有电脑发的都是什么数据,网上太多资料。都不尽相同。我现在还遇到个问题,我不在的接收到的数据是不是准确,我接收到第一个数据是(FFH)然后回复电脑(FAH)再发(AAH)。接到第二个数据是(F2H)我回复(FAH)再发(ABH)再发(83H).可是就在这里出错了。单片机发过(FAH)和(ABH)就跳出去了。因为电脑要发数据。最后一个(83H)就没有发。跳出去。就没有反映了。电脑业开了。没有键盘。能不能加我QQ呀。QQ:137957919.。谢谢了
谢谢了。真的很急。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 19:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表