简介
鼠标发送的数据要三个字节一起解读,所以我们的内核要等待鼠标发送足够的数据后才可以采取行动。当鼠标被激活后,它会立马给内核发送一个字节数据,数值为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