|
/*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编辑过 |
|