leicer 发表于 2005-5-18 07:26:18

我自己的PS/2鼠标上位机(模拟电脑发送数据)程序的一部分,大家看看有什么问题!谢谢大

/*This program was produced by the

CodeWizardAVR V1.24.1d Standard

Chip type         : ATmega16L

 PORTD.2(INT0)   CLOCK

 PORTD.4         DATA

*/



#define CLOCK                        2

#define DATA                             4

#define _CLOCK_PINX                PIND

#define _DATA_PINX                PIND

#define _CLOCK_DDRX               DDRD

#define _DATA_DDRX                DDRD

#define _CLOCK_PORT                    PORTD

#define _DATA_PORT                PORTD   



#define H                        1

#define L                         0



//Function Send Data

void Send_Data(unsigned char DATA_SEND)

{

unsigned char sub_bitpin;

unsigned char sub_counter=0;

unsigned char parity=1;

unsigned char flag=0;





#asm("cli")                                     // Global disable interrupts

_CLOCK_DDRX.CLOCK=1;

_CLOCK_PORT.CLOCK=L;                         //Bring the Clock line low

_DATA_DDRX.DATA=1;

_DATA_PORT.DATA=L;                                //Bring the Data line low

delay_us(100);

_CLOCK_DDRX.CLOCK=0;   

_CLOCK_PORT.CLOCK=0;                                //Release the Clock line

for(sub_counter=0;sub_counter<8;sub_counter++)

{

do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (flag); //wait PS/2 CLK to Low

sub_bitpin=(DATA_SEND&0x01);

if(sub_bitpin) parity++;

   _DATA_PORT.DATA=sub_bitpin;



DATA_SEND=DATA_SEND>>1;

do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (!flag);                         //wait PS/2 CLK to High

}



do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (flag); //wait PS/2 CLK to Low

parity&=0x01;       //奇校验

_DATA_PORT.DATA=parity;                                 //Send Parity

do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (!flag);                        //wait PS/2 CLK to High





do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (flag); //wait PS/2 CLK to Low

_DATA_DDRX.DATA=0;

_DATA_PORT.DATA=0;                         //Release the Data line   



do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (!flag);                         //wait PS/2 CLK to High

//ACK

 do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (flag);                        //wait PS/2 CLK to Low   

_CLOCK_DDRX.CLOCK=0;

_CLOCK_PORT.CLOCK=0;

_DATA_DDRX.DATA=0;

_DATA_PORT.DATA=0;

#asm("sei") // Global enable interrupts   

}



我是个高中生,大家照顾一下:-) 大家帮忙看看我对I/O的读取和操作有问题吗??还有

    do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (flag); //wait PS/2 CLK to Low

sub_bitpin=(DATA_SEND&0x01);

if(sub_bitpin) parity++;

   _DATA_PORT.DATA=sub_bitpin;



DATA_SEND=DATA_SEND>>1;

do

{

flag=_CLOCK_PINX;

flag=(flag&0x04)>>CLOCK;

}

while (!flag);                         //wait PS/2 CLK to High

在45us可以完成吗??我想问题就在判断电平上?

-----此内容被leicer于2005-05-18,07:27:48编辑过



-----此内容被leicer于2005-05-18,07:30:42编辑过



-----此内容被leicer于2005-05-18,08:05:27编辑过


-----此内容被leicer于2005-05-18,21:07:56编辑过

byjove 发表于 2005-5-18 08:58:39

我在写键盘与PC的部分~~,也是没搞通。

leicer 发表于 2005-5-18 16:38:26

我找到以上的问题所在了,在发送数据的ACK应答位后没有等待把时钟线拉高,便跳出了发送数据子程序,从而直接触发了接收数据的中断,进入接收数据的子程序,从而使数据发生了移位错误. :-) 太大意了~~~~~
页: [1]
查看完整版本: 我自己的PS/2鼠标上位机(模拟电脑发送数据)程序的一部分,大家看看有什么问题!谢谢大