tony117119 发表于 2013-10-25 09:58:53

1个AD IO实现16个按键,有图真相

本帖最后由 tony117119 于 2013-10-25 11:11 编辑


/
#include<pic.h>            //包含单片机内部资源预定义
__CONFIG(0x1832);      
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};
//定义常数0-9的数据表格
voidDELAY();            //delay函数申明
voidinit();               //I/O口初始化函数申明
void display(unsigned long x);       //显示函数申明
//------------------------------------------------
//主程序开始
voidmain()               
{
   unsigned longaaa=0,result=0x00;          //定义转换结果寄存器
   while(1)                  //死循环
   {
   int i;                  //定义循环次数控制寄存器
   result=0x00;            //转换结果清0
   for(i=5;i>0;i--)          //求5次转换结果的平均值
   {
      init();                //调用初始化函数
      ADGO=0X1;            //开启转换过程
      while(ADGO);         //等待转换完成
      result+=(ADRESH<<8|ADRESL);//累计转换结果
      }
      result=result*1000>>10;       //求5次结果的平均值


    if(result<4700)
    {
   
   if(result<700)aaa=result/250; elseaaa=result/300;

    }
   elseaaa=255;
   display(aaa);      //调用显示函数
   }
}
//-----------------------------------------------
//初始化函数
voidinit()               
{
   PORTA=0XFF;               
   PORTD=0XFF;               //熄灭所有显示
   TRISA=0X1;                //设置RA0为输入,其他为输出            
   TRISD=0X00;               //设置D口全为输出
   ADCON1=0X8E;            //转换结果左对齐,RA0做模拟输入口,其它做普通I/O
   ADCON0=0X41;            //系统时钟Fosc/8,选择RA0通道,允许ADC工作
   DELAY();                  //保证采样延时
   }
//-----------------------------------------------
//显示函数
void display(unsigned long x)         
   {
   unsigned long qian,bai,shi,ge,temp;   //定义4个临时变量
   temp=x;               //暂存AD转换的结果
   qian=temp/1000;   
   bai=temp%1000/100;         
   shi=temp%100/10;   
   ge=temp%10;   

   PORTD=TABLE;       //查表得百位显示的代码
   PORTA=0b11111011;             //RA3输出低电平,点亮百位显示
   DELAY();   
   PORTD=TABLE;       //查表得百位显示的代码
   PORTA=0x37;             //RA3输出低电平,点亮百位显示
   DELAY();                //延时一定时间,保证显示亮度
   PORTD=TABLE;       //查表得十位显示的代码
   PORTA=0x2F;             //RA4输出低电平,点亮十位显示
   DELAY();                //延时一定时间,保证亮度
   PORTD=TABLE;      //求个位显示的代码
   PORTA=0x1F;             //RA5输出低电平,点亮个位显示
   DELAY();                //延时一定时间,保证亮度
   }

//----------------------------------------------
//延时程序
voidDELAY()            //延时程序
    {
   int i;               //定义整形变量
   for(i=0x100;i--;);   //延时
    }





      

tiancaigao7 发表于 2013-10-25 10:01:56

这个不叫一个IO口好吗,应该是一个AD通道实现16各按键的识别。

tony117119 发表于 2013-10-25 10:02:59

哈哈,算你说的对

xyz543 发表于 2013-10-25 10:17:58

纯被标题给引进来了,一看才知道是这么回事儿,哈哈~ {:titter:}

sync765 发表于 2013-10-25 10:20:47

适合使用在极端情况下

r166 发表于 2013-10-25 10:38:02

最讨厌这种应用,撑不了多久就全乱了。

keshipt 发表于 2013-10-25 10:47:07

已经猜到了 还是好奇的进来看了一眼

tony117119 发表于 2013-10-25 11:08:16

全乱,怎么乱法,我感觉很好用啊

bigZ 发表于 2013-10-25 11:18:45

如果同时按下2个会如何?

tony117119 发表于 2013-10-25 11:20:28

可以同时两个按下啊,关键看你按键怎么分布啊

ijlc1314 发表于 2013-10-25 11:27:45

r166 发表于 2013-10-25 10:38 static/image/common/back.gif
最讨厌这种应用,撑不了多久就全乱了。

+1                              
被折磨过

lgg88 发表于 2013-10-25 12:14:21

遇到有些按键比如碳膜的那种估计就麻烦。碳膜的有很小的电阻,时间长了估计会不灵敏了

jetli 发表于 2013-10-25 12:38:30

全部电阻一定要喷防水漆。。。其次,,,按键的接触面:氧化、污染、后形成的接触电阻,属于无解!!!

