STC单片机 ADC按键 求助!!

STC单片机 ADC按键 求助!!,第1张

取那么多、那么长时间的平均值干什么?

连续取 20 次,其中有10 次,按的是这个键,有10 次,按的是那个键,

平均一下,判定结果:是按下了一个根本就没有按的键。

========

#include<reg52.h>键蔽

#include<intrins.h>

unsigned char code k_AD[] = {

10, 40, 70, 100, 130, 160, 190, 210, 230}//九个按基兆键所对应的ADC值

unsigned char code duan[] = { //共阳段码

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}

//--------------------------------------------

void delay(int x)

{

int i

while(x--) for(i = 115i >0i--)

}

//--------------------------------------------

unsigned char keyscan()

{

unsigned char k1, k2

k1 = GetADCResult(0)//读出

if(k1 <238) { //按下了

delay(20)//延时

k2 = GetADCResult(0) //再次读出

if((k1 >(k2 - 5) &&(k1 <(k2 + 5)) { //两者相差无几

k1 /= 2 k2 /= 2 k1 += k2//两次的平均值

for(k2 = 0k2 <9k2++) //稿锋州在表格中查找9次

if(k1 >(k_AD[k2]) - 5) &&(k1 <(k_AD[k2]) + 5)) //找到了

return(k2) //就返回键值

}

}

return(255) //没有按键

}

//--------------------------------------------

void main()

{

unsigned char key

while(1) {

key = keyscan()

if(key != 255) P0 = duan[key]//显示键值

}

}

//--------------------------------------------

本程序未经验证,仅供参考。

我看了一下STC15系列的手册,的确这里语焉不详,说是PIS=1时就可以用ADCIS[2:0]所选中的通道作为比较慎指慎器同相输入端了,然而查遍手册并无这个位域的相关定义。

就我个人来说,认为这个ADCIS[2:0]有可能指的就是ADC_CONTR寄存器的CHS[2:0]位域。你可以做一下试验:

① 在ADC_POWER=0的情况下,切换CHS[2:0]的值,看看对应的ADC通道有没有作为比较器的同逗迅相输入端作用;(理论上我们并不需要ADC模块真的供电工作,只是借用一下其模宽敬块前端的多路开关而已)

② 如果不行,就将ADC_POWER=1,看看此时的情况如何。

如果都不行,那就只能咨询STC的技术服务了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8226363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存