ps2 mouse source code
i am sending code for ps/2 to protocol it means it will work for ps/2 keyboard as well as ps/2 mouse
this program will trasnfer data (send by ps/2 device)on com port at 9600 baudrate
//Author:Chaitanya Thummar
// this is code for PS/2 protocol
#include <p89v51rx2.h>
#define HIGH 1
#define LOW 0
sbit data_bit=P3^3;
sbit clk=P3^2;
void MSDelay(unsigned char delay)
{
unsigned char i;
for(i=0;i<delay;i++)
{
}
}
void ps2_write(unsigned char command)
{
unsigned char i;
unsigned char parity = 1;
data_bit=HIGH;
clk=HIGH;
MSDelay(100);
clk=LOW;
MSDelay(100);
data_bit=LOW;
MSDelay(10);
clk=HIGH;
/* wait for device to take control of clock */
while (clk==HIGH); // this loop intentionally left blank
for (i=0; i < 8; i++)
{
if (command & 0x01)
{
data_bit=HIGH;
}else
{
data_bit=LOW;
}
// wait for clock
while (clk== LOW);
while (clk== HIGH);
parity = parity ^ (command & 0x01);
command = command >> 1;
}
// parity bit
if (parity)
{
data_bit=HIGH;
}else
{
data_bit=LOW;
}
//clock cycle - like ack.
while(clk==LOW);
while(clk==HIGH);
data_bit=HIGH;
MSDelay(10);
while (clk==HIGH);
// mode switch
while ((clk==LOW)||(data_bit== LOW));
// hold up incoming data
clk=LOW;
}
unsigned char ps2_read()
{
unsigned char data1 = 0x00;
unsigned char i;
unsigned char bit1 = 0x01;
// start clock
clk=HIGH;
data_bit=HIGH;
MSDelay(10);
while (clk == HIGH);
while (clk==LOW);//eat start bit
for (i=0; i < 8; i++)
{
while (clk==HIGH);
if(data_bit==HIGH)
{
data1 = data1 | bit1;
}
while (clk == LOW);
bit1= bit1<< 1;
}
// eat parity bit, ignore it.
while (clk==HIGH);
while (clk==LOW);
// eat stop bit
while (clk==HIGH);
while (clk==LOW);
clk=LOW; // hold incoming data
return data1;
}
void serial_init()
{
FCF=1;
SCON = 0x50; /* mode 1, 8-bit uart, enable receiver */
TMOD = 0x20; /* timer 1, mode 2, 8-bit reload */
TH1 = 253; /* reload value for 2400 baud */
ET0 = 0; /* we don't want this timer to make interrupts */
TR1 = 1; /* start the timer */
ES = 0; /* allow serial interrupts */
EA = 0; /* enable interrupts */
}
void main()
{
unsigned char count=0;
serial_init();
P2=0x00;
ps2_write(0xff);
while(count!=3)
{
SBUF=ps2_read();
while(TI==0);
TI=0;
count++;
}
ps2_write(0xf4);
while(1)
{
ps2_read();
while(TI==0);
TI=0;
count++;
}
}