很牛的键盘电路。

[复制链接]
17927|94
洪七公 发表于 2008-12-19 23:07 | 显示全部楼层

加二极管必有弊病~~~

它们都具有特定的优先级,

如楼主图的7,8,9,0


awey的K0123,K0XX,K0X,K1XX,K2XX,K3XX


所以它们都不支持组合键(多键),有些遗憾,不过一般可以用长压键来替代。



E007 发表于 2008-12-19 23:37 | 显示全部楼层

需要多次扫描,且有优先级

只用上拉电阻,其它不要任何元件(当然得要按键啦),且IO口线是类似标准51的双向口,无需三态,那么N条IO口线可以做的键盘最大数量是: 1+2+3+...+N , n>0.有兴趣的可以研究下~,这个支持部分组合键.
 楼主| 耕在此行 发表于 2008-12-20 07:53 | 显示全部楼层

二极管多了

就一点也不划算了,
用AD扩展键盘应该是成本最省的了,程序处理也简单。
还有就是显示复用,显示中断时程序执行时间的考虑
常来21ic 发表于 2008-12-20 09:49 | 显示全部楼层

你们的电路确实很牛!

想收藏此帖,系统却弹出 “没有指定要加入书签的帖子和精华帖”

请问如何才能收藏啊?
zero_cm 发表于 2008-12-20 09:52 | 显示全部楼层

编程头疼

我以前也是用4个IO控制5个按键和5个led,最郁闷的是口又不在一起,弄得晕晕的,程序调了两天才调好,时间特别难掌握,否则按键的时候,led会有暗暗的光
armpu 发表于 2008-12-20 11:13 | 显示全部楼层

学习了

dspjs 发表于 2008-12-20 11:35 | 显示全部楼层

学习一下

呵呵,看了这图,长了见识。顶下!
E007 发表于 2008-12-20 15:26 | 显示全部楼层

补充个图

补充个图,4条线,10个键,再增加一条线,就可以15个键,不用其它元件.每增加第N条IO口线,即可增加N个键,扫描时多读一次IO口.

楼下恳定是搞数学的,用组合给算出来,原来小龙女时代就有组合排列的算法了,呵呵......这确实是正解~其实就是Cn2+n~
洪七公 发表于 2008-12-20 19:53 | 显示全部楼层

47楼图: 组合键+直连键=C42+4=6+4=10

常来21ic 发表于 2008-12-20 20:22 | 显示全部楼层

再问 如何收藏此帖?

hq_y 发表于 2008-12-20 20:32 | 显示全部楼层

鼠标右键-属性-定制-粘贴~~~~~~~~~~~~```

块块 发表于 2008-12-21 09:15 | 显示全部楼层

太麻烦了吧

我就用3根线,接N个74HC165,可以做8*N个按键:)
lovedata 发表于 2008-12-22 13:05 | 显示全部楼层

谢谢牛人们,俺菜鸟长见识了

何工 发表于 2008-12-22 14:15 | 显示全部楼层

1个io口就可以做十几个键了.

以前的老录像机按键大多是这种方法的.
赵超志 发表于 2008-12-22 17:52 | 显示全部楼层

有意思

改天仿一个
雁舞白沙 发表于 2008-12-23 11:39 | 显示全部楼层

如图发一份键盘采集的程序(理论上采集数目无限)

#include <DEFINE.H>
#include <AT89X51.H>

void ShowEn(void)
{
    LcdShowEn=1;
    ShowDptr=6;
    if(DeleteEn)
    {
        DeleteEn=0;
        RamCler(LcdDataBufs,7); 
    }
}
void CmdKey(void)
{

    switch(KeyData)
    {
        case 0x11 ://---发射
                  
                  SendEn=1;
                  DeleteEn=0;
        break;
        case 0x12 ://---上一屏
                  LcdShowEn=1;
                  if(ShowAre>1)
                  {  
                       DeleteEn=1;
                       ShowDptr=6;
                       ShowAre--;
                  }   
        break;
        case 0x14 ://---下一屏
                  LcdShowEn=1;
                  if(ShowAre<4)
                  {
                       DeleteEn=1;
                       ShowDptr=6;
                       ShowAre++;
                  }
        break;
        case 0x18 ://---发送数据
                  SendEn=1;
                  DeleteEn=0;
        break;
        case 0x21 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x2d;
                  ShowCopy();
        break;
        case 0x22 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x39;
                  ShowCopy();    
        break;
        case 0x24 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x36;
                  ShowCopy();
        break;
        case 0x28 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x33;
                  ShowCopy(); 
        break;
        case 0x41 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x2e;
                  ShowCopy();
        break;
        case 0x42 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x38; 
                  ShowCopy();   
        break;
        case 0x44 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x35;
                  ShowCopy();
        break;
        case 0x48 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x32; 
                  ShowCopy();
        break;
        case 0x81 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x30;
                  ShowCopy();
        break;
        case 0x82 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x37;
                  ShowCopy();    
        break;
        case 0x84 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x34;
                  ShowCopy();
        break;
        case 0x88 :
                  ShowEn();
                  LcdDataBufs[ShowDptr]=0x31;
                  ShowCopy(); 
        break;
   }
}
void GetKeys(void)
{
    unsigned char i,j;
    P0=0xFF;
    DataOneBuf=0;
    DataTwoBuf=0;
    if(KeyFg)
    {
        P0=ScanOne;
        P0|=~ScanTwo;
        if((P0&ScanOne)==0)
        {
            KeyFg=1;
            Delay(500);
        }
        else
        {
            KeyFg=0;
            Delay(500);
        }
    }
    else
    {
       DataOneBuf=0x01;
       for(i=1;i<5;i++)
       { 
           DataTwoBuf=0x10;
           for(j=1;j<5;j++)
           {
               P0=0xFF;
               P0=DataOneBuf;
               P0|=~DataTwoBuf;
               if((P0&DataOneBuf)==0)
               {
                   if(ShowAre<5)
                   {
                       KeyFg=1;
                       DatgAAAAAA++;
                       ScanOne=DataOneBuf;
                       ScanTwo=DataTwoBuf;
                       KeyData=DataTwoBuf+DataOneBuf; 
                       CmdKey();
                       KeyData=0;
                   }
               }
               DataTwoBuf<<=1;
           }
           DataOneBuf<<=1;
       }
    }
}
liuwenbin1984 发表于 2008-12-23 15:28 | 显示全部楼层

有点想法

不知道用起来怎么样...
sailen 发表于 2008-12-23 17:07 | 显示全部楼层

佩服啦

liangzisen 发表于 2008-12-23 18:16 | 显示全部楼层

7289 I2C通讯要多少就有多少!

7289 I2C通讯要多少就有多少!
flying1983 发表于 2008-12-23 18:42 | 显示全部楼层

建议牛人给分析一下电路的工作原理或者编程思想。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部