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--;); //延时
}
这个不叫一个IO口好吗,应该是一个AD通道实现16各按键的识别。 哈哈,算你说的对 纯被标题给引进来了,一看才知道是这么回事儿,哈哈~ {:titter:} 适合使用在极端情况下 最讨厌这种应用,撑不了多久就全乱了。 已经猜到了 还是好奇的进来看了一眼 全乱,怎么乱法,我感觉很好用啊 如果同时按下2个会如何? 可以同时两个按下啊,关键看你按键怎么分布啊 r166 发表于 2013-10-25 10:38 static/image/common/back.gif
最讨厌这种应用,撑不了多久就全乱了。
+1
被折磨过 遇到有些按键比如碳膜的那种估计就麻烦。碳膜的有很小的电阻,时间长了估计会不灵敏了 全部电阻一定要喷防水漆。。。其次,,,按键的接触面:氧化、污染、后形成的接触电阻,属于无解!!!
{:titter:}{:lol:} 十年前见过 r166 发表于 2013-10-25 10:38 static/image/common/back.gif
最讨厌这种应用,撑不了多久就全乱了。
车载多媒体,就是导航一体机的都是这种做法,目前没有发现问题,不知道大家说道的问题是什么样子的。 ijlc1314 发表于 2013-10-25 11:27 static/image/common/back.gif
+1
被折磨过
这种如果Io资源有限PCB有限,有没有更好的方法呢? zhonggp 发表于 2013-10-25 13:22 static/image/common/back.gif
这种如果Io资源有限PCB有限,有没有更好的方法呢?
跟其它复用,如显示 ijlc1314 发表于 2013-10-25 13:26 static/image/common/back.gif
跟其它复用,如显示
主要方式还是以矩阵键盘类似方式吗? 每个 按键相差0.3V啊,随便一个MCU的AD也有8位吧 0.3的差别检查不到么 见过,同事用过,但在现场,干扰一多,什么都不好用了。工业上,加点钱,改设计吧。
zhonggp 发表于 2013-10-25 13:22 static/image/common/back.gif
车载多媒体,就是导航一体机的都是这种做法,目前没有发现问题,不知道大家说道的问题是什么样子的。 ...
按键接触电阻能搞死你, 这种用法不可靠,环境变化可能全乱套 r166 发表于 2013-10-25 15:07 static/image/common/back.gif
按键接触电阻能搞死你,
目前发现在遭遇强电磁干扰的时候就会出现问题,其他的时候没有发现。
但是对于这个我想提出另外一个问题。如果按照矩阵键盘的做法,那么布线什么的不是变得更加麻烦了? 好多液晶电视的按键板就是adc键盘,不过电压间隙没有这么密集,一个通道一般三四个按键。 zhonggp 发表于 2013-10-25 18:47 static/image/common/back.gif
目前发现在遭遇强电磁干扰的时候就会出现问题,其他的时候没有发现。
但是对于这个我想提出另外一个问题 ...
AD单口按键在家电产品尤其是彩电上以使用N多年,如果使用的按键质量好触点不易氧化,
再有使用环境较好(不潮湿 无腐蚀 干扰小),这种方式还是不错的,不会因为我个人的喜好
而失去使用价值,我只是被其害惨过,所以心生厌恶。 r166 发表于 2013-10-26 07:41 static/image/common/back.gif
AD单口按键在家电产品尤其是彩电上以使用N多年,如果使用的按键质量好触点不易氧化,
再有使用环境较好( ...
这倒是的,那次我们给客户处理强电干扰的时候也是费了很多时间的。 搞得太多就不好了, 使用久好了,非常容易出现误判.... 除非竞争很厉害的消费类产品,否则不建议这么做。会死的很惨,节约下来的成本还不够售后服务 学习了 ,没想到ADC键盘这么多学问啊 用过,采集4个IO还是稳定的。 会有偏移的现象。 以前做个拨码开关方式。 我之前也在想苹果耳机上面的按键是不是也是用电阻分压这个原理~~~ 时间常了就不可靠了 http://www.amobbs.com/thread-854599-1-1.html
这个更好一些 现在片子都不贵,这么用不划算
页:
[1]