键盘控制器原理

①自己去看
鼠标控制也属于键盘控制器的一部分

硬件图


代码

 io_out8(PIC0_IMR, 0xf9); /* PIC1(11111001) 开启键盘和鼠标中断设置*/io_out8(PIC1_IMR, 0xef); /* 从芯片设置:(11101111) */

keymouse.h中的宏定义,函数声明,结构体声明

#ifndef __KEYMOUSE_H__
#define __KEYMOUSE_H__struct MOUSE_DEC
{unsigned char MouseStatusBuf[3];//存放鼠标发送过来的三个字节int MousePhase;//设置鼠标处于哪个周期int nX, nY, nButton;
};#define PORT_KEYDAT               0x0060 //端口60数据
#define PORT_KEYSTA             0x0064//获取键盘控制器状态
#define PORT_KEYCMD             0x0064//端口64 命令
#define KEYSTA_SEND_NOTREADY    0x02//键盘控制器没有准备好
//向端口64发送此命令 代表要向端口60发送数据了
#define KEYCMD_WRITE_MODE       0x60
//开启鼠标 键盘中断 并且使能
#define KBC_MODE                0x47
//鼠标应答
#define MOUSE_ACK               0xfa//要使能鼠标
#define KEYCMD_SENDTO_MOUSE     0xd4
#define MOUSECMD_ENABLE         0xf4void WaitKeyBoardCtrlReady(void);//等待键盘控制器准备完毕
void InitKeyBoard(void);//初始化 键盘控制器
void EnableMouse(struct MOUSE_DEC * pMouse);//激活鼠标int MouseDecode(struct MOUSE_DEC * pMouse, unsigned char ucData);//把数据放入结构体#endif

初始化键盘控制器

void WaitKeyBoardCtrlReady(void)//等待键盘控制器准备完毕
{while(1){if(0 == (io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) ){break;}}return;
}
void InitKeyBoard(void)//初始化 键盘控制器
{WaitKeyBoardCtrlReady();//向0x64端口发送命令 下一个送入端口0x60的数据 要写入控制寄存器io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);WaitKeyBoardCtrlReady();//设置控制寄存器的模式io_out8(PORT_KEYDAT, KBC_MODE);return;
}

初始化鼠标

void EnableMouse(struct MOUSE_DEC * pMouse)//激活鼠标
{WaitKeyBoardCtrlReady();io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE);WaitKeyBoardCtrlReady();io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);pMouse->MousePhase = 0;return;
}

初始化键盘,鼠标的缓冲区

 struct  FIFO g_FifoKeyBoardBuf;struct  FIFO g_FifoMouseBuf;unsigned char KeyBoardBuffer[32];//键盘的缓冲区unsigned char MouseBuffer[256];//鼠标的缓冲区InitFifo(&g_FifoKeyBoardBuf, 32, KeyBoardBuffer);InitFifo(&g_FifoMouseBuf, 256, MouseBuffer);

fifo.h中的内容

#ifndef __FIFO_H__
#define __FIFO_H__#define FLAGES_OVERRUN 0x0001 //记录是否缓冲区溢出
#define BUFFER_VOERFLOW -1
#define BUFFER_EMPTY -2//记录缓冲区的结构体
struct  FIFO
{unsigned char *pAdd;//缓冲区的起始地址int nHead;//队列头int nTail;//队列尾int nFree;//空闲的数量int nSize;//缓冲区总共大小int nFlag;//记录标志
};//初始化缓冲区
void InitFifo(struct FIFO *pTemp, int Size, unsigned char *pBuf);
//向缓冲区写入数据
int FifoSaveData(struct FIFO *pTemp, unsigned char Data);
//从缓冲区中读出数据
int FifoReadData(struct FIFO *pTemp);
//获取缓冲区的状态
int FifoStatus(struct FIFO *pTemp);#endif

fifo.c中的内容

