终于弄出来了——AD键盘,好高兴
学51已两个月了,以前都在看书,最近才开始焊电路,弄了好几天的AD键盘了。只用一个引脚就可以扫描很多的按键。今天晚上终于调试出来了。秀一下。放了一张原理图。代码也放下吧,新手写的代码,请大家指点。单片机是用的STC15F602K 自带ADC转换器
uint8 ADCaction();
uint16 ADCResult(uint8 channel);
void initADC();
uint16 ADCResult(uint8 channel)//转换一次ADC结果,返回16位
{
uint16 adc;
if(channel>7) return 1024;
channel=channel|0x88;//标志清零开电源,设置通道,启动转换
ADC_CONTR=channel;
ADC_RES=0;ADC_RESL=0;//ADRJ=0;RES放高八位 RESL放低2位
NOP;NOP;NOP;NOP;NOP;NOP;
while((ADC_CONTR&0X10)==0);//1000 1100与0001 0000 ==0000 0000
ADC_CONTR&=0Xef;//清零标志位
adc=(uint16)ADC_RES;
adc=(adc<<2)|(ADC_RESL&3);//不用加 用或运算
return adc;
}
uint8 ADCaction()//根据ADC结果,转化为按键值,弹起来状态返回16
{
uint8 i,a;
uint16 j,adc;
uint8 Keybuf={0,0,0};
for(a=0;a<3;a++)
{
adc=ADCResult(4);
if((adc<48)||(adc>=1024)) return 16;//弹起来时候的状态
j=64;
for(i=0;i<=15;i++)
{
if(adc>=(j-20)&&(adc<=(j+20))) break;
j+=64;
}
Keybuf=i;
}
if((Keybuf==Keybuf)&&(Keybuf==Keybuf)) return i;
else return 16;
}
void initADC()//初始化AD转换器
{
unsigned char i, j, k;
P1ASF=0X10;//输入为P1.4
ADC_CONTR=0X80;//打开电源
_nop_();//以下代码软件延时15ms
_nop_();
i = 1;
j = 162;
k = 89;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
有代码,有原理图,有照片,而且还是16个按键,非常难得的实战经验,非常漂亮,果断加精。 一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。 难得的实战经验 xiao_yp2014 发表于 2015-1-3 22:27
一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。
嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧? 做的不错,焊工有待提高,为了美观,线从地面飞吧,这只是书上的历程吧,何不进行自己的改造升级? xiao_yp2014 发表于 2015-1-4 16:05
嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧?
那一般AD键盘采用什么方法? fzwwj95 发表于 2015-1-13 22:07
那一般AD键盘采用什么方法?
一般用不到那么多按键
页:
[1]