我常用的ADC按键代码,你可以参考一下,已经批量在产品上应用,比较稳定的。
- void ADC0_ISR (void) interrupt 5
- {
- static unsigned char ADC_sap_cont,key_last,key_release;
- unsigned char key_th;
- ADC_CONTR &= ~0x20; //清ADC中断标记
- key_adc = (unsigned int)ADC_RES<<8 | ADC_RESL; //取AD值
-
- if(key_adc<2100)
- {
- if (key_adc<200) {key_th = 1;} //键值分段,实际测试得到区间
- else if ((key_adc<700) && (key_adc>=200)) {key_th = 2;}
- else if ((key_adc<1100) && (key_adc>=700)) {key_th = 3;}
- else if ((key_adc<2100) && (key_adc>=1100)) {key_th = 4;}
- else {key_th = 0;}
- if (key_last == key_th) {ADC_sap_cont++;} //键值稳定后开始累计
- else {key_last = key_th,ADC_sap_cont=0;} //不稳定键值将被替换抛弃
-
- if(ADC_sap_cont>=200) //如果键值稳定且累计成功
- {
- key_release = 1;
- key_valu = key_last;
- }
- }
- else //如果无按键,则及时清零
- {
- if(key_release == 1)
- {
- key_release = 0;
- if(key_flag == 0) //并且当前无未处理键值
- {
- ADC_sap_cont = 0; //则输出键值
-
- key_flag = 1;
- }
- else {ADC_sap_cont = 200;} //如果有未处理键值,则等待
-
- }
- ADC_sap_cont = 0;
- }
- ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | 0x00; //再次启动 AD 转换
- }
复制代码
|