不撸僧 发表于 2015-1-3 01:17:53

终于弄出来了——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);
}

jianhong_wu 发表于 2015-1-3 12:36:52

有代码,有原理图,有照片,而且还是16个按键,非常难得的实战经验,非常漂亮,果断加精。

xiao_yp2014 发表于 2015-1-3 22:27:58

一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。

HYC215 发表于 2015-1-4 09:40:31

难得的实战经验

xiao_yp2014 发表于 2015-1-4 16:05:47

xiao_yp2014 发表于 2015-1-3 22:27
一次16个AD按键有点多,中间只有0.3V的区别,干扰大了,就容易出问题。。。。。。

嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧?

电子Inc 发表于 2015-1-8 16:10:17

做的不错,焊工有待提高,为了美观,线从地面飞吧,这只是书上的历程吧,何不进行自己的改造升级?

fzwwj95 发表于 2015-1-13 22:07:14

xiao_yp2014 发表于 2015-1-4 16:05
嘿嘿,这样也可以,但是一般AD键盘不采用这种方法,你的程序没有上完吧?

那一般AD键盘采用什么方法?

xiao_yp2014 发表于 2015-1-14 16:06:24

fzwwj95 发表于 2015-1-13 22:07
那一般AD键盘采用什么方法?

一般用不到那么多按键
页: [1]
查看完整版本: 终于弄出来了——AD键盘,好高兴