【第7章】解析扫描码【三】
来源:互联网 发布:法布雷加斯助攻数据 编辑:程序博客网 时间:2024/06/07 05:23
现在就来处理开头是0xE0和0xE1的扫描码,我们看到开头是0xE1的扫描码的键只有pause键,而且这个键没有Break Code,我们就单独来处理它,由于这个键的扫描码有6个之多,那么需要在一次Keyboard_Read的调用把扫描码全部读进来,那么需要从缓冲区中把扫描码读进来的操作抽象成一个函数,由于此函数只在本文件中调用,所以加上一个static:
- static u8 Get_Byte_From_KB_Buffer()
- {
- u8 scan_code;
- while(kb_input_buffer.count <= 0){}
- Disable_Int();
- scan_code = *(kb_input_buffer.p_head);
- kb_input_buffer.p_head++;
- kb_input_buffer.count--;
- if(kb_input_buffer.p_head >= kb_input_buffer.buffer + 256)
- {
- kb_input_buffer.p_head = kb_input_buffer.buffer;
- }
- Enable_Int();
- return scan_code;
- }
有一点小的改变,就是原来的操作如果缓冲区没有扫描码就直接退出,这里加了一个while循环,如果缓冲区没有扫描码,就一直等待直到有为止。
然后在函数的开头用刚写好的函数从缓冲区中得到一个扫描码,再在if分支里添加操作来判断是否按下pause键,pause键的Make Code码为0xE1,0x1D,0x45,0XE1,0x9D,0xC5,写一个for循环拿取到的扫描码依次判断,如果为pause键盘就把key赋值为PAUSEBREAK宏定义的值,修改好的Keyboard_Read函数如下:
- void Keyboard_Read()
- {
- u8 scan_code;
- int make;
- char disp[2];
- u32 *key_row;
- u32 key = 0;
- int col = 0;
- Memory_Set(&disp[0],2,0);
- if(kb_input_buffer.count > 0)
- {
- scan_code = Get_Byte_From_KB_Buffer();
- if(scan_code == 0xe1)
- {
- int i;
- u8 pause_make_code[] = {0xe1,0x1d,0x45,0xe1,0x9d,0xc5};
- int is_pause = 1;
- for(i = 1 ; i < 6 ; i++)
- {
- if(Get_Byte_From_KB_Buffer() != pause_make_code[i])
- {
- is_pause = 0;
- break;
- }
- }
- if(is_pause)
- {
- key = PAUSEBREAK;
- }
- }
- else if(scan_code == 0xe0)
- {
- /* 暂时不做任何操作 */
- }
- else
- {
- make = (scan_code & NR_SCAN_CODES)? 0 : 1;
- key_row = &Key_Map[(scan_code & 0x7f) * MAP_COLS];
- if(Shift_L || Shift_R)
- {
- col = 1;
- }
- key = key_row[col];
- switch(key)
- {
- case SHIFT_L:
- Shift_L = make;
- key = 0;
- break;
- case SHIFT_R:
- Shift_R = make;
- key = 0;
- break;
- default:
- if(!make)
- {
- key = 0;
- break;
- }
- }
- }
- if(key)
- {
- disp[0] = key;
- Disp_Color_Str(disp,0xa);
- }
- }
- }
做了一个小改动,把显示的语句挪动了位置,以实验按下pause键后能显示些什么。为了能看到可输出的字符,在keyboard.h中把PAUSEBREAK宏改为0x61。
make,运行,按下pause键看看出现什么:
看到对应的输出了吧,呵呵。进度有点慢,哎,别着急,天气冷,取暖器和棉拖鞋买回来就舒服了。
- 【第7章】解析扫描码【三】
- 【第7章】解析扫描码【一】
- 【第7章】解析扫描码【二】
- 【第7章】解析扫描码【四】
- 【第7章】解析扫描码【五】
- 【第7章】解析扫描码【六】
- 【第7章】TTY【三】
- 图形点扫描解析
- Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(三)
- 第10章、名称解析
- Unity3d扫描 二维码 解析尝试
- JavaScript学习 第 三 章
- 第10章 DOM (三)
- 第12章 事件 (三)
- 《设计模式解析》 第7章 Adapter模式 复习题
- 全面解析查找技术数据结构第7章c++版
- 解析Oracle数据扫描 Oracle SQL查询优化 引导局部范围数据扫描的方法(7)
- C++ Primer学习笔记(三):第7章
- 大学计算机课程学习路线3
- 网络编程基础--入门
- 学习
- 第二章 线性表
- 地一篇日志
- 【第7章】解析扫描码【三】
- 要认真、要努力
- Java Servlet技术
- 学习的革命——杂谈程序员的学习力
- 指针
- 尝试用vim开发rails程序
- JSP技术
- Loadrunner性能测试工具系列视频教学!(学测试的朋友请进!
- 2009-11-18