void InitFifo(struct FIFO *pTemp, int Size, unsigned char *pBuf)
{pTemp->pAdd = pBuf;pTemp->nSize = Size;pTemp->nFlag = 0;pTemp->nFree = Size;pTemp->nHead = 0;pTemp->nTail = 0;return ;
}
int FifoSaveData(struct FIFO *pTemp, unsigned char Data)
{if(0 == pTemp->nFree)//如果没有空闲区{pTemp->nFlag |= FLAGES_OVERRUN;return BUFFER_VOERFLOW;}//有空闲区 向尾部写入数据pTemp->pAdd[pTemp->nTail] = Data;pTemp->nTail++;if(pTemp->nSize == pTemp->nTail){pTemp->nTail = 0;}pTemp->nFree--;//空闲区减1return 0;
}
int  FifoReadData(struct FIFO *pTemp)
{int nData;//如果缓冲区是空的if(pTemp->nFree == pTemp->nSize){return BUFFER_EMPTY;}//取出数据nData = pTemp->pAdd[pTemp->nHead];pTemp->nHead++;if(pTemp->nSize == pTemp->nHead){pTemp->nHead = 0;}pTemp->nFree++;return nData;
}
int FifoStatus(struct FIFO *pTemp)//缓冲区内的字符个数
{return (pTemp->nSize) - (pTemp->nFree);
}

键盘和鼠标的中断处理函数

void IntHandler21(int *pEsp);//键盘是IRQ1
void IntHandler2C(int *pEsp);//鼠标是IRQ12
void IntHandler21(int *pEsp)
{unsigned char ucData;io_out8(PIC0_OCW2, 0x61);//通知PIC"IRQ-01已经处理完毕 可以继续中断"ucData = io_in8(PORT_KEYBOARD_DATA);//sprintf(szBuf, "%02x",ucData);FifoSaveData(&g_FifoKeyBoardBuf,ucData);return  ;
}void IntHandler2C(int *pEsp)
{unsigned char ucData;//通知PIC1 IRQ-12io_out8(PIC1_OCW2, 0x64);//通知PIC0 IRQ-02io_out8(PIC0_OCW2, 0x62);//从鼠标接受一个数据ucData = io_in8(PORT_KEYDAT);FifoSaveData(&g_FifoMouseBuf, ucData);return;
}

获取鼠标状态

