📄 ps2.c
字号:
//#include"F:\msp430\msp430\msp430\uCOS430\includes.h"
#include<msp430x16x.h>
#include"PS2.h"
struct Mousetype{
char data[4];
unsigned char cnt;
unsigned char err;
unsigned char renew;
unsigned char lenth;
int xloc,yloc;
}Mouse;
struct Ps2type{
unsigned char cnt,parity,renew;
unsigned int data;
unsigned char err;
unsigned int timecnt[2];
}Ps2;
void delay(unsigned int cnt)
{
unsigned int a;
a=cnt;
while(a--){
_NOP();
_NOP();
}
}
/*==============================================================================
鼠标初始化
==============================================================================*/
void MouseInit(void)
{
//鼠标口初始化
P1DIR&=~BIT0; //设置为输入方向
P1SEL&=~BIT0; //设置为普通I/O口功能
P1IES|=BIT0; //选择下降沿触发
P1IE &=~BIT0; //不打开中断允许
P1IFG=0; //P1IES的切换可能使P1IFG置位,需清除
P3DIR&=~BIT0; //设置鼠标数据线为输入
P3SEL&=~BIT0; //设置为普通I/O口
//鼠标口初始化结束
Mouse.lenth=3;
ps2_sendchar(0xff); //发送复位命令
_EINT();
delay(1000);
// while(Ps2.renew==0); //等待应答 成功或失败
// Ps2.renew=0;
// while(Ps2.renew==0); //等待应答 设备名
// Ps2.renew=0;
// ps2_sendchar(0xf0);
// delay(1000);
ps2_sendchar(0xf4); //发送开始采样命令
}
/*==============================================================================
返回鼠标按键状态
==============================================================================*/
char MouseClick(void)
{
if(Mouse.renew){
Mouse.renew=0;
if(Mouse.data[0]&BIT0)return 'L';//左键
else if(Mouse.data[0]&BIT1)return 'R';//右键
else if(Mouse.data[0]&BIT2)return 'M';//中键
else return '0';
}
return 0;//无动作
}
/*==============================================================================
返回鼠标位置
==============================================================================*/
int MouseXloc(void)//反馈鼠标X坐标
{
return Mouse.xloc;
}
int MouseYloc(void)//返回鼠标Y坐标
{
return Mouse.yloc;
}
/*==============================================================================
返回鼠标位移
==============================================================================*/
int MousedXloc(void)//反馈鼠标X坐标
{
// if(Mouse.renew)
return (int)Mouse.data[1];
// else
// return 0;
}
int MousedYloc(void)//返回鼠标Y坐标
{
// if(Mouse.renew)
return (int)Mouse.data[2];
// else
// return 0;
}
/*==============================================================================
鼠标接收超时处理
==============================================================================*/
void MouseClear(void)//鼠标
{
if(Ps2.err||Ps2.timecnt[0]==Ps2.timecnt[1]){
Mouse.cnt=0;
Ps2.data=0;
Ps2.cnt=0;
Ps2.err=0;
Ps2.timecnt[1]=Ps2.timecnt[0];
}
}
/*==============================================================================
向鼠标发送命令
==============================================================================*/
void ps2_sendchar(unsigned char wdata)
{
unsigned int dat;
unsigned char parity,i;
dat=wdata;
parity=0;
for(i=0;i<8;i++)
{
parity+=dat & BIT0;
dat>>=1;
}
dat=!(parity & BIT0)+BIT1;//奇偶校验位加停止位
dat<<=8;
dat+=wdata;
P1IE &=~BIT0;
P1DIR |=BIT0;
P3DIR |=BIT0;
P1OUT &=~BIT0;
delay(2000);
P3OUT&=~BIT0;
delay(10);
P1DIR &= ~BIT0;//释放时钟线
// OS_ENTER_CRITICAL();
for(i=0;i<10;i++)//发送8位数据位1位校验位和一位停止位
{
while(P1IN & BIT0);//等待设备把时钟线拉低
if(dat & BIT0)P3OUT |=BIT0;
else P3OUT &=~BIT0;//写数据
dat>>=1;
while(!(P1IN & BIT0));//等待设备把时钟线拉高
}
P3DIR &=~BIT0;//释放数据线
while(P3IN & BIT0);//等待设备把数据线拉低
while(P1IN & BIT0);//等待设备把时钟线拉低
while(!(P1IN & BIT0));//等待设备把时钟线拉高
while(!(P3IN & BIT0));//等待设备把数据线拉高
P1IE |=BIT0;//开启P1.0中断
// OS_EXIT_CRITICAL();
}
/*==============================================================================
鼠标接收中断
==============================================================================*/
void ps2getchar(void)
{
unsigned int buf;
if(P1IFG & BIT0) //如果是p1.0中断发生
{
Ps2.timecnt[0]++; //超时计数器自加
P1IFG &=~(BIT0);
buf=P3IN & BIT0; //读数据线
Ps2.cnt %=11;
if(Ps2.cnt==0){ //遇到起始位初始化数据
Ps2.data=0;
Ps2.parity=0;
if(buf){ //起始位为0则出错
Ps2.err=1;
return;
//OSIntExit();
}
}
Ps2.data+=buf<<Ps2.cnt;
if(Ps2.cnt<9)Ps2.parity+=buf;
else if(Ps2.cnt==10){
if(!buf){
Ps2.err=1;//停止位出错
//OSIntExit();
return;
}
else if(!(Ps2.parity & BIT0)==!(Ps2.data & BIT9)){
Ps2.err=2;//校验位出错
//OSIntExit();
return;
}
if(!Ps2.err){
Ps2.renew=1;//未出错时更新计数。
Mouse.cnt%=Mouse.lenth;
Mouse.data[Mouse.cnt++]=Ps2.data>>1;
if(Mouse.cnt==Mouse.lenth){
if(Mouse.data[0]&BIT3){
Mouse.renew=1;
Mouse.xloc+=Mouse.data[1];
Mouse.yloc-=Mouse.data[2];
if(Mouse.xloc>511)Mouse.xloc=511;
else if(Mouse.xloc<0)Mouse.xloc=0;
if(Mouse.yloc>255)Mouse.yloc=255;
else if(Mouse.yloc<0)Mouse.yloc=0;
}
}
}
}
Ps2.cnt++;
}
P1IFG =0; //清除中断标志
// OSIntExit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -