返回主站|网站地图|手机浏览
普通会员

如皋市思晶源电子有限公司

新闻中心
产品分类
  • 暂无分类
mousemsg头文件

鼠标引脚定义及数据处理示例

mousemsg头文件

(网络配图 请勿当真)

本示例展示了鼠标引脚的定义及其数据处理方式。引脚定义如下:

  • CLK:白色
  • SDA:绿色
  • GND:橙色
  • VCC:蓝色

在代码中,头文我们首先引入了延时头文件,头文并定义了鼠标的头文相关引脚和数据结构。具体如下:

```c

#include "delay52.h"

#ifndef MOUSE_H

#define MOUSE_H

sbit mouse_SDA = P3^4; // 数据线

sbit mouse_CLK = P3^3; // 时钟线

unsigned char bdata mouse_byte; // 接收字节

// 定义鼠标字节的头文各个位

sbit mouse_byte_bit0 = mouse_byte^0;

sbit mouse_byte_bit1 = mouse_byte^1;

sbit mouse_byte_bit2 = mouse_byte^2;

sbit mouse_byte_bit3 = mouse_byte^3;

sbit mouse_byte_bit4 = mouse_byte^4;

sbit mouse_byte_bit5 = mouse_byte^5;

sbit mouse_byte_bit6 = mouse_byte^6;

sbit mouse_byte_bit7 = mouse_byte^7;

unsigned char bdata mouse_function; // 功能信息字节

unsigned char mouse_buffer[11]; // 接收位数据缓冲区

unsigned char mouse_buffer_bit = 0; // 当前缓冲区位

unsigned char mouse_data[3]; // 接收鼠标数据缓冲区

unsigned char mouse_data_bit = 0; // 当前数据位

unsigned int move_x = 10000; // 存放横坐标

unsigned int move_y = 10000; // 存放纵坐标

```

接下来是鼠标初始化函数,设置中断和定时器的头文相关配置:

```c

void Init_mouse(void) {

TCON = 0x00;

EA = 1; // 使能全局中断

EX1 = 1; // 允许外部中断1

ET0 = 0x01; // 允许定时器0溢出中断 PX1 = 1; // 设置中断优先级

}

```

数据发送函数负责将数据通过鼠标的SDA线发送,具体实现如下:

```c

void mouse_send_data(unsigned char dat) {

unsigned char i;

EX1 = 0; // 关闭外部中断1 ACC = dat; // 将数据放入A寄存器

mouse_CLK = 0; // 拉低时钟线

delay10us(200); // 延时 mouse_SDA = 0; // 拉低数据线 delay10us(40);

mouse_CLK = 1; // 释放时钟线

for(i = 0; i <= 7; i++) { // 发送8个数据位 while(mouse_CLK == 1); // 等待设备拉低时钟线 mouse_SDA = (dat >> i) & 0x01; // 发送数据位 while(mouse_CLK == 0); // 等待设备释放时钟线

while(mouse_CLK == 1);

}

mouse_SDA = ~P; // 发送校验位 while(mouse_CLK == 0);

while(mouse_CLK == 1);

mouse_SDA = 1; // 发送停止位 while(mouse_CLK == 0);

while(mouse_CLK == 1); // 应答位

while(mouse_CLK == 0);

EX1 = 1; // 打开外部中断1

}

```

校验函数用于检查接收到的头文数据的有效性:

```c

unsigned char Checkout(void) {

ACC = mouse_byte;

if(~P == mouse_buffer[9]) {

return 1; // 校验通过 } else {

return 0; // 校验失败 }

}

```

数据分析函数负责解析接收到的鼠标数据,并更新坐标信息:

```c

void data_analyse(void) {

// 从接收到的头文信号中提取数据

mouse_byte_bit0 = mouse_buffer[1];

mouse_byte_bit1 = mouse_buffer[2];

mouse_byte_bit2 = mouse_buffer[3];

mouse_byte_bit3 = mouse_buffer[4];

mouse_byte_bit4 = mouse_buffer[5];

mouse_byte_bit5 = mouse_buffer[6];

mouse_byte_bit6 = mouse_buffer[7];

mouse_byte_bit7 = mouse_buffer[8];

if(Checkout()) { // 校验通过

if(mouse_data_bit < 3) {

mouse_data[mouse_data_bit++] = mouse_byte; // 存储数据 }

if(mouse_data_bit == 3) {

mouse_data_bit = 0; // 重置数据位 }

// 更新坐标

if(mouse_data[0] & 0x10) {

move_x -= (256 - mouse_data[1]); // 向左移动 } else {

move_x += mouse_data[1]; // 向右移动 }

if(mouse_data[0] & 0x20) {

move_y -= (256 - mouse_data[2]); // 向上移动 } else {

move_y += mouse_data[2]; // 向下移动 }

}

}

```

最后,外部中断1的头文处理函数负责接收数据并触发数据分析:

```c

void ReceiveData(void) interrupt 2 {

if(mouse_buffer_bit <= 10) {

while(mouse_CLK == 0); // 等待设备拉高时钟线

mouse_buffer[mouse_buffer_bit++] = mouse_SDA; // 接收数据

if(mouse_buffer_bit == 10) {

data_analyse(); // 数据分析 }

mouse_buffer_bit = 0; // 重置缓冲区位 }

}

```

有效建议与应对措施

1、在使用鼠标模块时,头文确保引脚连接正确,头文以避免数据传输错误。头文

2、头文定期检查和更新代码,头文以适应不同的头文硬件版本和功能需求。

3、在调试过程中,使用示波器等工具监测信号波形,确保时序准确。