{:titter:}{:lol:}

12fen 发表于 2013-10-25 12:46:34

十年前见过

zhonggp 发表于 2013-10-25 13:22:12

r166 发表于 2013-10-25 10:38 static/image/common/back.gif
最讨厌这种应用,撑不了多久就全乱了。

车载多媒体,就是导航一体机的都是这种做法,目前没有发现问题,不知道大家说道的问题是什么样子的。

zhonggp 发表于 2013-10-25 13:22:56

ijlc1314 发表于 2013-10-25 11:27 static/image/common/back.gif
+1                              
被折磨过

这种如果Io资源有限PCB有限,有没有更好的方法呢?

ijlc1314 发表于 2013-10-25 13:26:07

zhonggp 发表于 2013-10-25 13:22 static/image/common/back.gif
这种如果Io资源有限PCB有限,有没有更好的方法呢?

跟其它复用,如显示

zhonggp 发表于 2013-10-25 13:29:08

ijlc1314 发表于 2013-10-25 13:26 static/image/common/back.gif
跟其它复用,如显示

主要方式还是以矩阵键盘类似方式吗?

tony117119 发表于 2013-10-25 13:30:49

每个 按键相差0.3V啊,随便一个MCU的AD也有8位吧 0.3的差别检查不到么

wxlcj 发表于 2013-10-25 14:31:02

见过,同事用过,但在现场,干扰一多,什么都不好用了。工业上,加点钱,改设计吧。

r166 发表于 2013-10-25 15:07:58

zhonggp 发表于 2013-10-25 13:22 static/image/common/back.gif
车载多媒体,就是导航一体机的都是这种做法,目前没有发现问题,不知道大家说道的问题是什么样子的。 ...

按键接触电阻能搞死你,

lee345 发表于 2013-10-25 15:14:12

这种用法不可靠,环境变化可能全乱套

zhonggp 发表于 2013-10-25 18:47:20

r166 发表于 2013-10-25 15:07 static/image/common/back.gif
按键接触电阻能搞死你,

目前发现在遭遇强电磁干扰的时候就会出现问题,其他的时候没有发现。
但是对于这个我想提出另外一个问题。如果按照矩阵键盘的做法,那么布线什么的不是变得更加麻烦了?

tirion 发表于 2013-10-25 18:57:50

好多液晶电视的按键板就是adc键盘,不过电压间隙没有这么密集,一个通道一般三四个按键。

r166 发表于 2013-10-26 07:41:30

zhonggp 发表于 2013-10-25 18:47 static/image/common/back.gif
目前发现在遭遇强电磁干扰的时候就会出现问题,其他的时候没有发现。
但是对于这个我想提出另外一个问题 ...

AD单口按键在家电产品尤其是彩电上以使用N多年,如果使用的按键质量好触点不易氧化,

再有使用环境较好(不潮湿 无腐蚀 干扰小),这种方式还是不错的,不会因为我个人的喜好

而失去使用价值,我只是被其害惨过,所以心生厌恶。

zhonggp 发表于 2013-10-26 08:56:59

r166 发表于 2013-10-26 07:41 static/image/common/back.gif
AD单口按键在家电产品尤其是彩电上以使用N多年,如果使用的按键质量好触点不易氧化,

再有使用环境较好( ...

这倒是的,那次我们给客户处理强电干扰的时候也是费了很多时间的。

foxpro2005 发表于 2013-10-26 18:37:10

搞得太多就不好了, 使用久好了,非常容易出现误判....

wajlh 发表于 2013-10-26 18:44:20

除非竞争很厉害的消费类产品,否则不建议这么做。会死的很惨,节约下来的成本还不够售后服务

skylinyk 发表于 2013-10-27 11:23:08

学习了 ,没想到ADC键盘这么多学问啊

fly_pig 发表于 2013-10-27 12:14:57

用过,采集4个IO还是稳定的。

waterghost 发表于 2013-10-27 12:19:43

会有偏移的现象。 以前做个拨码开关方式。

曾家0762 发表于 2013-10-27 14:37:10

我之前也在想苹果耳机上面的按键是不是也是用电阻分压这个原理~~~

dfzcx 发表于 2013-10-27 15:56:27

时间常了就不可靠了

一心2013 发表于 2013-10-27 16:08:03

http://www.amobbs.com/thread-854599-1-1.html
这个更好一些

tlsmf 发表于 2013-10-28 11:04:14

现在片子都不贵,这么用不划算
页: [1]
查看完整版本: 1个AD IO实现16个按键,有图真相