搜索
bottom↓
回复: 69

一个4线65键的仿真实例

  [复制链接]

出0入0汤圆

发表于 2009-8-30 22:38:20 | 显示全部楼层 |阅读模式
综合坛内各种按键扫描方法,用仿真验证一个4线扫描65键的方案。适用于AVR、51或其它单片机。
特点:
1.外接二极管较少
2.键数可裁减
3.扫描逻辑简单

图中按键分为A~E区,可根据需要,裁减后部键区,以获得较少的二极管得到较多的键数。
A区:共10个键,无需增加二极管;
B区:共12个键,当系统需求11~22键时,选用A、B区,B区每增加1管,可增加3个键;
C区:共30个键,当系统需求23~40键时,选用A、C区,C区每增加2管,可增加5键,C区与B区不同时使用;
D区:共21个键,当系统需求41~61键时,选用A、C、D区,D区每增加1管,可增加1键;
E区:共4键,D区每增加3管,才可增加1键,不具实用价值,仅作测试用。

以上的各种组合方式,应该达到了4线的极限键数。一种两二极管串联下拉的组合方式可靠性不高,没在考范围内。
以下是仿真电路,按从左到右,从上到下方向,键号从1~65依次递增。用鼠标按下按键,带BCD译码的数码管即显示相应的键号。

扫键方法:
1.首次扫键,4线设为上拉输入,记录4位状态;
2.4线依次输出0,并记录其余三线状态;
3.完成上面5次扫描,刚好16位,一个整型变量可记录。
4.与预设的键码比较,得出相应键号。

程序/仿真文件打包于下,有兴趣的朋友可下载测试。
点击此处下载 ourdev_476451.rar(文件大小:78K) (原文件名:4-65key.rar)


(原文件名:4-65 key.PNG)

程序如下:
/*****************************************
        Mega16 4线65键测试程序
        CLK = 4MHz
        by cowboy 2009/08/30
*****************************************/

//硬件连接:PA低4位接键盘,PC接显示口

#include <mega16.h>
#include <delay.h>

unsigned int  key_buff;
unsigned char key_step;
unsigned char key_num;

const unsigned int key_tab[65]=
{
    0x0900,0x0090,0x0009,0x0204,0x0420,0x0042,0x1124,0x2812,0x4481,0x8248,  //A区键码
//  0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0010,0x0008,0x0004,0x头0002,0x0001,  //B区键码
    0x0030,0x0006,0x3936,0x0800,0x0100,0x0c00,0x0003,0x6c93,0x0080,0x0010,  //C区键码
    0x0600,0x00c0,0xc6c9,0x0008,0x0001,0x0140,0x0028,0x936c,0x0004,0x0200,
    0x0180,0x0005,0x55a5,0x0400,0x0020,0x0a00,0x0018,0xaa5a,0x0040,0x0002,
    0x0024,0x0012,0x0802,0x0401,0x0480,0x0240,0x0048,0x0120,0x0104,0x0081,0x0810,0x0208,  //D区键码
    0x0e00,0x01c0,0x0038,0x0007,0xffff,0x0124,0x0812,0x0481,0x0248,         //E区键码
    0xeedb,0xd7ed,0xbb7e,0x7db7,
};

//================ 键盘扫描 ==================
unsigned char key_scan(void)
{
    unsigned char i;
    if(key_step == 0)
    {                               //首次扫描
        key_buff = ~PINA & 0x0f;    //读入4位状态
        PORTA &= ~0x01;
        DDRA  |=  0x01;             //置A口为输出0
        key_step = 1;               //切换到下一状态
        return 0;
    }
    for(i=1;i!=0x10;i<<=1)          //其余的4次扫描
    {                               //依次获取3个位的状态
        if (key_step == i) continue;//当前主动扫描位,略过
        key_buff <<= 1;             //移出1空位
        if ((i & PINA) == 0) key_buff |= 1;   //读入1位
    }
    DDRA  &= ~key_step;             //置上一扫锚位为上拉输入
    PORTA |=  key_step;
    key_step = (key_step & 0x07)<<1;//切换到下一状态
    PORTA &= ~key_step;             //置下一扫描位输出0
    DDRA  |=  key_step;
    if (key_step != 0) return 0;    //若未完成,返回0
    for (i=0;i<65;i++) if (key_buff == key_tab) break;//查找键号
    if (i == 65) i=0; else i++;     //0表示没按下或错键
    if (i == key_num) return 1;     //消抖,并返完成标志
    key_num = i;                    //记录本次键号
    return 0;
}

