原理说明:通过检测感应按键PAD的电容量变化来判断是否有触摸动作。当手指触摸PAD时,电容量增加,充放电时间变长。本方案中利用M48的20个双向IO口实现了20个触摸按键,而且所用原器件最少。其中R1~R20的10K电阻是消除干扰用的,如果采用软件算法,用数字滤波来消除干扰,这20个电阻也可以省略。这样就只需要10只1M的充放电电阻(R21~R30)就可以了。最基本的按键单元是两个PAD分别接M48的两个IO引脚,两个引脚之间用一个1M的电阻相连。如图:PB1(PAD1)O------/\/\/1M\/\/\------O(PAD2)PB2有3种方法检测PAD1的电容量变化:方法1:检测PAD1的充电时间(1)初始化PB1输出低电平,PB2输出高电平,这时PAD1上的电量被放掉,PB1为低电平;(2)设置PB1高阻输入,同时记时,使能PB1引脚电平变化中断。这时PB2输出的高电平通过1M的电阻对PAD1充电;(3)充电到PAD1电平到MOS高电平的最低值时,PB1引脚电平变化中断,在中断里记下充电时间。方法2:检测PAD1的放电时间(1)初始化PB1输出高电平,PB2输出低电平,这时PAD1充电,PB1为高电平;(2)设置PB1高阻输入,同时记时,使能PB1引脚电平变化中断。这时PAD1通过1M的电阻对PB2(地)放电;(3)放电到PAD1电平到MOS低电平的最高值时,PB1引脚电平变化中断,在中断里记下放电时间。方法3:检测PAD1的充放电时间(1)初始化PB1输出低电平,PB2输出高电平,这时PAD1上的电量被放掉,PB1为低电平;(2)设置PB1高阻输入,同时记时,使能PB1引脚电平变化中断。这时PB2输出的高电平通过1M的电阻对PAD1充电;(3)充电到PAD1电平到MOS高电平的最低值时,PB1引脚电平变化中断。在中断里设置PB2输出低电平,这时PAD1通过1M的电阻对PB2放电;(4)放电到PAD1电平到MOS低电平的最高值时,PB1引脚电平变化中断。在中断里记下充放电的总时间。多次测量取滑动平均值(可以去掉最大、最小值后取平均值)来消除干扰。定时检测PAD1的充放电时间t0,t1,t2......tk,tk+1,所有数据的平均值作为参考值,最近几次采样值的平均值作为当前值,用来判断充放电时间的增减。当充放电时间的增量超过一个设定的门限值时就认为有按键动作。修改这个门限值可以改变按键的灵敏度。一个按键的检测过程就是这样的。其它按键同理。检测到按键后,通过I2C接口发送按键码。测试视频里只用了一个LED来指示按键动作,有键按下灯亮,按键释放灯灭。源程序://ICC-AVRapplicationbuilder:2011/12/120:30:09//Target:m48//Crystal:8.0000Mhz#includeiom48v.h#includemacros.h#definePSCLPC5//LED+#definePSDAPC4//LED-//按键编号引脚编号#defineP01PC3//11#defineP02PC2//10#defineP03PC1//9#defineP04PC0//8#defineP05PD1//13#defineP06PD0//12#defineP07PB5//5//SCK#defineP08PB4//4//MISO#defineP09PD2//14#defineP10PD3//15#defineP11PB2//2#defineP12PB3//3//MOSI#defineP13PD4//16#defineP14PB6//6#defineP15PB0//0#defineP16PB1//1#defineP17PB7//7#defineP18PD5//17#defineP19PD6//18#defineP20PD7//19#defineon1#defineoff0//引脚编号=K[按键编号]unsignedcharK[21]={0,11,10,9,8,13,12,5,4,14,15,2,3,16,6,0,1,7,17,18,19};voidled(unsignedcharon_off){if(on_off)PORTC&=~BIT(PSDA);elsePORTC|=BIT(PSDA);}voidkey_tst_prep(unsignedchark){PORTB=0xFF;DDRB=0x00;PORTC|=0x6F;DDRC=0x30;PORTD=0xFF;DDRD=0x00;PCMSK0=0x00;//pinchangemask0PCMSK1=0x00;//pinchangemask1PCMSK2=0x00;//pinchangemask2PCIFR=0x07;//clearpinchangeflag2...0PCICR=0x07;//pinchangeenableif(k8){PORTB&=~(1k);DDRB|=(1k);}elseif(k12){k-=8;PORTC&=~(1k);DDRC|=(1k);}elseif(k20){k-=12;PORTD&=~(1k);DDRD|=(1k);}}voidkey_tst_start(unsignedchark){PCIFR=0x07;//clearpinchangeflag2...0if(k8){PCMSK0=(1k);//pinchangemask0DDRB&=~(1k);}elseif(k12){k-=8;PCMSK1=(1k);//pinchangemask1DDRC&=~(1k);}elseif(k20){k-=12;PCMSK2=(1k);//pinchangemask2DDRD&=~(1k);}TCNT0=0x00;}//4,7,8,12,14,17,19,20unsignedcharKEYNUM=20,KF[21]={0};//按键标记1按下0未按//按键编号1234567891011121314151617181920unsignedcharD[21]={80,26,26,26,36,26,26,60,55,26,26,26,60,26,40,26,26,40,26,40,40};//门限值#pragmainterrupt_handlerkey_tst:iv_PCINT0#pragmainterrupt_handlerkey_tst:iv_PCINT1#pragmainterrupt_handlerkey_tst:iv_PCINT2voidkey_tst(void){unsignedchari;if(TCNT0D[KEYNUM])KF[KEYNUM]=on;elseKF[KEYNUM]=off;for(i=1;i21;i++){if(KF){KF[0]=i;break;}elseKF[0]=0;}led(KF[0]);if(KEYNUM++19)KEYNUM=1;}//TIMER0initialize-prescale:1//WGM:Normal//desiredvalue:0.125uSec//actualvalue:0.125uSec(0.0%)voidtimer0_init(void){TCCR0B=0x00;//stopTCNT0=0xFF;//setcountTCCR0A=0x00;TCCR0B=0x02;//starttimerTIMSK0=0x00;//timer0interruptsources}//TIMER2initialize-prescale:32//WGM:Normal//desiredvalue:1mSec//actualvalue:1.000mSec(0.0%)voidtimer2_init(void){TCCR2B=0x00;//stopASSR=0x00;//setasyncmodeTCNT2=0x00;//setupOCR2A=0x83;TCCR2A=0x00;TCCR2B=0x02;//startTIMSK2=0x03;//timer2interruptsources}#pragmainterrupt_handlertimer2_compa_isr:iv_TIM2_COMPAvoidtimer2_compa_isr(void){key_tst_start(K[KEYNUM]);}#pragmainterrupt_handlertimer2_ovf_isr:iv_TIM2_OVFvoidtimer2_ovf_isr(void){//TCNT2=0x06;//reloadcountervaluekey_tst_prep(K[KEYNUM]);}//TWIinitialize//bitrate:1voidtwi_init(void){TWCR=0X00;//disabletwiTWBR=0x01;//setbitrateTWSR=0x01;//setprescaleTWAR=0x00;//setslaveaddressTWCR=0x44;//enabletwi}//callthisroutinetoinitializeallperipheralsvoidinit_devices(void){//stoperrantinterruptsuntilsetupCLI();//disableallinterruptskey_tst_prep(K[KEYNUM]);timer0_init();timer2_init();//twi_init();MCUCR=0x00;EICRA=0x00;//extendedextintsEIMSK=0x00;PRR=0x0F;//powercontrollerSEI();//re-enableinterrupts//allperipheralsarenowinitialized}//voidmain(void){init_devices();}有不明白的地方可以随时咨询我:欢迎致电:15267845422研发部经理:代品川QQ:350998385地址:宁波北仑恒晶电子科技有限公司电话:15267845422传真:0574-55128828企业网址:、HTN、LCD液晶屏、LCD液晶显示屏,LCD液晶显示器,笔段式液晶、IC邦定加工等业务,现有8台510邦定机,两条LCD前后段生产线;工厂在深圳、潮州、惠州、江西,工厂现在员人3000余人,占地面积45000平方米,LCD生产线能完成从前段的投料到后段切割、灌晶、电检、丝印、贴片、装脚等工艺操作。LCD交货周期:客户提供详细LCD资料=>3天出图纸(客户确认)=>15天交样品(客户确认)=>20天出货(不装金属脚)/25天出货(装金属脚)产品服务类型:1.产品主要技术参数1)触控类型:电容式触控1)外型尺寸:285×345mm以下;2)导电玻璃厚度:0.4、0.55、0.7、1.1mm;3)象素最小间隙:10um;4)占空比:1/240duty以下;5)连接方式:导电胶条、斑马纸、金属插脚、TAB、COG等。2.产品型式1)显示方式:正性、负性;2)光学模式:反射型、透射型、半透半反型、全息型等;3)LCD类别:TN型、HTN型、STN型、FSTN型、VATN型;4)颜色模式:黄绿、灰、黑、白、蓝等模式。在本公司订购产品的客户均可以享受到我们的专业技术团队的配合,以帮助您更好的更快的吧我们的产品接口道你们的产品上。