
连续取 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的技术服务了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)