由于系统中需要检测电流,所以使用了mega16,其实,任何一个具备AD转换器(和EEPROM)的AVR都可以实现。 使用mega16的ADC0-3直接连接4线触摸屏。 0 - X+ 2 - X- 1 - Y+ 3 - Y-
将x+ x-设置成低电平。 Y+设置成输入加上拉。 Y-设置成单纯输入无上拉。
没有触摸时,Y-当然是高电平。 如果有触摸,Y-将变成低电平 ----可以设置成中断哦。 ----为啥这样?嘿嘿,自己去计算一下吧。
一旦有触摸,Y+设置成高电平,Y-设置成低电平。 X+单纯输入,不必理会,X-连接ADC测量!!得到Y坐标。
X+设置成高电平,X-设置成低电平。 Y+单纯输入,不必理会,Y-连接ADC测量!!得到X坐标。
测量时,ADC的REF设置成Vcc。 AVR有10bit的ADC,数值上,可达到1023。所以,对于中小尺寸的液晶显示器,或者较粗略的触摸要求,足够了。 mega系列有乘法器,可以快速计算曲线,校准触摸(屏幕电阻不均匀,边缘引线电阻等)。 QVGA点阵320x240远小于1024,所以,AVR直连触摸屏,经校准,已相当精确。 使用EEPROM存储校准系数,蛮好!
还有最后一点,AVR系列抗静电能力还可以,哈哈哈。 为了提高抗静电能力,最廉价的办法,大概是每个引脚连接一个1nF贴片电容,不过,会降低触摸速度。 现在,专门静电保护的小芯片也很多了,嗯,暂时没兴趣。
测试通过的例程(仅采样,不含校准): DDRA = 0xfa; //prepare test. PORTA = 0xf1; for(j=0;j<10;j++); if(!(PINA.2)) //or Interrupt { PORTA = 0xf2; DDRA = 0xfa; for(j=0;j<20;j++); mTouchY = read_adc(0);
PORTA = 0xf1; DDRA = 0xf5; for(j=0;j<20;j++); mTouchX = read_adc(1); }
unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input|0x60; ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; }
|