打印

很牛的键盘电路。

[复制链接]
14482|94
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
耕在此行|  楼主 | 2008-12-14 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
来自 2楼
雁舞白沙| | 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;
       }
    }
}

使用特权

评论回复
板凳
ljm810010| | 2008-12-14 14:52 | 只看该作者

这叫什么牛,我都有3个普通IO接19键啦

还有更牛的,2个IO接十几个键,不过IO是要三态,且内部有上下接电阻的。

使用特权

评论回复
地板
xwj| | 2008-12-14 14:56 | 只看该作者

嗯,要分5次去读键

舍得用二极管的话还可以做出更多的按键来哦...

使用特权

评论回复
5
耕在此行|  楼主 | 2008-12-14 15:04 | 只看该作者

楼上两位不要光说,

发上来看看啊。

使用特权

评论回复
6
天雨粟| | 2008-12-14 15:45 | 只看该作者

想知道其工作原理

两座标可以确定平面上的一个点。所以行列式键盘需要逐列扫描逐行读,根据列扫描字(X)及行状态(Y)可以确定一个交叉点。这个容易理解,现在只用四个口,又是如何求座标得键值的呢?

使用特权

评论回复
7
liwei1100| | 2008-12-14 15:54 | 只看该作者

不错~

不错,学习了。留名

使用特权

评论回复
8
耕在此行|  楼主 | 2008-12-14 17:10 | 只看该作者

呵呵 长见识了

不错,可以给那些没事闲着无聊的人玩玩。

使用特权

评论回复
9
ayb_ice| | 2008-12-14 17:13 | 只看该作者

这些其实没有什么实际意义

理论上4个普通IO完全可以做16个按键,因为2^^4=16,实际上确实可以做到更多.

使用特权

评论回复
10
liqf| | 2008-12-15 10:59 | 只看该作者

蓦然回首发现好多牛人还是在单片机板块,学习了

 

使用特权

评论回复
11
xwj| | 2008-12-15 11:28 | 只看该作者

呵呵,因为单片机人人都懂,讨论起来方便、热烈

使用特权

评论回复
12
HWM| | 2008-12-15 12:03 | 只看该作者

呵呵,因为再牛的“机”(IC)最终也还是用“单片”做的“

使用特权

评论回复
13
PZSB| | 2008-12-15 12:30 | 只看该作者

IO口复用

在<单片机接口技术和实用子程序>一书中见过, IO口有多种复用技术. 这种复用的代价是 程序编写复杂, 同时硬件投入大.

使用特权

评论回复
14
luomh98| | 2008-12-15 13:10 | 只看该作者

用一根IO口还能识别出很多键呢

使用特权

评论回复
15
耕在此行|  楼主 | 2008-12-15 13:23 | 只看该作者

楼上的 能行吗?????

使用特权

评论回复
16
ljm810010| | 2008-12-15 13:25 | 只看该作者

IO有ADC就行了

使用特权

评论回复
17
高勇| | 2008-12-15 15:17 | 只看该作者

牛得很夸张。

使用特权

评论回复
18
兴隆| | 2008-12-15 15:19 | 只看该作者

顶起来

使用特权

评论回复
19
lpCFans| | 2008-12-15 17:07 | 只看该作者

一片7289才几块钱....

使用特权

评论回复
20
xwj| | 2008-12-15 17:22 | 只看该作者

几块钱也是钱

使用特权

评论回复
21
耕在此行|  楼主 | 2008-12-15 17:34 | 只看该作者

个人认为

还是用矩阵式省力。大不了用IO多些的

使用特权

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

本版积分规则

40

主题

1108

帖子

0

粉丝