一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2463|回复: 6

[51单片机] stc 的ad鍵盤掃描程序不能正確識別按鍵 請問如何修改

[复制链接]
发表于 2013-6-27 22:22 | 显示全部楼层 |阅读模式
學習ad鍵盤掃描  使用了stc的 stc15f2k60s2   但不能正確識別按鍵   請問ad鍵盤掃描有什麽注意的
程序是我從網上下載來參考的  改了io口   但不能正確識別按鍵  請各位幫忙看看如何更改


我想如有按鍵按下了  相對應的led點亮   程序如下



#include "stc15f2kxx.h"
#include <stdlib.h>
#include <intrins.h>
#define AD_SPEED   0x60  //  0110,0000   1      1   70 个时钟周期转换一次
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^1;




void delay_1ms(void)
{
  unsigned int i;
  for(i=0;i<500;i++)
  i++;
}     




void delay_ms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
   delay_1ms();
   i++;
   }}




Display(unsigned int i)
{ unsigned int temp;
   temp=i;


  switch(temp)         //取值公式 1024 x Vin/Vcc
        {
              case 0:
                      led1=0;
                    led2=1;
                    led3=1;
                    led4=1;
                    led5=1;
                    break;
              case 49:
                      led2=0;
                    led1=1;
                    led3=1;
                    led4=1;
                    led5=1;
                    break;
              case 140:
                      led3=0;
                    led1=1;
                    led2=1;
                    led4=1;
                    led5=1;
                    break;
              case 240:
                      led4=0;
                    led1=1;
                    led2=1;
                    led3=1;
                    led5=1;
                    break;
              case 340:
                      led5=0;
                    led1=1;
                    led2=1;
                    led3=1;
                    led4=1;
                    break;
        }
}


unsigned int get_AD_result(unsigned char channel)
{
    unsigned int result;
    unsigned char AD_finished=0;            


    ADC_RES = 0;
    ADC_RESL = 0;


    channel &= 0x07;         //channel=0x03        
    ADC_CONTR = AD_SPEED;     //ADC_CONTR=0x60 90個時鐘周期轉換一次
    _nop_();
    ADC_CONTR |= channel;    //ADC_CONTR=0x63         
    _nop_();
    ADC_CONTR |= 0x80;       //ADC_CONTR=0xe3 打開ADC_POWER      
   delay_ms(1);                     
    ADC_CONTR |= 0x08;       //ADC_CONTR=0xeb ADC_START打開 開始轉換        
    AD_finished = 0;
    while (AD_finished ==0 )        //等待A/D转换结束
    {
        AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;              
    //return (ADC_RES);                 
result=ADC_RES*4+(ADC_RESL&0x03);
return result;               
}


ADtongdao()
{
    unsigned int u;
    P1ASF = 0x01;                   //0000,0001, 将 P1.0 置成模AD
    ADC_CONTR |= 0x80;              //1000,0000 打开 A/D 转换电源
    u=get_AD_result(0);//P1.7为 A/D 当前通道, 测量并发送结果
    Display(u);         
    delay_ms(1);
}










void main()
{
      P0M0=0xff;
      P0M1=0x00;
      P2M0=0xff;
      P2M1=0x00;


      while(1)
      {
          ADtongdao();
               
      }


}
发表于 2013-6-28 00:01 | 显示全部楼层
网上找找!按键处理程序大把!一不会就发一大堆代码!自己不研究怎么可能会!自己的程序正头疼中!哎!耐心也开始不好了
前几个月写的!你参考下吧!https://www.yleee.com.cn/thread-23579-1-1.html
回复

使用道具 举报

发表于 2013-6-28 12:42 | 显示全部楼层
我之前玩过AD按键  不过 MCU 是 12C60S2   给你贴出来参考下吧  程序是我在官方下的,反正我好用的


/*----------------------------
Get ADC result
----------------------------*/
unsigned char GetADCResult(unsigned char ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
    return ADC_RES;                 //Return ADC result
}


键盘扫描



unsigned char KEYSCAM()
{
        unsigned char KEY=0,ADVal;
        ADVal=GetADCResult(7);
        if(ADVal<0X1B)
        {
                KEY=0X01;
                while(GetADCResult(7)<0XDC);
                ZONE1=~ZONE1;
                write_add(1,ZONE1);
                DelayMS(1);       
                return KEY;       
        }

        if((0X1B<ADVal)&(ADVal<0X59))
        {
                 KEY=0X02;
                while(GetADCResult(7)<0XDC);
                ZONE2=~ZONE2;
                write_add(2,ZONE2);
                DelayMS(1);       
                return KEY;
        }
        if((0X59<ADVal)&(ADVal<0X90))
        {
                KEY=0X03;
                while(GetADCResult(7)<0XDC);
                ZONE3=~ZONE3;
                write_add(3,ZONE3);
                DelayMS(1);       
                return KEY;
        }

        if((0X90<ADVal)&(ADVal<0XB9))
        {
                KEY=0X04;
                while(GetADCResult(7)<0XDC);
                ZONE4=~ZONE4;
                write_add(4,ZONE4);
                DelayMS(1);       
                return KEY;
        }

         if((0XB9<ADVal)&(ADVal<0XE3))
        {
                KEY=0X05;
                while(GetADCResult(7)<0XDC);
                if(P0<0X0F)
                P0=0X0F;
                else
                P0=0X00;
                write_add(1,ZONE1);
                DelayMS(1);
                write_add(2,ZONE2);
                DelayMS(1);
                write_add(3,ZONE3);
                DelayMS(1);
                write_add(4,ZONE4);
                return KEY;
        }
                return 0;
}







新手程序 高手莫笑
回复

使用道具 举报

发表于 2013-6-28 12:45 | 显示全部楼层
AD 按键  取的是范围   不是具体数值啊   
回复

使用道具 举报

发表于 2013-6-28 12:45 | 显示全部楼层
本帖最后由 ayumi7 于 2013-6-28 12:48 编辑

附上原理图
1100.jpg


AD 按键  取的是范围   不是具体数值啊   
回复

使用道具 举报

 楼主| 发表于 2013-6-28 12:47 | 显示全部楼层
謝謝各位的幫助
回复

使用道具 举报

发表于 2013-7-4 19:43 | 显示全部楼层
本帖最后由 xxxx7 于 2013-7-4 19:45 编辑

AD的值是不可能正好等与某个值,它有个跳动.
在做判断时,要做范围判断.比如说40~50之间,认为是某个键按下.
switch(temp)         //取值公式 1024 x Vin/Vcc
case 0:
case 1:
{         }
break;

case 48:
case 49:
case 50:
{       }
break;

case 139:
case 140:
case 141:
{      }
break;

case 239:
case 240:
case 241:
............................................................
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-1 08:09 , Processed in 0.035397 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表