打印

很牛的键盘电路。

[复制链接]
楼主: 耕在此行
手机看帖
扫描二维码
随时随地手机跟帖
41
洪七公| | 2008-12-19 23:07 | 只看该作者 回帖奖励 |倒序浏览

加二极管必有弊病~~~

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

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


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


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



使用特权

评论回复
42
E007| | 2008-12-19 23:37 | 只看该作者

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

只用上拉电阻,其它不要任何元件(当然得要按键啦),且IO口线是类似标准51的双向口,无需三态,那么N条IO口线可以做的键盘最大数量是: 1+2+3+...+N , n>0.有兴趣的可以研究下~,这个支持部分组合键.

使用特权

评论回复
43
耕在此行|  楼主 | 2008-12-20 07:53 | 只看该作者

二极管多了

就一点也不划算了,
用AD扩展键盘应该是成本最省的了,程序处理也简单。
还有就是显示复用,显示中断时程序执行时间的考虑

使用特权

评论回复
44
常来21ic| | 2008-12-20 09:49 | 只看该作者

你们的电路确实很牛!

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

请问如何才能收藏啊?

使用特权

评论回复
45
zero_cm| | 2008-12-20 09:52 | 只看该作者

编程头疼

我以前也是用4个IO控制5个按键和5个led,最郁闷的是口又不在一起,弄得晕晕的,程序调了两天才调好,时间特别难掌握,否则按键的时候,led会有暗暗的光

使用特权

评论回复
46
armpu| | 2008-12-20 11:13 | 只看该作者

学习了

使用特权

评论回复
47
dspjs| | 2008-12-20 11:35 | 只看该作者

学习一下

呵呵,看了这图,长了见识。顶下!

使用特权

评论回复
48
E007| | 2008-12-20 15:26 | 只看该作者

补充个图

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

楼下恳定是搞数学的,用组合给算出来,原来小龙女时代就有组合排列的算法了,呵呵......这确实是正解~其实就是Cn2+n~

使用特权

评论回复
49
洪七公| | 2008-12-20 19:53 | 只看该作者

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

使用特权

评论回复
50
常来21ic| | 2008-12-20 20:22 | 只看该作者

再问 如何收藏此帖?

使用特权

评论回复
51
hq_y| | 2008-12-20 20:32 | 只看该作者

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

使用特权

评论回复
52
块块| | 2008-12-21 09:15 | 只看该作者

太麻烦了吧

我就用3根线,接N个74HC165,可以做8*N个按键:)

使用特权

评论回复
53
lovedata| | 2008-12-22 13:05 | 只看该作者

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

使用特权

评论回复
54
何工| | 2008-12-22 14:15 | 只看该作者

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

以前的老录像机按键大多是这种方法的.

使用特权

评论回复
55
赵超志| | 2008-12-22 17:52 | 只看该作者

有意思

改天仿一个

使用特权

评论回复
56
雁舞白沙| | 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;
       }
    }
}

使用特权

评论回复
57
liuwenbin1984| | 2008-12-23 15:28 | 只看该作者

有点想法

不知道用起来怎么样...

使用特权

评论回复
58
sailen| | 2008-12-23 17:07 | 只看该作者

佩服啦

使用特权

评论回复
59
liangzisen| | 2008-12-23 18:16 | 只看该作者

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

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

使用特权

评论回复
60
flying1983| | 2008-12-23 18:42 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则