• 《30天自制操作系统》08_day_学习笔记


    harib05a:
      鼠标解读(01)P145 前一天已经让鼠标成功接收数据了,这些数据是什么意思?
      笔者在这一部分来解读数据:让鼠标动起来啊,停在那不动有什么意思啊!
      前面已经知道,鼠标每一次动作都是3个字节数据,为什么是3个。想想也知道:两个坐标,一个状态

    if (mouse_phase == 0) {         /* 等待鼠标进入0xfa的状态。实际上就是等待控制器准备就绪 */
      if (i == 0xfa) {
      mouse_phase = 1;
      }
    } else if (mouse_phase == 1) {  /* 等待鼠标的第一个字节 */
      mouse_dbuf[0] = i;
      mouse_phase = 2;
    } else if (mouse_phase == 2) {  /* 等待鼠标的第二个字节 */
      mouse_dbuf[1] = i;
      mouse_phase = 3;
    } else if (mouse_phase == 3) {  /* 等待鼠标的第三个字节 */
      mouse_dbuf[2] = i;
      mouse_phase = 1;
                       /* 将这三个字节显示出来 */
      sprintf(s, "%02X %02X %02X", mouse_dbuf[0], mouse_dbuf[1], mouse_dbuf[2]);
      boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 8 * 8 - 1, 31);
      putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
    }

      看了上面的代码,细心的肯定会发现一个问题,鼠标每次动作产生3个字节数据:坐标X、Y、状态信息
      那么0xfa是什么东西?为什么有4个if的条件判断?不是3个字节的数据吗?
      ANS:我们回头看看鼠标中断程序;void enable_mouse(void)。(前一天的内容)发现没有,
          鼠标激活成功会返回一个ACK,这个ACK的值就是0xfa。他表示的意思就是:好的,我已经准备好了发送数据了。
    harib05b:
      标题:稍事整理\这部分没什么新的可讲的代码
      没错:笔者在这里就是对HzriMain做了一些整理;内容完全没有变化(不想看的也可以跳过这一部分)
        1、把解读鼠标所需要的变量整合到结构体MOUSE_DEC中了
        2、在鼠标中断处理程序enable_mouse(void)最后,把0xfa进行了处理,成功就绪返回1,这样便于鼠标数据接收和处理
      MOUSE_DEC{ unsigned char buf[3], phase };

    harib05c:
      鼠标解读(02)这里结构体MOUSE_DEC发生了一些变化:

    struct MOUSE_DEC { //x,y用来存放鼠标位置信息;btn存放状态信息。
      unsigned char buf[3], phase;
      int x, y, btn; 
    };
    int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) {
      if (mdec->phase == 0) {
      /* 等待鼠标的0xfa状态,接收到enable_mouse(void)的0xfa的ACK值,表示鼠标控制器以及就绪,可以传数据了。 */
      if (dat == 0xfa) {
      mdec->phase = 1;
      }
      return 0;
    }
    if (mdec->phase == 1) {
      /* 等待鼠标的第一字节状态 */
      if ((dat & 0xc8) == 0x08) {
      /* 对第一个字节的范围进行判断(0-3) */
        mdec->buf[0] = dat;
        mdec->phase = 2;
      }
      return 0;
    }
    if (mdec->phase == 2) {
      /* 等待鼠标的第二个字节第二个字节的范围(8-F) */
      mdec->buf[1] = dat;
      mdec->phase = 3;
      return 0;
    }
    if (mdec->phase == 3) {
        /* 第三个字节,最关键的部分,鼠标键的状态放在buf[0]的低3位 */
      mdec->buf[2] = dat;
      mdec->phase = 1;
      mdec->btn = mdec->buf[0] & 0x07; //buf[0]&0000 0111取出buf[0]的低3位,鼠标状态信息
      mdec->x = mdec->buf[1]; //取出鼠标的坐标信息
      mdec->y = mdec->buf[2];
    if ((mdec->buf[0] & 0x10) != 0) {  mdec->x |= 0xffffff00;  }
    if ((mdec->buf[0] & 0x20) != 0) {  mdec->y |= 0xffffff00;  }
      mdec->y = - mdec->y; /* y坐标的方向,鼠标和画面符号是相反的 */
      return 1;
      }
      return -1; //获取鼠标信息失败了
    }

      接下来修改鼠标的显示部分:

    //原理:用if语句将s的值置换成相应的字符串即可
    if (mouse_decode(&mdec, i) != 0) {
      sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
      if ((mdec.btn & 0x01) != 0) { s[1] = 'L';}
      if ((mdec.btn & 0x02) != 0) { s[3] = 'R';}
      if ((mdec.btn & 0x04) != 0) { s[2] = 'C';}
      boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31);
      putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);
    } //接下来输出字符串s就可以了:

    harib05d:
      如何让鼠标在屏幕上动起来?
      上面我们已经搞定了鼠标移动时的坐标位置,我们其实已经把鼠标的图像给显示出来了;
      接下来:我们按照这个坐标值,不断的刷新鼠标的显示就行了
      原   理:每次鼠标中断读取的鼠标信息给鼠标图形显示函数putfonts8_asc()
          我们来看看笔者是怎么修改的:

    if (mouse_decode(&mdec, i) != 0) {  /* 显示鼠标数据的三个字节 */
        sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
        if ((mdec.btn & 0x01) != 0) {     s[1] = 'L';    } //如果btn的最后一位为1
        if ((mdec.btn & 0x02) != 0) {    s[3] = 'R';     } //如果btn的倒数第三位为1  
        if ((mdec.btn & 0x04) != 0) {     s[2] = 'C';    } //如果btn的倒数第四位为1
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31); //显示界面下面的白条
        putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s);              //鼠标指针的移动
        //这个东西是干嘛的啊??隐藏鼠标
        //当鼠标坐标移到下面的白条的时候。如果上面叠加了鼠标的图像将会变得很乱,
        //在这里,当鼠标位置移到下面的时候,将其位置放在白条的上方
        //就像我们桌面上,鼠标指针移到最下方,始终在任务栏的上方(一个道理)
        boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); 
        mx += mdec.x;
        my += mdec.y;
        if (mx < 0) {     mx = 0;    }                                 //检测x坐标越界到最小
       if (my < 0) { my = 0; } //检测y坐标越界到最小 if (mx > binfo->scrnx - 16) { mx = binfo->scrnx - 16; } //检测x坐标越界到最大 if (my > binfo->scrny - 16) { my = binfo->scrny - 16; } //检测x坐标越界到最大 sprintf(s, "(%3d, %3d)", mx, my);                  //输出字符串 boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); /* 隐藏坐标 */ putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); /* 显示坐标 */ putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); /* 描画坐标 */ }

       还有一点明天再写吧!真心费时间。。。。。。。。。。。

  • 相关阅读:
    python中取列表的后半部分元素
    python中列表分片
    python中统计列表中元素出现的次数
    python中range()函数用法
    pyhton中实现列表元素顺序颠倒
    python中列表元素求交集和并集
    python中编写抽奖小游戏
    python中删除列表元素
    python中列表的去重复和取重复
    欲为Java技术大牛所需的25个学习要点
  • 原文地址:https://www.cnblogs.com/pengfeiz/p/5789251.html
Copyright © 2020-2023  润新知