搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2005-5-18 07:26:18 | 显示全部楼层 |阅读模式
/*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编辑过

出0入0汤圆

发表于 2005-5-18 08:58:39 | 显示全部楼层
我在写键盘与PC的部分~~,也是没搞通。

出0入0汤圆

 楼主| 发表于 2005-5-18 16:38:26 | 显示全部楼层
我找到以上的问题所在了,在发送数据的ACK应答位后没有等待把时钟线拉高,便跳出了发送数据子程序,从而直接触发了接收数据的中断,进入接收数据的子程序,从而使数据发生了移位错误. :-) 太大意了~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-10 06:13

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

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