14.移动鼠标

本文介绍了如何处理鼠标发送的字节数据,解析这些数据以跟踪鼠标的移动。当接收到0xfa字节时,系统开始收集数据,通过分析每个字节的特定比特位来确定鼠标的状态和移动。第一字节的低3位表示按键状态,第4、5位影响后续坐标数据的处理。完成三个字节的接收后,系统将这些信息用于更新鼠标的坐标位置,模拟真实的鼠标操作体验。
摘要由CSDN通过智能技术生成

简介

鼠标发送的数据要三个字节一起解读,所以我们的内核要等待鼠标发送足够的数据后才可以采取行动。当鼠标被激活后,它会立马给内核发送一个字节数据,数值为0xfa, 当内核收到这个数据后,就可以开始积攒数据,每接收三个字节后,根据数据绘制鼠标。

这三个字节数据是有一定特点的,第一个字节0xmn, m的数值必须在0-3这个范围内,所以这意味着该字节的第6、7两个比特位必须为0,n的值必须在8-F之间,这意味着该字节数据对应的第4个比特位必须为1。左键,滚轮,右键被按下时,n的最低3位会被置1。

第二个字节用来表示鼠标的左右移动,对该字节进行相应处理后,可以得到鼠标平移的坐标变换。

第三个字节的数据表示鼠标的上下移动,对该字节进行相应处理后,可以得到鼠标垂直移动时的坐标变换。

目标

1.os.h 文件定义MouseDes处理鼠标移动数据类型,os.h文件如下:

//*******************************相关数据类型声明*************************

//定义调色板颜色
#define  COL8_000000  0
#define  COL8_FF0000  1
#define  COL8_00FF00  2
#define  COL8_FFFF00  3
#define  COL8_0000FF  4
#define  COL8_FF00FF  5
#define  COL8_00FFFF  6
#define  COL8_FFFFFF  7
#define  COL8_C6C6C6  8
#define  COL8_840000  9
#define  COL8_008400  10
#define  COL8_848400  11
#define  COL8_000084  12
#define  COL8_840084  13
#define  COL8_008484  14
#define  COL8_848484  15


//屏幕宽度
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200


//定义缓冲区
typedef struct _FIFO8{
	//指向缓冲区
    char* buf;
	//r:读索引,w:写索引
	//len:存储数据长度
    int r, w, size, len, flag;
}FIFO8;

//定义鼠标移动处理模型
//鼠标处理需要连续处理3字节
//phase 表三处理的字节阶段
//offX,offY 表示当前鼠标的偏移
//x,y 表示鼠标当前所在的坐标位置
typedef struct _MouseDes{
    char buf[3], phase;
	int offX,offY;
    int x, y, btn;
}MouseDes;

//*******************************函数声明*************************

//初始化调色板
void initPallet();



/**
 *绘制矩形
 *x             矩形左上角x坐标
 *y             矩形左上角y坐标
 *width         宽度
 *height        高度
 *colIndex      pallet_color 类型调色板颜色索引,即矩形颜色
 */

void fillRect(int x,int y,int width,int height,char colIndex);


//绘制桌面背景
void drawBackground();


/**
 *绘制字体
 *@param	addr		绘制的起始显存地址
 *@param 	x			绘制的x坐标
 *@param	y			绘制的y坐标
 *@param	col			绘制颜色
 *@param	pch			绘制的字符数组8*16,每一行共8位,共16行
 *@param	screenWidth	屏幕宽度
 */
void putChar(char *addr,int x,int y,char col,unsigned char *ch,int screenWidth);


/*
 *初始化鼠标指针
 *@param	vram		绘制的起始显存地址
 *@param	x			绘制鼠标指针最左上角x坐标
 *@param	y			绘制鼠标指针最左上角y坐标
 *@param	bc			绘制的矩形填充颜色,和背景色一样将能看到鼠标指针
 */
void drawMouseCursor(char *vram,int x,int y,char bc);



/*
 *char 类型数据转换为16进制字符数据
 *@param	val		待转化为16进制的数值
 *@param	arr		保存16进制字符串数据的数组
 */
void char2HexStr(unsigned char val,char *arr);

//初始化鼠标硬件
void init_mouse();

//缓存初始化
void fifo8_init(FIFO8 *fifo,int size,char *buf);
//缓冲区存放数据
int fifo8_put(FIFO8 *fifo,char data);
//缓冲区读取数据
int fifo8_get(FIFO8 *fifo);

//鼠标移动处理
//@param	mdec		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值