我自己的PS/2鼠标上位机(模拟电脑发送数据)程序的一部分,大家看看有什么问题!谢谢大
/*This program was produced by theCodeWizardAVR 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编辑过 我在写键盘与PC的部分~~,也是没搞通。 我找到以上的问题所在了,在发送数据的ACK应答位后没有等待把时钟线拉高,便跳出了发送数据子程序,从而直接触发了接收数据的中断,进入接收数据的子程序,从而使数据发生了移位错误. :-) 太大意了~~~~~
页:
[1]