搜索
bottom↓
回复: 5

分享~滑动触摸实验

[复制链接]

出0入362汤圆

发表于 2013-3-27 21:14:55 | 显示全部楼层 |阅读模式
本帖最后由 tomzbj 于 2013-3-27 23:01 编辑

原理见两个PDF,




效果见视频 http://v.youku.com/v_show/id_XNTMzNTkxMDQ0.html
程序如下,lcd驱动跟大家的没啥区别就不贴了
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>

  6. #include "lcd_2wire.h"

  7. #define set_load() do { PORTB |= _BV(0); } while(0)
  8. #define set_sense(x) do { DDRC |= _BV(x); PORTC |= _BV(x); } while(0)
  9. #define clr_load() do { PORTB &= ~_BV(0); } while(0)
  10. #define clr_sense(x) do { DDRC |= _BV(x); PORTC &= ~_BV(x); } while(0)
  11. #define in_sense(x) do { DDRC &= ~_BV(x); PORTC &= ~_BV(x);  } while(0)
  12. #define read_sense(x) (PINC & _BV(x))

  13. void init_devices(void);
  14. void timer0_init(void);
  15. ISR( TIMER0_OVF_vect );
  16. void port_init(void);
  17. void init_devices(void);

  18. int main(void) {

  19.     char    str[] = "insert your functional code here";
  20.     init_devices();
  21.     lcd_puts( str );

  22.     while(1) {
  23.         int i, channel = 5;
  24.         uint16_t    vi_base[] = { 112, 84, 84, 84, 98, 112 }; // 实测基数
  25.         uint16_t    vih_start, vih_stop, vil_start, vil_stop, vi_meas[6];

  26.         for( channel = 0; channel <= 5; channel++ ) {
  27.             vi_meas[channel] = 0;
  28.             for( i = 0; i < 8; i++ ) {
  29.                 set_load();
  30.                 clr_sense(channel);
  31.                 vih_start = TCNT0;
  32.                 in_sense(channel);
  33.                 while( !read_sense(channel) ); // 等待sense(channel)达到高电平
  34.                 vih_stop = TCNT0;
  35.                 set_sense(channel);
  36.                 clr_load();
  37.                 vil_start = TCNT0;
  38.                 in_sense(channel);
  39.                 while( read_sense(channel) ); // 等待sense(channel)达到低电平
  40.                 vil_stop = TCNT0;
  41.                 vi_meas[channel] += ( vih_stop - vih_start + 256 ) % 256;
  42.                 vi_meas[channel] += ( vil_stop - vil_start + 256 ) % 256;
  43.             }
  44.             vi_meas[channel] /= 8;
  45.             vi_meas[channel] -= vi_base[channel];
  46.         }
  47.         {
  48.             static int currpos, lastpos, lastlastpos;
  49.             static uint16_t kk = 100;
  50.             char buf[34];
  51.             for( channel = 0; channel <= 5; channel++ ) {
  52.                 if( vi_meas[channel] > 32 ) { // 触摸判定,32是灵敏度
  53.                     if( currpos != channel ) {
  54.                         lastlastpos = lastpos;
  55.                         lastpos = currpos;
  56.                         currpos = channel;

  57.                         // 判断滑动算法,有待进一步优化
  58.                         if( ( (currpos == lastpos + 1 ) || (currpos == lastpos + 2 ) )
  59.                                 && ( ( lastpos == lastlastpos + 1 ) || (lastpos == lastlastpos + 2 ) ) )
  60.                             kk++;
  61.                         else if( ( (currpos == lastpos - 1 ) || (currpos == lastpos - 2 ) )
  62.                                 && ( ( lastpos == lastlastpos - 1 ) || (lastpos == lastlastpos - 2 ) ) )
  63.                             kk--;
  64.                     }
  65.                     break;
  66.                 }
  67.             }
  68.             sprintf( buf, "%d, %d, %d, %d", currpos, lastpos, lastlastpos, kk );
  69.             lcd_clear();
  70.             lcd_puts( buf );
  71.         }
  72.         
  73.         _delay_ms(30);
  74.     }
  75. }

  76. void port_init(void) {
  77.     DDRB  = 0xff; PORTB = 0xff;
  78.     DDRC  = 0xff; PORTC = 0x00;
  79.     DDRD  = 0xff; PORTD = 0x00;
  80. }

  81. void timer0_init(void) {

  82.     TCCR0B = 0x00; //stop
  83.     TCNT0 = 0x0; //set count
  84.     TCCR0A = 0x00;
  85.     TCCR0B = 0x01; //start timer
  86.     TIMSK0 = 0x0;
  87. }


  88. //call this routine to initialize all peripherals
  89. void init_devices(void) {
  90.     cli(); //stop errant interrupts until set up
  91.     port_init();
  92.     timer0_init();
  93.     lcd_init();
  94.     sei(); //all peripherals are now initialized
  95. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-3-27 21:37:00 | 显示全部楼层
顶楼主啊

出0入0汤圆

发表于 2013-3-27 22:35:20 | 显示全部楼层
顶!

出0入0汤圆

发表于 2013-3-27 22:35:59 | 显示全部楼层
本帖最后由 185724132 于 2013-3-27 22:37 编辑

什么意思?没明白。不好意思网速慢,没看见视频,嘿嘿,我下回注意,这回知道了

出0入0汤圆

发表于 2013-3-27 22:55:32 | 显示全部楼层
没看懂

出0入0汤圆

发表于 2013-6-21 13:04:20 | 显示全部楼层
楼主的滑动触摸能不能从左滑到右:从0滑到最大值,
                    从右滑到左:从最大值滑到0。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表