搜索
bottom↓
回复: 21

用AD做的键盘,在一个开发板上用的,比较可靠,代码比较全

[复制链接]

出0入0汤圆

发表于 2010-4-20 19:58:15 | 显示全部楼层 |阅读模式
这是我做的一个小项目,是一个电能表开发板,用一个类似于遥控器的东西采集电表数据,由于种种原因只能用HT46F49E单片机,有AD,但IO口不是很多,要做一个4*6的键盘,如果用普通的那种矩阵键盘,IO口不肯定不够,于是就想到了AD键盘,舍也不说了,上图:

4*6的键盘,图画的不是很好看,大家揍活着看 (原文件名:key.JPG)


把这个键盘分解了看也就是跟这个类似 (原文件名:ourdev_543627.jpg)


没用这个键盘,主要是考虑到用这个AD必须有一个比较准的参考电压,而这个单片机参考电压就是电源电压 (原文件名:ourdev_200564.jpg)


这个是当AD采集的值,然后用串口发到电脑上用EXCEL做的表,由这个图可以看出,有按键时,电压上升的很快,释放时电压下降的慢一点,按下时电压比较平稳,因此要滤波,AD采样两次,如果电压值相等才认为AD采样有效 (原文件名:ad.JPG)


这个是键盘做好后用串口采集的键盘值 (原文件名:123.JPG)





上代码:(1)这个是键盘头文件,放在KEYBOARD.h中:
void ini_adc();
void start_adc();
unsigned char get_key();

#define key1h        222
#define key1l        212
#define key2h        185
#define key2l        175
#define key3h        148
#define key3l        138
#define key4h        113
#define key4l        103
#define key5h        77
#define key5l        67
#define key6h        41
#define key6l        31
#define nokeyh        6
#define nokeyl        0




(2):这个是键盘处理程序,放在KEYBOARD.c中:
#include "HT46F49E.h"
#include "KEYBOARD.h"
void ini_adc()
{
        _pb=_pbc|0b00001111;
        _acsr=2;//选择ADC的转换速度为SYS/8
        _adcr=0b111111;//使能PB0—PB3为ADC通道,但未设置当前ADC是那个通道
}
/*下面的这个函数是讲读取某一通道的KEY值,且有滤波程序*/
unsigned char get_key_volu(unsigned char channel)
{
        unsigned char temp,t;
        unsigned char key_buffer[2];
get_err:
        for(t=0;t<2;t++)
        {
                _adcr=0b01111000;//ADC通道归零,start=0
                _adcr=0b11111000|channel;//设置ADC转换通道,start=1
                _adcr=_adcr&0b01111111;//开始ADC转换,start=0
                while(_eocb);//等待ADC转换结束
                temp=_adrh;
                if(temp<nokeyh)key_buffer[t]=25;
                else if(temp<key1h&&temp>key1l)key_buffer[t]=1;
                else if(temp<key2h&&temp>key2l)key_buffer[t]=2;
                else if(temp<key3h&&temp>key3l)key_buffer[t]=3;
                else if(temp<key4h&&temp>key4l)key_buffer[t]=4;
                else if(temp<key5h&&temp>key5l)key_buffer[t]=5;
                else if(temp<key6h&&temp>key6l)key_buffer[t]=6;
                else goto get_err;//如果不为上述值,则扫描出错,返加扫描
        }
        if(key_buffer[0]!=key_buffer[1])goto get_err;//如果两次扫描值不等,则重新扫描
        return key_buffer[0];//只到两值相等才返回键值
}
unsigned char get_key()
{       
        unsigned char channel,t;
        unsigned char key_buffer,eok;//eok为end_of_key
no_key:
        key_buffer=get_key_volu(channel);
        /*******如果key_buffer为25则反回,扫描下一行********/
        if(key_buffer==25)
        {
                channel++;
                if(channel>3)
                {
                        channel=0;
                }
                goto no_key;
        }
        /******如果有值,算出KEY值*******/
        switch(channel)
        {
                case 1: key_buffer=key_buffer+6;break;
                case 2: key_buffer=key_buffer+12;break;
                case 3: key_buffer=key_buffer+18;break;
                default: break;
        }
        /******等释放key后再返加值**************/
end_of_key:                       
        for(channel=0;channel<4;channel++)
        {
                eok=get_key_volu(channel);
                if(eok!=25)goto end_of_key;
        }
        channel=0;
        return key_buffer;
}