//================ 测试主程序 ================
void main(void)
{
    PORTA = 0x0F;
    DDRC  = 0xFF;

    while (1)
    {  
        delay_ms(5);
        if(key_scan() == 1)        //若按键有效则以BCD码输出显示
            PORTC = ((key_num/10)<<4) + key_num%10;
    }
}


(原文件名:未命名.PNG)

使用提示:
1.当的使用较少量按键时,请将键码表数组长度相应减少,以节省代码空间和减少搜索时间;
2.当不需要57号以后的按键时,第一次的扫描步骤可省却,同时键码数组所有数据高4位清零;
3.鉴于AVR内部上拉电阻较大,为提高可靠性,可于四线各接一上拉电阻;
4.65个键码搜索时间较长(AVR@4MHz约0.4ms),改进方法可对键码按大小排序,然后按二分法进行6次比较即可识别键号;
5.若IO资源紧张,但需求按键较少(20以内),可考虑三线键盘。请参阅以前贴子。

参考资料:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1563031
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1600359
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=854599
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2243715

出0入0汤圆

发表于 2009-8-30 22:47:46 | 显示全部楼层
牛仔可以穿裤子了 故名牛仔裤

出0入143汤圆

发表于 2009-8-30 22:59:00 | 显示全部楼层
富具内涵,精品!

出0入0汤圆

发表于 2009-8-30 23:07:18 | 显示全部楼层
牛仔裤

出0入4汤圆

发表于 2009-8-30 23:11:43 | 显示全部楼层
太多按键,要不真的想整个玩玩 呵呵

出0入0汤圆

 楼主| 发表于 2009-8-30 23:46:10 | 显示全部楼层
【4楼】 D.lovers ,可裁减意思不必接上所有按键,接其中一部分也可,不必改程序.

出0入0汤圆

发表于 2009-8-31 07:49:49 | 显示全部楼层
这个,先mark一下

出0入0汤圆

发表于 2009-8-31 08:18:42 | 显示全部楼层
说我ISIS版本低了打不开,郁闷。
等有时间再照着画算了

出0入0汤圆

发表于 2009-8-31 08:42:22 | 显示全部楼层
分组做得很漂亮

出0入0汤圆

发表于 2009-8-31 09:54:17 | 显示全部楼层
好东西,有时间研究下~

出0入0汤圆

发表于 2009-8-31 12:45:07 | 显示全部楼层
强帖留名。
打不开,照画了一个7.4sp3的。点击此处下载 ourdev_476412.rar(文件大小:21K) (原文件名:4-65key.rar)

出0入0汤圆

 楼主| 发表于 2009-8-31 15:37:38 | 显示全部楼层
谢谢楼上,已经把楼主位的仿真文件更新为 7.0 旧版本。

出0入0汤圆

发表于 2009-8-31 22:07:28 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-9-3 11:42:51 | 显示全部楼层
AVR2.DLL文件找不到?我用的7.26版,提示出错呢?

出0入0汤圆

 楼主| 发表于 2009-10-20 11:08:19 | 显示全部楼层
直接升级到Proteus 7.5 SP3吧,这里有下载:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3318030

出0入0汤圆

发表于 2009-10-20 21:01:18 | 显示全部楼层
楼主是用CVAVR编的吧

出0入0汤圆

 楼主| 发表于 2009-10-20 21:34:57 | 显示全部楼层
是啊,楼上 lv998127 是怎样知道的?

出0入0汤圆

发表于 2009-11-10 22:06:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-11 21:55:48 | 显示全部楼层

出0入0汤圆