int MouseDecode(struct MOUSE_DEC * pMouse, unsigned char ucData)
{if(0 == pMouse->MousePhase){if(MOUSE_ACK == ucData){pMouse->MousePhase = 1;return 0;}}else if(1 == pMouse->MousePhase){if(0x08 == (ucData & 0xc8))//即X Y没有溢出{pMouse->MouseStatusBuf[0] = ucData;pMouse->MousePhase = 2;}return 0;}else if(2 == pMouse->MousePhase){pMouse->MouseStatusBuf[1] = ucData;pMouse->MousePhase = 3;return 0;}else if(3 == pMouse->MousePhase){pMouse->MouseStatusBuf[2] = ucData;pMouse->MousePhase = 1;pMouse->nButton = pMouse->MouseStatusBuf[0] & 0x07;//判断哪个键被按下了pMouse->nX = pMouse->MouseStatusBuf[1];pMouse->nY = pMouse->MouseStatusBuf[2];if(0 != (pMouse->MouseStatusBuf[0] & 0x10) )//即X方向发生了移动{pMouse->nX |= 0xffffff00;} if(0 != (pMouse->MouseStatusBuf[0] & 0x20) )//即Y方向发生了移动{pMouse->nY |= 0xffffff00;} pMouse->nY = -pMouse->nY;return 1;}}

总结

①首先要先开启键盘鼠标的中断
②初始化各自的缓冲区
③初始化键盘控制器,激活鼠标
④键盘,鼠标中断处理函数每次从 端口接受到一个字节放入到各自的缓冲区中
⑤调用鼠标解析函数来进行处理每次发来的三个字节,更改坐标,描绘鼠标

day078_鼠标动起来相关推荐

  1. 计算机无法 鼠标没反应,笔记本电脑鼠标动不了怎么办(鼠标没反应怎么解决)...

    笔记本电脑鼠标动不了怎么办(鼠标没反应怎么解决)鼠标和键盘一样,是辅助我们进行电脑操作的设备,使用没有鼠标的笔记本需要很长时间适应,使用鼠标比较方便,为笔记本配置了一个鼠标,但是比起台式机的鼠标,笔记 ...

  2. 卡通小人的眼睛跟着鼠标动

    来源 ,我做了一些改变. <!DOCTYPE html> <html lang="en"> <head><meta charset=&qu ...

  3. 电脑重装系统后鼠标动不了该怎么解决

    其实安装完成以后会发现自己的电脑卡顿或者是死屏了.重装系统后出现鼠标移动不了,多数情况下是鼠标的驱动在装系统的时候丢失或者或者说驱动与硬件不兼容.那么重装系统后鼠标动不了具体解决的方法小编这就告诉你. ...

  4. 计算机鼠标不会动,鼠标灯亮着却不会动怎么办 电脑鼠标动不了解决方法

    相信很多人遇到过鼠标灯亮着可是无论怎么动它,鼠标就是不移动,那遇到电脑鼠标动不了该怎么解决呢,今天就就为大家分享鼠标灯亮着鼠标不会动解决方法. 1.如果你的鼠标仍然亮着灯,那就代表,你的鼠标本身是没有 ...

  5. mastercam9.1标注尺寸点不到屏幕上 跟着鼠标动 确定不了

    mastercam9.1标注尺寸点不到屏幕上 跟着鼠标动 确定不了 解决方法: 输入法和软件有冲突,改变一下输入法

  6. 一步一步学做游戏 第二回:让蘑菇随鼠标动起来

    上回分析了游戏,在这一回我们将让蘑菇跟随鼠标动起来~ 达到这个效果: http://www.html5china.com/html5games/mogu/index1.html 一.写html代码 X ...

  7. 鼠标动不了(灯亮着)

    最近笔记本电脑的鼠标突然动不了了,但灯是亮着的,难道是我鼠标坏了?把鼠标拿到别人那里试了一下,可以呀!接口有问题吗?可是插入其他设备的时候明明也是正常的呀.那,可能是驱动出问题了. 1.打开控制面板, ...

  8. java 鼠标动眼睛动_鼠标效果系列教程:会动的眼睛

    这次我们要做的效果也非常漂亮,老头的眼睛会跟着你的鼠标转! ARAM NAME="_cx" VALUE="14552"> pluginspage=&quo ...

  9. 笔记本linux鼠标动不了怎么办,为什么笔记本鼠标动不了_笔记本电脑鼠标不动了怎么办-win7之家...

    作为笔记本电脑中的主要操作设备,鼠标的作用可谓是重中之重,许多用户由于使用不习惯触摸板,因此就会给自己的笔记电脑外接一个鼠标,然而对于连接完鼠标的笔记本在操作的时候却出现不能动的情况,那么为什么笔记本 ...

  10. 鼠标动效html,5种纯CSS3鼠标hover按钮动画效果

    这是一款鼠标hover按钮动画特效.该特效共有5种hover动画效果,它们在结构布局上使用flex来进行布局,并通过css transition来实现动画效果. 使用方法 HTML结构 该按钮特效使用 ...

最新文章

  1. 一起谈.NET技术,C#中int和System.Int32理解总结
  2. 可持久化链表(链式前向星)
  3. excel执行INSERT和UPDATE操作语句
  4. Java中的某些接口为什么没有任何方法?
  5. css什么是自适应布局,CSS自适应布局
  6. java svg 读取dom结构_SVG基础以及使用Javascript DOM操作SVG
  7. java 获取数据源_J2EE java 获取数据源
  8. java 中静态变量(类变量)与实例变量 静态方法与实例方法
  9. RFC 793翻译(TCP的主体内容)
  10. 20189216 2018-2019-2 《密码与安全新技术专题》课程总结报告
  11. [KM 树同构Hash DP] BZOJ 3197 [Sdoi2013]assassin
  12. 摄影构图学83年绝版_学手机摄影最好要知道的70条忠告!都是大实话
  13. 安卓模拟器安装教程_无限多开仙境传说RO!第一安卓模拟器BlueStacks蓝叠安卓模拟器多开教程...
  14. 云栖科技评论82期:乌镇上的产业新常态
  15. 红帽linux竞赛,浅谈红帽linux挑战赛(三)
  16. ant-design在 vue 抽屉(drawer)里面嵌套弹出框(modal)出现蒙层遮挡弹框问题
  17. events.js:174,throw er; //Unhandled ‘error‘ event
  18. 小鸡拿着蚯蚓闯关的java游戏,蚯蚓大闯关游戏下载|蚯蚓大闯关安卓版下载 v1.0.0 - 跑跑车安卓网...
  19. 计算机绘图培训心得,计算机绘图实习工作总结
  20. 一鸣心所向:张一鸣的平常心

热门文章

  1. 开源 java CMS - FreeCMS2.7 单位管理
  2. 如何获得Android手机的软件安装列表
  3. PHP与MySQL设计模式:代理模式
  4. Xcode 证书生成、设置、应用
  5. selenium+webDriver环境搭建和学习基础(java环境)
  6. TableView数据源方法的执行顺序
  7. Java菜鸟学习笔记--面向对象篇(十八):对象转型多态
  8. 微软打碎了周鸿祎的如意算盘
  9. iperf3怎么看结果_iperf3命令使用
  10. C# List集合排序、去重方法小结