精华内容
下载资源
问答
  • 电脑触摸屏上的鼠标事件触发

    千次阅读 2014-02-24 21:59:30
    前段时间做的录音小软件因为最终要在电脑触摸屏上使用,测试过程中发现出错,原来一直按着触摸屏的屏幕是点击右键,并且在多次测试的过程中发现触摸屏对一直按着屏幕弹起这个过程没有任何事件触发,这使得我先前编写...
           前段时间做的录音小软件因为最终要在电脑触摸屏上使用,测试过程中发现出错,原来一直按着触摸屏的屏幕是点击右键,并且在多次测试的过程中发现触摸屏对一直按着屏幕弹起这个过程没有任何事件触发,这使得我先前编写的录音小软件根本无法应用,最后跟触摸屏生产厂商沟通,得知,原来它的触摸屏出厂的时候确实是这样,对于不同用户的需要他们会进行升级,升级后可以根据用户的需求进行设置,最后得以解决,遇到问题的时候不要盲目的去修改什么,一定要找到这个问题或者说这种现象出现的本质在哪里,找到地方再去进行解决,盲目的去解决不但解决不了问题而且还会浪费时间,谨此告诫自己。
    
    展开全文
  • 触摸屏驱动

    2015-09-09 20:50:32
    下面讲的是基于Mini2440的触摸屏驱动,现在的驱动我们都将设备和驱动分离,挂在平台设备总线,让设备和驱动去匹配。而我们在linu2.6.32.2内核版本中的触摸屏驱动仍然没有将设备和驱动分离,这样就不存在匹配问题,...


    一.触摸屏理论概述

    对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基于Mini2440的触摸屏驱动,现在的驱动我们都将设备和驱动分离,挂在平台设备总线上,让设备和驱动去匹配。而我们在linu2.6.32.2内核版本中的触摸屏驱动仍然没有将设备和驱动分离,这样就不存在匹配问题,这种现象其实我们并不陌生,在我们学习驱动的前期,都会研究简单字符驱动代表LED驱动,那个驱动就是把设备和驱动写在了一起。总结下,驱动和设备可以分离也可以不分离,建议分离,而本触摸屏驱动没有分离设备和驱动,有兴趣可以将设备和驱动进行分离。

     

    先说明下触摸屏的工作原理,当有人在触摸屏上按下触笔时,触摸屏的四个引脚会产生不同的电压值,这样触摸屏控制器就能检测到这种变化,从而产生INT_TC中断,表示触笔按下。然后在得到CPU指示的情况下,触摸屏控制器可以根据四个引脚上产生的不同电压值进行AD转换,从而计算出XY坐标的数值,并在将这两个值保持到其内部寄存器后,发出INT_ADC中断,表示坐标转换已完成,从而软件就可以读取按下触笔的位置。

     

    二.触摸屏驱动分析

    本驱动分析很有特点,我对触摸屏驱动的分析是按照整个触摸事件的执行顺序进行代码分析的,有的函数由于每次被执行完成的任务不同,所以需要多次分析。同时,我把整个触摸事件的来龙去脉也都说的很清楚了。

    驱动分析/driver/input/touchscreen/s3c2410_ts.c

    static int __init s3c2410ts_init(void)

    {

           struct input_dev *input_dev;

           adc_clock = clk_get(NULL, "adc");  //获取时钟

           if (!adc_clock) {

                  printk(KERN_ERR "failed to get adc clock source\n");

                  return -ENOENT;

           }

           clk_enable(adc_clock);   //使能时钟

           base_addr=ioremap(S3C2410_PA_ADC,0x20);  //物理地址转为虚拟地址

           if (base_addr == NULL) {

                  printk(KERN_ERR "Failed to remap register block\n");

                  return -ENOMEM;

           }

           s3c2410_ts_connect();  //触摸屏端口配置

       //使能预分频,分频系数为0xff

      iowrite32(S3C2410_ADCCON_PRSCEN| S3C2410_ADCCON_PRSCVL(0xFF),base_addr+S3C2410_ADCCON);

           iowrite32(0xffff,  base_addr+S3C2410_ADCDLY); //延时

       //检查光标按下中断信号,等待中断

           iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

           input_dev = input_allocate_device();  //分配input设备

           if (!input_dev) {

                  printk(KERN_ERR "Unable to allocate the input device !!\n");

                  return -ENOMEM;

           }

           dev = input_dev;

           //支持按键事件、坐标事件

           dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);

           dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);

           //对于X轴范围是0-ox3ff,数据误差是0,中心平滑位置是0

           input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0);

           input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0);

           input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0);

           dev->name = s3c2410ts_name;

           dev->id.bustype = BUS_RS232;

           dev->id.vendor = 0xDEAD;

           dev->id.product = 0xBEEF;

           dev->id.version = S3C2410TSVERSION;

            //申请AD转换中断

    if(request_irq(IRQ_ADC,stylus_action,IRQF_SHARED|IRQF_SAMPLE_RANDOM,"s3c2410_action", dev)) {

                  printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_ADC !\n");

                  iounmap(base_addr);

                  return -EIO;

           }

           //申请触摸中断

           if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,

                         "s3c2410_action", dev)) {

                  printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");

                  iounmap(base_addr);

                  return -EIO;

           }

           printk(KERN_INFO "%s successfully loaded\n", s3c2410ts_name);

           input_register_device(dev);

           return 0;

    }

     

    下面是这个模块加载函数中调用的一个配置端口函数

    static inline void s3c2410_ts_connect(void)

    {

    //将触摸屏用到的四个端口配置成触摸屏模式

           s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON);

           s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON);

           s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON);

           s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON);

    }

     

    我们来分析两种情况,第一种情况,如果没有按下触摸屏

    驱动中定义了一个定时器

    static struct timer_list touch_timer =

                  TIMER_INITIALIZER(touch_timer_fire, 0, 0);

    因为这个定时器的期限时间设置为0,这表示当驱动加载后就会执行一次定时函数touch_timer_fire

    static void touch_timer_fire(unsigned long data)

    {

         unsigned long data0;

         unsigned long data1;

           int updown;

         data0 = ioread32(base_addr+S3C2410_ADCDAT0);  //读取X坐标

         data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //读取Y坐标

          updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //触摸屏是否被按下,如果按下updowm=1

          if (updown) {

                 if (count != 0) {

                         long tmp;                                                                                        

                         tmp = xp;

                         xp = yp;

                         yp = tmp;                                                                                        

               xp >>= 2;

               yp >>= 2;

                        input_report_abs(dev, ABS_X, xp);

                        input_report_abs(dev, ABS_Y, yp);

                        input_report_key(dev, BTN_TOUCH, 1);

                        input_report_abs(dev, ABS_PRESSURE, 1);

                        input_sync(dev);

                 }

                 xp = 0;    

                 yp = 0;

                 count = 0;

                 iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

                 iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

          } else { //没有被按下

                 count = 0;        //初始化count0,表示当前AD转换没发生

                 input_report_key(dev, BTN_TOUCH, 0);  //input子系统报告未按下

                 input_report_abs(dev, ABS_PRESSURE, 0);

                 input_sync(dev);

                 iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC); //等待按键中断

                  if (OwnADC) { //OwnADC是获取一把锁标示,在此为0

                         OwnADC = 0;

                         up(&ADC_LOCK);

                  }

          }

    }

     

    第二种情况,如果触摸屏被按下,首先触发触摸中断,执行stylus_updown函数

    static irqreturn_t stylus_updown(int irq, void *dev_id)

    {

           unsigned long data0;

           unsigned long data1;

           int updown;

           if (down_trylock(&ADC_LOCK) == 0) {  //获取一把锁

                  OwnADC = 1;       //表示获得锁

                  data0 = ioread32(base_addr+S3C2410_ADCDAT0); //读取X轴数据

                  data1 = ioread32(base_addr+S3C2410_ADCDAT1); //读取Y轴数据

                  updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //触摸屏是否被按下,按下updowm=1

                  if (updown) {

                         touch_timer_fire(0);  //如果触摸屏被按下,执行touch_timer_fire

                  } else {  //去抖动操作,释放锁

                         OwnADC = 0;

                         up(&ADC_LOCK);

                  }

           }

           return IRQ_HANDLED;

    }

     

    下面我们第二次分析touch_timer_fire,而这次主要是因为触摸中断中调用了这个函数,假设当前触摸屏被按下后,坐标值还没进行AD转换

    static void touch_timer_fire(unsigned long data)

    {

         unsigned long data0;

         unsigned long data1;

           int updown;

         data0 = ioread32(base_addr+S3C2410_ADCDAT0);

         data1 = ioread32(base_addr+S3C2410_ADCDAT1);

          updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));

          if (updown) {  //触摸屏被按下

                 if (count != 0) { //count是全局变量,统计AD转换次数,目前未AD转换

                         long tmp;                                                                                        

                         tmp = xp;

                         xp = yp;

                         yp = tmp;                                                                                         

               xp >>= 2;

               yp >>= 2;

                        input_report_abs(dev, ABS_X, xp);

                        input_report_abs(dev, ABS_Y, yp);

                        input_report_key(dev, BTN_TOUCH, 1);

                        input_report_abs(dev, ABS_PRESSURE, 1);

                        input_sync(dev);

                 }

                 xp = 0;      //虽然触摸屏被按下,但是未完成AD转换

                 yp = 0;

                 count = 0;

                 //自动连续测量XY坐标

    iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

    //AD转换开始且该位在开始后清零

                 iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

          } else {

                 count = 0;

                 input_report_key(dev, BTN_TOUCH, 0);

                 input_report_abs(dev, ABS_PRESSURE, 0);

                 input_sync(dev);

                 iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

                  if (OwnADC) {

                         OwnADC = 0;

                         up(&ADC_LOCK);

                  }

          }

    }

     

    现在我们知道,如果触摸屏被按下,但是AD还没转换完毕,那么我们会开启AD转换,自动测量XY坐标,这样就会触发AD转换中断,执行AD转换的中断处理程序。其实当我们的触摸屏被按下,当XY轴获取电压值,然后就会进行AD转换,执行AD转换的中断处理程序。好了,我们该看看AD转换的中断代码了。

    static irqreturn_t stylus_action(int irq, void *dev_id)

    {

           unsigned long data0;

           unsigned long data1;

           if (OwnADC) { //只有触摸屏被按下,相应了触摸中断该标志才为1

                  data0 = ioread32(base_addr+S3C2410_ADCDAT0); //读取X坐标

                  data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //读取Y坐标

                  xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;//叠加X坐标

                  yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;//叠加Y坐标

                  count++;  //统计AD转换次数

               if (count < (1<<2)) { //如果AD转换次数不足4

                         //自动连续测量XY坐标

     iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

    //AD转换开始且该位在开始后清零

    iowrite32(ioread32(base_addr+S3C2410_ADCCON) |S3C2410_ADCCON_ENABLE_START,base_addr+S3C2410_ADCCON);

                  } else {

                         mod_timer(&touch_timer, jiffies+1); //四次AD转换后,修改定时时间

                         iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);//等待释放

                  }

           }

           return IRQ_HANDLED;

    }

    在这个AD转换的中断程序中,有一个全局变量count令人费解,count是什么作用呢?我们做AD转换时,其实是对一个点进行了四次采样,然后把四次采样结果进行叠加然后取平均。这样提高AD转换的精确度。在上面这个AD转换的中断处理程序中,我们知道,当count不足4次时,会继续进行自动连续测量XY坐标并开启AD转换,只有当AD转换次数达到四次后,就会修改定时器的时间,使得下一个节拍到来时执行定时器处理程序,并且等待按键被释放。当AD转换完毕,我们在下一个节拍到来后,会执行一次定时器程序touch_timer_fire

    static void touch_timer_fire(unsigned long data)

    {

         unsigned long data0;

         unsigned long data1;

           int updown;

         data0 = ioread32(base_addr+S3C2410_ADCDAT0);

         data1 = ioread32(base_addr+S3C2410_ADCDAT1);

          updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));

          if (updown) {  //触摸屏被按下

                 if (count != 0) { //count是全局变量,统计AD转换次数,目前已经4

                         long tmp;                                                                                        

                         tmp = xp;

                         xp = yp;

                         yp = tmp;  // XY轴数据交换                                                                                   

               xp >>= 2; //因为对同一个点采样四次,这里对X轴取平均

               yp >>= 2; //因为对同一个点采样四次,这里对Y轴取平均

                        input_report_abs(dev, ABS_X, xp); //报告X坐标

                        input_report_abs(dev, ABS_Y, yp); //报告Y坐标

                        input_report_key(dev, BTN_TOUCH, 1); //报告触摸事件

                        input_report_abs(dev, ABS_PRESSURE, 1);

                        input_sync(dev); //同步

                 }

                 xp = 0;     //清零

                  yp = 0;

                 count = 0;

                 //自动连续测量XY坐标

    iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

    //AD转换开始且该位在开始后清零

                 iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

          } else {

                 count = 0;

                 input_report_key(dev, BTN_TOUCH, 0);

                 input_report_abs(dev, ABS_PRESSURE, 0);

                 input_sync(dev);

                 iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

                  if (OwnADC) {

                         OwnADC = 0;

                         up(&ADC_LOCK);

                  }

          }

    }

    这里首先解释下,为什么要对XY坐标值交换,因为我们的X35LCD屏是240*320的,为了满足用户“X轴长Y轴短”的习惯,在此进行XY坐标值交换,当然在此不交换,不会影响触摸屏驱动的运行。

    我们这次分析这个定时器touch_timer_fire,最终发现我们不但向input子系统报告了我们的坐标值,还对坐标变量和统计AD转换次数变量清零,最后还打开了AD转换开关,既然这次触摸事件已经结束,那么这里怎么还打开AD转换开关呢?其实,如果你足够细心,你会发现,虽然AD开关打开了,然后会执行AD转换的中断处理程序,一旦进入AD转换,肯定也是转换四次,然后在下一个节拍到来时,执行定时程序,最关键的是,此时我们的触摸屏按键已经释放了,在这一的背景下,我们再次跟踪定时函数touch_timer_fire

    static void touch_timer_fire(unsigned long data)

    {

         unsigned long data0;

         unsigned long data1;

           int updown;

         data0 = ioread32(base_addr+S3C2410_ADCDAT0);  //读取X坐标

         data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //读取Y坐标

          updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //触摸屏是否被按下,如果按下updowm=1

          if (updown) {

                 if (count != 0) {

                         long tmp;                                                                                        

                         tmp = xp;

                         xp = yp;

                         yp = tmp;                                                                                        

               xp >>= 2;

               yp >>= 2;

                        input_report_abs(dev, ABS_X, xp);

                        input_report_abs(dev, ABS_Y, yp);

                        input_report_key(dev, BTN_TOUCH, 1);

                        input_report_abs(dev, ABS_PRESSURE, 1);

                        input_sync(dev);

                 }

                 xp = 0;    

                 yp = 0;

                 count = 0;

                 iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

                 iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

          } else { //没有被按下

                 count = 0;        //初始化count0,表示当前AD转换没发生

                 input_report_key(dev, BTN_TOUCH, 0);  //input子系统报告未按下

                 input_report_abs(dev, ABS_PRESSURE, 0); //触摸屏是抬起状态

                 input_sync(dev);

                 iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC); //等待按键中断

                  if (OwnADC) { //OwnADC是获取一把锁标示,在此为1

                         OwnADC = 0;              //该锁标志为0,表示释放该锁

                         up(&ADC_LOCK); //释放锁

                  }

          }

    }

    好了,一旦释放了锁,那么我们触摸屏事件的一个生命周期才真正算分析结束了,不过在此还有一个问题没有解决,就是当我们触摸屏按键被释放后,其实也会产生一个按键中断,执行触摸中断程序,不过在这个程序中起初是为了获得一个信号量,由于信号量是等待锁,所以,程序一直在试图获取这个信号量,当我们的信号量在上面这个touch_timer_fire中被释放后,我们就会再次获取这个信号量,继续跟踪这个触摸中断函数stylus_updown

    static irqreturn_t stylus_updown(int irq, void *dev_id)

    {

           unsigned long data0;

           unsigned long data1;

           int updown;

           if (down_trylock(&ADC_LOCK) == 0) { //再次获取锁

                  OwnADC = 1;

                  data0 = ioread32(base_addr+S3C2410_ADCDAT0);

                  data1 = ioread32(base_addr+S3C2410_ADCDAT1);

                  updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));

                  if (updown) {   //因为是释放操作,所以updowm=0

                         touch_timer_fire(0);

                  } else {

                         OwnADC = 0;

                         up(&ADC_LOCK);   //释放锁

                  }

           }

           return IRQ_HANDLED;

    }

    好了,这样我们就真正结束了一次触摸时间的周期。

    总结下触摸屏控制的整个运行过程:

    Step1:软件开启INT_ADCINT_TS中断,设置ADCCON以确定AD转换需要的时钟频率,设置ADCDLY以确定从得到命令到开始转换坐标的延时时长,设置ADCTSC使得触摸屏处于等待触笔按下状态

    Step2:当触笔按下,产生INT_TC中断,执行stylus_updownstylus_updown首先判断中断产生的原因是不是触笔按下,是的话就调用定时函数touch_timer_fire,在touch_timer_fire中设置ADCTSC使得触摸屏准备进行自动X/Y轴转换状态,然后设置ADCCON启动坐标转换,结束stylus_updown

    Step3:触摸屏在延迟指定时间后开始转换X/Y坐标,并将转换的结果保存到ADCDAT0ADADAT1中,完成后发出INT_ADC中断,表示转换完成。

    Step4:进入INT_ADC中断处理程序stylus_action,获取X/Y轴坐标,然后进行四次坐标转换以求平均值,最后设置ADCTSC使得触摸屏处于等待触笔释放状态,同时当下一个节拍到来时,调用touch_timer_fireinput子系统报告坐标。

    Step5:当触笔释放,还会产生INT_TC中断,进入其中断处理程序,得到触笔释放的消息,最后设置ADCTSC使得触摸屏处于下一次等待触笔按下状态。

     

    三.触摸屏驱动测试

    由于mini2440的触摸屏驱动是基于input子系统的,而input子系统给用户层提供的是input_event结构体,我们主要是在应用层接收这个结构体,然后对其类型进行分类,取出我们需要的数值。

    struct input_event { struct timeval time;

           unsigned short type;  //支持的类型,如EV_ABS

           unsigned short code;   //支持的具体事件,如坐标事件的ABS_X

           unsigned int value;  //

    };

    测试触摸屏驱动的应用层代码如下

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <linux/input.h>

    #include <sys/fcntl.h>

    int main(int argc, char *argv[])

    {

           int fd = -1;

           int num;

           size_t rb;

           int version;

           char name[20];

           struct input_event ev;

           int i=0;

           if ((fd = open("/dev/input/event0", O_RDONLY)) < 0)  //打开设备

           {

                  perror("open error");

                  exit(1);

           }

           while(1)

           {

                  rb = read(fd, &ev, sizeof(struct input_event));  //读取设备

                  if (rb < (int)sizeof(struct input_event))  //读取错误

                  {

                         perror("read error");

                         exit(1);

                  }

                  if (EV_ABS==ev.type)                     //读取按键内容

                  {

                  printf("event=%s,value=%d\n",ev.code==ABS_X?"ABS_X":ev.code==ABS_Y?"ABS_Y":ev.code==ABS_PRESSURE?"ABS_PRESSURE":"UNKNOWEN",ev.value);     

                  }else{

                  printf("not ev_abs\n");        

                  }

           }    

            close(fd);

           return 0;

    }

     

    编译测试程序test.c

    arm-linux-gcc test.c –o test

    超级终端:

    ./test

    测试结果:(触笔按下触摸屏)

    event=ABS_X, value=505

    event=ABS_Y, value=334

    event=ABS_PRESSURE, value=1

     

    展开全文
  • 修改系统文件触摸屏反了Every file on your computer has a timestamp, which contains the access and modification time for a file, but did you know that you can change that timestamp? Here’s how to do it...
    修改系统文件触摸屏反了

    修改系统文件触摸屏反了

    Lead Image

    Every file on your computer has a timestamp, which contains the access and modification time for a file, but did you know that you can change that timestamp? Here’s how to do it.

    您计算机上的每个文件都有一个时间戳,其中包含文件的访问和修改时间,但是您知道可以更改该时间戳吗? 这是操作方法。

    使用触摸命令 (Using the Touch Command)

    The “touch” command is available pretty much anywhere that you can get the Bash shell, which includes Linux or Windows with Cygwin installed. Here’s the options for the command:

    在任何可以获得Bash shell的地方,几乎都可以使用“ touch”命令,包括安装了CygwinLinux或Windows。 这是命令的选项:

    Tocuh options table

    If you want to check the file timestamp, you can do so with this command:

    如果要检查文件时间戳,可以使用以下命令:

    stat file

    统计文件

    Obviously you should make sure to replace “file” with your file’s name.

    显然,您应该确保将“ file”替换为文件名。

    -a和-m选项 (-a and -m options)

    These two options update the access and modification time respectively. Using them should be no problem at all. Here is the syntax:

    这两个选项分别更新访问和修改时间。 使用它们应该完全没有问题。 语法如下:

    touch –a file

    触摸–文件

    This will update “file”s access time to the current date and time. You can replace the (-a) options with (-m) to do the same but for the modification time. If the file doesn’t exist, an empty file with the same name will be created in the current directory.

    这会将“文件”的访问时间更新为当前日期和时间。 您可以将(-a)选项替换为(-m)以进行相同的操作,但要进行修改。 如果该文件不存在,则将在当前目录中创建一个具有相同名称的空文件。

    -c选项 (-c option)

    If you use this option, touch won’t do anything at all if the file specified doesn’t exist. Look:

    如果使用此选项,则在指定的文件不存在的情况下,touch根本不会执行任何操作。 看:

    touch –c omar

    触摸–c omar

    In the above example touch will do nothing as “omar”, the file not the person, doesn’t exist.

    在上面的示例中,touch不会执行任何操作,因为“ omar”(不是人的文件)不存在。

    -r选项 (-r option)

    This option might come in handy if you want to copy a timestamp from a file to another file. Like so:

    如果要将时间戳从文件复制到另一个文件,此选项可能会派上用场。 像这样:

    touch –r file1 file2

    触摸–r file1 file2

    Where “file1” is the reference file and “file2” is the file that will be updated. If you want to copy the timestamp to more than one file you can provide them all in the command as well and they will be created simultaneously.

    其中“ file1”是参考文件,“ file2”是将要更新的文件。 如果要将时间戳复制到多个文件中,则也可以在命令中同时提供它们,并且它们将同时创建。

    touch –r file1 file2 file3 file4

    触摸–r file1 file2 file3 file4

    -d和–t选项 (-d and –t options)

    Both (-d) and (-t) options do the same thing, which is setting the same arbitrary timestamp for access and modification times. The difference is that (-d) uses free format human readable date, this means that you can use “Sun, 29 Feb 2004 16:21:42” or “2004-02-29 16:21:42” or even “next Thursday”. This option is complex to fully describe it here. On the other hand (-t) uses a simple stamp that you are confined to use. The stamp is [[CC]YY]MMDDhhmm[.ss]. [CC] is for century and you may ignore it and ignore the seconds as well. If you ignore [CC] the command will substitute it depending on what you enter as year. If you specify the year with only two digits, then CC is 20 for years in the range (0~68) and 19 for years in (69~99).

    (-d)和(-t)选项都具有相同的作用,即为访问和修改时间设置相同的任意时间戳。 区别在于(-d)使用自由格式的人类可读日期,这意味着您可以使用“ Sun,29 Feb 2004 16:21:42”或“ 2004-02-29 16:21:42”甚至“ next”星期四”。 此选项很复杂,无法在此处完整描述。 另一方面(-t)使用一个仅限您使用的简单图章。 标记是[[CC] YY] MMDDhhmm [.ss]。 [CC]用于世纪,您可以忽略它,也可以忽略秒。 如果忽略[CC],该命令将根据您输入的年份替换它。 如果仅用两位数字指定年份,则对于(0〜68)范围内的年份,CC为20,对于(69〜99)范围内的年份,CC为19。

    touch –t 3404152240 file

    触摸–t 3404152240文件

    touch –t 8804152240 file

    触摸–t 8804152240文件

    In the first command the file timestamps will be set to: 15th April 2034 10:40 PM. While the second command will set it to: 15th April 1988 which is in a different century. If no year is specified it will be set to the current year. Example:

    在第一个命令中,文件时间戳记将设置为:2034年4月15日晚上10:40。 第二个命令将其设置为:1988年4月15日,这是一个不同的世纪。 如果未指定年份,则将其设置为当前年份。 例:

    touch –t 04152240 file

    触摸–t 04152240文件

    This will set the timestamp to 15th April 2011 10:40 PM because it is 2011 by the time of writing this article.

    这将把时间戳设置为2011年4月15 10:40 PM,因为在撰写本文时是2011年。

    组合选项以设置任意的个人访问和修改时间 (Combining Options to Set Arbitrary Individual Access and Modification Times)

    The (-a) and (-m) options only updates the timestamps to current time and the (-d) and (t) options sets both access and modification timestamps to the same time. Assume you only only want to set the access time to the 5th of June 2016 at 5:30 PM, How would you do that? Well, you’ll use (-a) and (-t) to both set an arbitrary time and apply it only for the access timestamp. Example:

    (-a)和(-m)选项仅将时间戳更新为当前时间,而(-d)和(t)选项将访问和修改时间戳设置为同一时间。 假设你只有唯一想设置的访问时间5 2016六下午5:30,你会怎么做? 好了,您将使用(-a)和(-t)来设置一个任意时间,并将其仅应用于访问时间戳。 例:

    touch –at 1606051730 file

    触摸–at 1606051730文件

    or

    要么

    touch –a -t 1606051730 file

    触摸–a -t 1606051730文件

    And if you want to do the same for the modification time just substitute (-at) with (-mt). It’s easy.

    如果要在修改时间执行相同操作,只需将(-at)替换为(-mt)。 这简单。

    创建空文件 (Creating Empty Files)

    The second and most famous usage of the touch command is creating empty files. This might sound stupid, why would anyone sensibly overload his computer with empty nonsense files but it really comes to use when, for example, you are working on a project and want to keep track of progress with dates and times. So you’ll have a folder with the project’s name and use touch to create empty files with the events as names of file. In other words, you can use it to create logs. Example:

    touch命令的第二个最著名的用法是创建空文件。 这听起来可能很愚蠢,为什么有人会用空的废话文件明智地使计算机超载,但在例如正在处理项目并希望跟踪日期和时间的进度时,它才真正有用。 因此,您将拥有一个包含项目名称的文件夹,并使用touch创建以事件为文件名的空文件。 换句话说,您可以使用它来创建日志。 例:

    touch ~/desktop/project/stage1_completed

    触摸〜/ desktop / project / stage1_completed

    Now you have a file signifying the completion of stage 1 of the project at the time of creating this file and you can see this time by issuing the command:

    现在,您有一个文件,表示在创建此文件时项目第一阶段的完成,并且可以通过发出以下命令来查看该时间:

    stat ~/desktop/project/stage1_completed

    stat〜/ desktop / project / stage1_completed



    You can find touch useful in different ways depending on what you do. If you know more good uses for touch then share it in the comments or read more about the touch command by visiting its man page online or in a terminal by issuing the command “man touch”.

    您可以根据自己的工作以不同的方式找到有用的触摸。 如果您知道触摸的更多好处,请在注释中分享它,或者通过在线访问其手册页或在终端中发出“ man touch”命令来阅读有关touch命令的更多信息。

    翻译自: https://www.howtogeek.com/74667/how-to-use-touch-to-create-empty-files-and-modify-timestamps/

    修改系统文件触摸屏反了

    展开全文
  • 西门子精简触摸屏如何设置时间格式为24小时制?
  • STM32F103实时时钟触摸屏显示及按键调节
  • 威纶通触摸屏使用手册,MT8071iE_DataSheet_CHS..pdf,使用教程,详细的介绍MT8071iE的步骤和方法,简单易懂,配置简单,使用方便
  • 使用Tslib在触摸屏上显示汉字

    千次阅读 2011-06-03 15:13:00
    终于到了在触摸屏上显示汉字了,真正写代码、测试的时间是1天,在此之前的一切准备、学习花费约2周到3周时间。而为了获取触摸屏上显示的图像,花费约2天。由于网络驱动已经接近于放弃状态,NFS用不了,只好用U盘来回...

    终于到了在触摸屏上显示汉字了,真正写代码、测试的时间是1天,在此之前的一切准备、学习花费约2周到3周时间。而为了获取触摸屏上显示的图像,花费约2天。由于网络驱动已经接近于放弃状态,NFS用不了,只好用U盘来回复制(即使没有耐心也必须有耐心了)。明明在内核中选择了支持NTFS格式的读写,但却不能将开发板上的文件复制到U盘,而用另一个FAT32格式的另一牌子的U盘,开发板死活认不出来,网上的资料说要修改代码,我又懒得去改。无奈之下,只好格式化那个NTFS的U盘,结果,这篇文章拖到现在才发表。

     

    郑重说明:

    本文作者在本文及前面的文章中没有提及作者的工作内容、工作时间、业余时间及业余生活,因为在这些文章中涉及那些工作、生活内容是不明智的。这些文章并没有任何迹象表明作者没有工作、没有业余生活,也并没有表明作者只生活在写代码中。

     

    免责声明:

    本文是作者在研究过程中的一篇文章,本着互联网共享、自由(free,应该不是“免费”)之精神发布于此。本文使用的是Tslib中的代码,并在此基础上添加自己的代码,关于Tslib,作者已经写过很多篇相关的文章了,这里公布的仅仅是自己添加的代码。作者对文中代码没有任何义务,仅因为Tslib使用GPL协议,本文作者必须使用这个协议。作者才疏学浅,孤陋寡闻,能力有限,文中错误的地方,欢迎在文后留言,趁作者还有激情研究之时,大家一直探讨,共同学习,天天向上。

    再声明一点,本文作者在S3C2440芯片的开发板上,使用最新下载的tslib,使用汉字字库HZK16、HZK24*,通过自己写的代码,在开发板自带的触摸屏上显示汉字。但是,并没有在其它的测试环境、平台下进行测试。

     

    关于汉字显示的算法(其实没啥算法)、步骤已经在前面的文章说了很多了,此处不再提及。

     

    由于还没有对autotool进行研究,而Tslib又使用这个工具管理代码,因此不懂如何添加新文件,如果让新文件也能编译。只好在原来的原来的文件中添加代码了。添加的代码的函数声明在fbutils.h中,函数定义在fbutils.c文件中,测试代码在ts_test.c中。

    代码修改了约三次,基本上都是一些结构上的调整,就不说那些体面的话了。至于真正改动之处,只在最底层的显示字符的代码修改了几个地方,就是将原来的乘法改为移位,而对其它一些地方的乘法及移位测试时,发现没什么区别,因此保留乘法。举一例,如

    offset = (*ascii - 0x20 ) * 16;

    就没有改为

    offset = (*ascii - 0x20 ) << 4;

    前者更能让人明白这里的ASCII字符在字库数组中占用16字节,而左移4位,的确让人不知道有什么含义。

     

    已知bug:

    1、不在GB2312范围之内的汉字不能正常显示——这是废话,正如在en_US字符集下显示中文一样。

    2、UCDOS的HZK24*系列字库文件没有中文字符,像“◆ □ ■ △ ▲”等在16点阵下显示正常,而在24点阵中显示失败(乱码或其它汉字),网上找不到包括完整的中文字符的字库,另外,不知道使用UCDOS的字库算不算侵权(这些东西都可以在网络下载)。

     

    函数声明:

    /* new add by Late Lee */
    /* ascii code */
    void put_string_ascii(int x, int y, char *s, unsigned colidx);
    void put_string_center_ascii(int x, int y, char *s, unsigned colidx);
    /* cineses character */
    void put_string_hz(FILE *fp, int x, int y, unsigned char *s, unsigned colidx);
    void put_string_center_hz(FILE *fp, int x, int y, unsigned char *s, unsigned colidx);
    /* chineses character & ascii */
    void put_font(FILE *fp, int x, int y, unsigned char *s, unsigned colidx);
    void put_font_center(FILE *fp, int x, int y, unsigned char *s, unsigned colidx);
    /* end of new add */

     

    测试代码(ts_test.c):

    static FILE *fp;  /* HZK file pointer by Late Lee */
    #define HZK "HZK/HZK16" /* HZK16 or HZK24K/HZK24S */

    static void refresh_screen ()
    {
    ……
     /* just a test */
     unsigned char incode[] = "▲!ADC■测镕试◎示例"; // 注:“镕”字不在GB2312范围之内,不能正常显示。
     int y = yres/4+50;
     put_string_ascii(0, y, "Powered by Late Lee", 9);
     put_string_hz(fp, 0, y+30, "波神留我看斜阳听取蛙声一片", 2);
     put_font(fp, 0, y+56, incode, 5);
     /* end of the test */

    ……
    }
     

     

     

    关键的代码(fbutils.c):

    /* new add by Late Lee 2011-05-30*/
    //#define HZK24
    #ifdef HZK24  /* 24 */
    #include "ascii24.h"
    #define   ASCII_CODE   ascii24
    #define   FONT_SIZE    24                         /* size: 24 */
    #else         /* 16 */
    #include "ascii16.h"
    #define  ASCII_CODE  ascii16
    #define  FONT_SIZE    16                         /* size: 16 */
    #endif


    #define BYTES                (FONT_SIZE/8)                   /* for HZ: 3 bytes  2 bytes*/
    #define BUF_SIZE          (BYTES * FONT_SIZE)        /* HZ buff 3*24 = 72 bytes 2*16 = 32 bytes */

    #define ASCII_BYTES     (BYTES-1)                    /* 2 1*/
    #define ASCII_SIZE       (FONT_SIZE * ASCII_BYTES)      /* ASCII buffer: 24*2 = 48 bytes 16 * 1 = 16 bytes */
    #define ASCII_WIDTH    (FONT_SIZE/2)                         /* ASCII: 16*8 24*12 */

    /* end here Late Lee*/

    /*****************************************************************************
    *           new add by Late Lee 2011-05-30
    *****************************************************************************/


    /**
     * __display_ascii - Display an ASCII code on touch screen
     * @x: Column
     * @y: Row
     * @ascii: Which ASCII code to display 
     * @colidx: Color index(?)
     * This routine display an ASCII code that stored in an array(eg, ASCII_CODE).
     * 16x8 ASCII code takes 1 byte, 24*12 ASCII code takes 2 bytes, so we need 
     * -ASCII_BYTES-.
     */

    static void __display_ascii(int x, int y, char *ascii, unsigned colidx)
    {
            int i, j, k;
            unsigned char *p_ascii;
            int offset;        
            
            offset = (*ascii - 0x20 ) * ASCII_SIZE;  /* find the code in the array */
            p_ascii = ASCII_CODE + offset;

            for(i=0;i<FONT_SIZE;i++)
                    for(j=0;j<ASCII_BYTES;j++)
                            for(k=0;k<8;k++)
                                    if( p_ascii[i*ASCII_BYTES+j] & (0x80>>k) )
                                    //if(*( p_ascii + i*ASCII_BYTES+j) & (0x80>>k))
                                            pixel (x + j*8 + k, y + i, colidx);
    }

    /**
     * put_string_ascii - Display an ASCII string on touch screen
     * @x: Column
     * @y: Row
     * @s: Which string to display
     * @colidx: Color index
     */

    void put_string_ascii(int x, int y, char *s, unsigned colidx)
    {
            while (*s != 0) {
                    __display_ascii(x, y, s, colidx);
                    x += ASCII_WIDTH;
                    s++;
            }
    }

    /* not test */
    void put_string_center_ascii(int x, int y, char *s, unsigned colidx)
    {
            size_t sl = strlen (s);
            put_string_ascii (x - (sl / 2) * ASCII_WIDTH,
                        y - FONT_SIZE / 2, s, colidx);
    }

    /**
     * __display_font_16 - Display a 16x16 (chinese) character on touch screen
     * @fp: File pointer points to HZK(ie, HZK16)
     * @x: Column
     * @y: Row
     * @font: Which (chinese) character to display
     * @colidx: Color index
     * This routine ONLY display 16*16 character.
     * Every character takes two bytes, we show the first 8 bits, then the second 8 bits,
     * then the whole world will be shown before us.
     */

    static void __display_font_16 (FILE *fp, int x, int y, unsigned char *font, unsigned colidx)
    {
            int i, j, k;
            unsigned char mat[BUF_SIZE]={0};
            int qh,wh;
            unsigned long offset;
            qh = *font   - 0xa0;
            wh = *(font+1) - 0xa0;
            offset = ( 94*(qh-1) + (wh-1) ) * BUF_SIZE;  /* offset of the character in HZK */

             /* read it */
            fseek(fp,offset,SEEK_SET);
            fread(mat,BUF_SIZE,1,fp);

             /* show it */
            for(i=0;i<FONT_SIZE;i++)
                    for(j=0;j<BYTES;j++)
                            for(k=0;k<8;k++)
                                    if(mat [i*BYTES+j] & (0x80>>k))
                                            pixel (x + j*8 + k, y + i, colidx);
    }

    /**
     * __display_font_24 - Display a 24x24 (chinese) character on touch screen
     * @fp: File pointer points to HZK(ie, HZK24)
     * @x: Column
     * @y: Row
     * @font: Which (chinese) character to display
     * @colidx: Color index
     */

    static void __display_font_24 (FILE *fp, int x, int y, unsigned char *font, unsigned colidx)
    {
            unsigned int i, j;
            unsigned char mat[FONT_SIZE][BYTES]={{0}};
            int qh,wh;
            unsigned long offset;
            qh = *font   - 0xaf;
            wh = *(font+1) - 0xa0;
            offset = ( 94*(qh-1) + (wh-1) ) * BUF_SIZE;

            fseek(fp,offset,SEEK_SET);
            fread(mat,BUF_SIZE,1,fp);

            for(i=0;i<FONT_SIZE;i++)
                    for(j=0;j<FONT_SIZE;j++)
                            if( mat[j][i>>3] & (0x80>>(i&7)) )
                            // if ( mat[j][i/8] & (0x80>>i%8) ) /* org */
                                    pixel (x + j, y + i, colidx);
    }

    /**
     * put_string_hz - Display a (chinese) character string on touch screen
     * @fp: File pointer points to HZK(ie, HZK24 or HZK16)
     * @x: Column
     * @y: Row
     * @s: Which string to display(must be 'unsigned char*')
     * @colidx: Color index
     */

    void put_string_hz (FILE *fp, int x, int y, unsigned char *s, unsigned colidx)
    {        
            while (*s != 0) {
                    #ifdef HZK24
                    __display_font_24 (fp, x, y, s, colidx);  /* for HZK24 */
                    #else
                    __display_font_16 (fp, x, y, s, colidx);
                    #endif
                    x += FONT_SIZE;
                    s += 2;         /* 2 bytes */
            }
    }

    /* not test */
    void put_string_center_hz (FILE *fp, int x, int y, unsigned char *s, unsigned colidx)
    {
            size_t sl = strlen ((char *)s);
            put_string_hz (fp, x - (sl/2) * FONT_SIZE, y - FONT_SIZE/2, s, colidx);
    }

    /**
     * put_font - Display an ASCII or/and (chinese) character string on touch screen
     * @fp: File pointer points to HZK(ie, HZK24 or HZK16)
     * @x: Column
     * @y: Row
     * @s: Which string to display
     * @colidx: Color index
     */

    void put_font(FILE *fp, int x, int y, unsigned char *s, unsigned colidx)
    {
            while (*s != 0) {
                    if ( (*s>0xa0) && (*(s+1)>0xa0) ) {
                            #ifdef HZK24
                            __display_font_24 (fp, x, y, s, colidx);          /* for HZK24 */
                            #else
                            __display_font_16 (fp, x, y, s, colidx);         /* for HZK16 */
                            #endif
                            x += FONT_SIZE;
                            s += 2;         /* 2 bytes */
                    } else {
                            __display_ascii (x, y, (char *)s, colidx);
                            x += ASCII_WIDTH;
                            s++;         /* 1 byte */
                    }
            }
    }
    /* not test */
    void put_font_center(FILE *fp, int x, int y, unsigned char *s, unsigned colidx)
    {
            size_t sl = strlen ((char *)s);
            put_font (fp, x - (sl/2) * 16, y - 16/2, s, colidx);
    }

     

    关于截图:

    使用fb2png(可通过google搜索“fb2png”,我是很辛苦才找到的),交叉编译,在开发板上执行如下命令: 

    fb2png /dev/fb0 filename.png 5 800 600 24

     

    实际中使用的命令为:

    fb2png /dev/fb0 filename.png 5 240 320 16

     

    效果图如下(由于图片已经有了本人的大名,故不打水印了):

     

     

     

     

    效果图亦可以参见:

    http://www.latelee.org/yetanothertest/display-hz-on-touch-screen.html

     

    临时整理的工程目录压缩包:

    能显示汉字的tslib压缩包

     

    下一计划是ADC和TS驱动。

    展开全文
  • 西家大青蛙_如何设置Smartl700IEV3,Smart1000IEV3触摸屏系统时间
  • WM9712 触摸屏驱动纪要和修改

    千次阅读 2011-11-17 22:59:35
    之前存在的触摸屏问题 :  触摸屏时常会失去响应,但是此时kernel及应用程序并未死掉,这种情况尤其是在音视频文件播放切换的时候容易发生。   WM9712芯片概述:  WM9712L 是一个适用于移动计算通信...
  • 触摸屏驱动总结

    2012-11-29 16:26:31
    此文章是学习了触摸屏一段时间后所写,在文中如有错误之处,请指正,将不胜感激。 开始将触摸屏驱动吧!在Linux的内核中触摸屏驱动是基于输入子系统来设计的。现在先说一下输入子系统。原来编写的字符设备驱动...
  • 触摸屏性能优化

    千次阅读 2015-04-14 22:00:04
    触摸屏性能优化   ----作者:李国权 20150410       触摸屏性能相关因素:(依重要次序排列) 1.  所用方案(自电容/互电容)、半导体厂家/IC/算法 2.  模组厂TP工艺/玻璃/材质 3.  触屏firmware的优化 4.  ...
  • 电阻触摸屏驱动实例分析

    千次阅读 2017-11-18 21:12:34
    s3c2440的CMOS模数转换器(ADC)有8路模拟输入AIN[0-7],8路输入共用一个A/D转换器,电阻触摸屏的输入相当于分压电阻的电压,触摸屏的x,y位置值由分压电阻电压值转换而来。S3c2440向外提供了与触摸屏直接相连的4个...
  • linux 触摸屏驱动

    千次阅读 2018-12-10 16:44:00
    目录 linux 触摸屏驱动 输入子系统怎么写? 触摸屏事件 事件分类 事件设置 硬件配置 设计思路 完整程序 测试 ts_lib 使用 问题小结 ...
  • wince触摸屏驱动

    2013-12-03 16:59:47
    本文向您介绍WinCE中采用分层驱动程序结构实现的触摸屏驱动,包括对触摸屏驱动模型的讲解、触摸屏驱动程序的实现及接口实现等知识。 1.触摸屏驱动程序的模型 1.1 分层触摸屏驱动程序结构 本触摸屏驱动采用分层...
  • 易维触摸屏浏览器

    千次阅读 2013-10-31 22:08:31
    触摸屏浏览器,手写输入法,虚拟软键盘,触摸屏全能输入,触摸屏查询系统 主要功能介绍 MyTouch触摸屏浏览器是专门针对触摸屏应用而开发,基于IE内核,提供访问本地及远程网页功能,具备触摸屏应用所需要的...
  • 触摸屏

    千次阅读 2010-04-24 09:55:00
    曾经做过tslib触摸屏实验,虽然在硬件驱动下触摸屏确有反应,但是针对xserver,tslib提供上来的坐标数据不知如何处理再向上层传递,由于后来接触到触摸屏厂商,从官方网站touchkit下载了一个针对本操作系统的驱动...
  • 【读书笔记】触摸屏游戏设计

    千次阅读 2019-10-26 23:00:41
    触摸屏 平板触摸屏分类: 电容屏:通过多孔材料检测导电泡沫或人体皮肤产生的电信号。大多平板电脑使用电容屏。支持多点触控,iPad最多支持11点触控,但需经常擦拭屏幕。 电阻屏:通过物理压力来操作的触摸屏。由两...
  • wince7下的触摸屏驱动

    千次阅读 2015-01-05 20:45:21
    在嵌入式系统中较为常用的是四线电阻式触摸屏,通过检测x轴和y轴的电压,来确定触点的位置。一般触摸屏系统结构为:触摸屏->触摸屏控制器->处理器。  wince7下触摸屏的驱动分为PDD层(位于bsp目录中)和MDD层...
  • stm32触摸屏识别

    2020-08-11 15:10:36
    stm32触摸屏识别我用的型号准备开始分析例程开始修改结语 我用的型号 我用的是正点的开发板精英板,F103ZET6,电阻屏 准备 正点有一个例程,是触摸屏,注意是触摸屏不是手写识别,我们把它下载下来,烧进去发现是...
  • LINUX设备驱动之触摸屏
  • HITECH触摸屏使用说明

    2010-10-08 21:29:51
    为HITECH触摸屏的新型号,256色彩屏。在工控的应用非常广泛。可以和多种PLC通讯。由上海周济电气朱工提供,qq 402761721.
  • 十三、Linux驱动之触摸屏驱动

    千次阅读 2018-11-29 12:18:01
     常用的触摸屏类型有两种:阻性触摸屏和容性触摸屏。阻性触摸屏是一种传感器,它将矩形区域中触摸点(X, Y)的物理位置转换为代表X坐标和Y坐标的电压。触摸屏包含上下叠合的两个透明层阻性材料,中间由一种弹性材料隔...
  • 触摸屏设备驱动程序

    2019-09-25 16:45:18
    由于触摸屏设备简单、价格低廉,到处应用 ...事实触摸屏是一个使多媒体信息系统改头换面的设备,它赋予多媒体系统以崭新的面貌,是极富有吸引力的全新多媒体交互设备 从技术原理来区别触摸屏,可分...
  • 触摸屏驱动开发

    千次阅读 2012-08-20 21:59:03
    触摸屏驱动开发 1.触摸屏驱动程序的模型 1.1 分层触摸屏驱动层序结构 本触摸屏驱动采用那个分层驱动程序结构,其驱动模型如下图所示,这种结构将驱动程序代码区分为上层模型设备驱动层(MDD),下层是依赖平台...
  • WinCE中触摸屏驱动开发详解 收藏 1.触摸屏驱动程序的模型 1.1 分层触摸屏驱动层序结构 本触摸屏驱动采用分层驱动程序结构,其驱动模型如下图所示,这种结构将驱动程序代码区分为上层模型设备驱动层(MDD),下层...
  • 迪文屏触摸屏待机时间和亮度调整的方法及三点注意事项 迪文屏规格型号多,开发前一定要看清楚屏幕规格型号,选用配套的DGUS软件。不同版本的软件生成的配置文件可能不同,会造成意想不到的问题,如果搞不清应该使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,402
精华内容 10,560
关键字:

如何修改触摸屏上的时间