发表于 2009-11-23 14:35:52 | 显示全部楼层
我来回cowboy,呵呵,是从你的头文件看出来的~

出0入0汤圆

发表于 2009-11-23 15:26:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-23 16:22:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-23 16:24:04 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-11-23 18:02:37 | 显示全部楼层
很牛,记号

出0入0汤圆

发表于 2009-11-23 22:24:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-23 22:57:55 | 显示全部楼层
按个爪印

出0入0汤圆

发表于 2009-11-23 23:20:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-23 23:29:04 | 显示全部楼层
没仔细研究,问一下同时按下几个键会不会出问题

出0入0汤圆

发表于 2009-11-24 01:24:02 | 显示全部楼层
好东西

出0入0汤圆

发表于 2009-12-9 09:10:08 | 显示全部楼层
GOOD

出0入0汤圆

发表于 2009-12-9 11:49:31 | 显示全部楼层
试了,不错,顶

出0入0汤圆

发表于 2009-12-9 12:22:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-14 12:59:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-14 13:13:23 | 显示全部楼层
好东西

出0入0汤圆

发表于 2009-12-19 22:12:39 | 显示全部楼层
看看

出0入0汤圆

发表于 2009-12-19 22:42:35 | 显示全部楼层
MARK 按键

出0入0汤圆

发表于 2009-12-27 04:35:24 | 显示全部楼层
我只能说你很牛`~~~

出0入0汤圆

发表于 2010-1-1 14:13:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-1 14:25:50 | 显示全部楼层
强帖留名

出0入50汤圆

发表于 2010-5-5 22:21:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 01:21:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 02:47:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 02:55:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 08:41:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 09:10:42 | 显示全部楼层
记个号

出0入0汤圆

发表于 2010-5-14 09:32:19 | 显示全部楼层
强贴留名

出0入0汤圆

发表于 2010-5-14 09:38:55 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-5-14 10:15:49 | 显示全部楼层
我喜欢,喜欢爱深入研究的人

裤子马上就来

出0入0汤圆

发表于 2010-5-15 11:06:57 | 显示全部楼层
支持了

出0入0汤圆

发表于 2010-5-18 10:20:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-21 18:41:00 | 显示全部楼层
真强

出0入0汤圆

发表于 2010-12-24 01:13:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-24 14:48:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-27 15:40:48 | 显示全部楼层
很牛,但是同时按几个键就会出错

出0入0汤圆

发表于 2011-4-28 10:56:33 | 显示全部楼层
。。。

出0入0汤圆

发表于 2011-4-28 12:06:27 | 显示全部楼层
留个爪印,
我现在用四线实现了10个按键,呵呵

出0入309汤圆

发表于 2011-7-13 16:24:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-13 18:08:14 | 显示全部楼层
mark!

出0入76汤圆

发表于 2011-7-13 20:52:45 | 显示全部楼层
感谢,,COOL

出0入8汤圆

发表于 2011-7-13 22:04:51 | 显示全部楼层
牛仔精品,谢谢!!!

出0入0汤圆

发表于 2011-11-5 19:56:59 | 显示全部楼层
MARK~

出0入0汤圆

发表于 2011-11-6 20:04:40 | 显示全部楼层
精品

出0入0汤圆

发表于 2012-5-2 18:42:07 | 显示全部楼层
强啊。。。

出0入0汤圆

发表于 2012-9-9 23:07:39 | 显示全部楼层
强帖留名

出0入0汤圆

发表于 2013-7-17 15:18:31 来自手机 | 显示全部楼层
大牛  顶

出0入0汤圆

发表于 2013-7-17 16:35:16 | 显示全部楼层
学习了,谢谢分享。。。

出0入0汤圆

发表于 2013-7-17 17:51:42 来自手机 | 显示全部楼层
马可波罗,不支持多键同时吗?

出0入0汤圆

发表于 2013-7-19 09:04:41 | 显示全部楼层
标记下

出0入42汤圆

发表于 2016-9-12 21:12:39 | 显示全部楼层
谢谢分享,学习一下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-4 22:39

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

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