(3)这个是测试程序的主程序:
#include "main.h"
unsigned char bin[2];

void main()
{
        unsigned char test;
        unsigned char t;
        unsigned char wc[]="The UART is ready";
        ini_uart();
        ini_adc();
        for(t=0;t<17;t++)
        {
                uart_tran(wc[t]);
        }
        uart_tran(0x0d);uart_tran(0x0a);//这个在串口助手中换行
        while(1)
        {
                test=get_key();
                        if(test>19)
                        {
                                bin[0]=50;
                                bin[1]=(28+test);
                        }
                        else if(test>9)
                        {
                                bin[0]=49;
                                bin[1]=(38+test);
                        }
                        else
                        {
                                bin[0]=0;
                                bin[1]=test+48;
                        }
                        if(bin[0]!=0)uart_tran(bin[0]);
                        uart_tran(bin[1]);
                        uart_tran(0x0d);uart_tran(0x0a);//这个在串口助手中换行
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-4-20 20:02:32 | 显示全部楼层
小弟初次在本论坛上发贴子,文笔不是很好,大家凑活着看

出0入0汤圆

发表于 2010-4-27 09:04:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-27 09:33:03 | 显示全部楼层
有创意,不过你是不是对分压电阻的精度要求很高啊?
再者,如果两个或者两个以上的按键按下,你能确定出来吗?

出0入0汤圆

发表于 2010-9-29 12:09:26 | 显示全部楼层
不错呀

出0入0汤圆

发表于 2010-10-6 15:47:30 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-10-14 11:39:03 | 显示全部楼层
不错·!可尝试用一个IO口实现6万5千5百35个按键的检测。。。

出0入0汤圆

发表于 2010-10-14 12:00:54 | 显示全部楼层
这个可以检测多个按键,至于电阻精度要求,可以自己计算。


AD-KEY (原文件名:AD-KEY.JPG)

出0入0汤圆

发表于 2010-10-14 13:17:06 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-14 13:23:33 | 显示全部楼层
泼点冷水,正式产品不建议用AD按键!主要是国内的按键质量太水,出货的时候好好的,半年下来,大量的返修,烦死了,血泪教训!

出0入0汤圆

发表于 2011-4-14 21:42:53 | 显示全部楼层
缺少文件!!!main.h里面是什么内容?不能忽悠群众哦!

出0入0汤圆

发表于 2011-10-31 22:54:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-16 20:18:44 | 显示全部楼层
mark!还是首次听说AD按键这种设计方式!

出0入0汤圆

发表于 2013-8-13 22:42:28 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2013-10-5 12:45:55 | 显示全部楼层
好想法!!!

出0入0汤圆

发表于 2013-10-5 15:06:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-10-8 14:33:18 | 显示全部楼层
嗯,通过检测电压值来判断对应的按键,很多都是这样做的

出0入0汤圆

发表于 2013-10-8 14:34:46 | 显示全部楼层
MP3上好多都是这样的

出0入0汤圆

发表于 2014-3-9 13:42:36 | 显示全部楼层
不明觉厉!

出0入0汤圆

发表于 2014-3-9 21:23:48 | 显示全部楼层
mark..........

出0入0汤圆

发表于 2014-3-9 21:25:03 | 显示全部楼层
本帖最后由 stm8s 于 2014-3-9 21:27 编辑

工控  AD  说再可靠也不用  到时候都不知是怎么死的

出0入0汤圆

发表于 2014-4-8 11:55:11 | 显示全部楼层
AD做不了组合按键
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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