打印

3个I/O,6个二极管接18个按键

[复制链接]
楼主: 不亦心
手机看帖
扫描二维码
随时随地手机跟帖
21
匠人整理的不错,顶一把!

使用特权

评论回复
22
程序匠人| | 2010-8-6 16:46 | 只看该作者
看看,原理图这么画是不是看起来更爽一些?  :lol

3IO 检测 21KEY.GIF (30.94 KB )

3IO 检测 21KEY.GIF

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
不亦心 + 1 五体投地……
23
不亦心|  楼主 | 2010-8-6 18:49 | 只看该作者
本帖最后由 不亦心 于 2010-8-6 19:02 编辑

这个表格俺收藏了
从匠人身上学到很多,比学会这个键盘接法思路更重要
惭愧啊,俺当初分析的时候是用手随便乱画的
看了匠人的表格,俺才发现,俺一改再改的原理图还是错的
还错误的把第18键当成组合键
晕倒……

20# 程序匠人

使用特权

评论回复
24
不亦心|  楼主 | 2010-8-6 18:54 | 只看该作者
本帖最后由 不亦心 于 2010-8-6 19:04 编辑

虽然22L有匠人的大作了,但是俺还是得把原理图更新上来,崩溃了

如果这次还错,那我真的对自己无语了

配合这图,再更新一下程序
加上组合键的话还可以有别的按键,如S2+S6=S19
#include<avr/io.h>

#define SET_BIT(add,bitn) (add |= (1<<bitn))//位置1
#define CLR_BIT(add,bitn) (add &= ~(1<<bitn)) // 位清0
#define GET_BIT(add,bitn) (add & (1<<bitn))//获取位端口电平

static volatile unsigned char Key_count = 2,Key=0,num,nkey,q=0,d=0;//扫描次数,记录按键情况,按键编码,按键备份
const unsigned char Key_tab[64] = //按键映射表
{
19,0,0,0,0,0,2,0,0,0,0,0,0,0,0,18,//0-f
0,0,0,0,0,0,0,0,4,0,0,14,0,0,3,10,//10-1f
0,6,0,0,0,0,0,1,0,0,0,0,0,15,0,11,//20-2f
0,0,0,17,0,0,13,8,0,5,0,9,16,12,7,0//30-3f
};

void Key_IO_init(void)
{
DDRA = 0xf8;//PA0,PA1,PA2设为输入,高阻
PORTA = 0xff;
}

unsigned char Key_scan()
{
if(Key_count==3) Key_count = 0;
Key_count++;
switch(Key_count)
{
  case 1:
   if(GET_BIT(PINA,PINA1))  SET_BIT(Key,0);//Key.flag0 = 1;
   if(GET_BIT(PINA,PINA2))  SET_BIT(Key,1);//Key.flag1 = 1;
   CLR_BIT(DDRA,DDA0);
   SET_BIT(PORTA,PA0);//PA0输入,高阻
   CLR_BIT(PORTA,PA1);
   SET_BIT(DDRA,DDA1);//PA1输出0
   break;
  case 2:
   if(GET_BIT(PINA,PINA2))  SET_BIT(Key,2);//Key.flag2 = 1;
   if(GET_BIT(PINA,PINA0))  SET_BIT(Key,3);//Key.flag3 = 1;
   CLR_BIT(DDRA,DDA1);
   SET_BIT(PORTA,PA1);//PA1输入,高阻
   CLR_BIT(PORTA,PA2);
   SET_BIT(DDRA,DDA2);//PA2输出0
   break;
  default ://case 0:
   if(GET_BIT(PINA,PINA0))  SET_BIT(Key,4);//Key.flag4 = 1;
   if(GET_BIT(PINA,PINA1))  SET_BIT(Key,5);//Key.flag5 = 1;
   CLR_BIT(DDRA,DDA2);
   SET_BIT(PORTA,PA2);//PA2输入,高阻
   CLR_BIT(PORTA,PA0);
   SET_BIT(DDRA,DDA0);//PA0输出0
   if(Key == 0x3f)
   {
    Key = 0;
    q = 0;//防止连续按两次按键误当成一次按键而不应答
    num = 0xff;//无按键标志
   }
   else
   {
    if((nkey == Key)&&(q != Key)) //判断此处键值是否与上次扫描键值一样消抖,&&并且消除一次按键多次响应
    {
     num = Key_tab[Key];
     q = nkey;
     Key_count = 2;//防止一次按键多次响应,因为一个按键的扫描要扫描3次才能更改num
     Key = 0xff;
    }
    else
    {
     num = 0xff;
     nkey = Key;
     Key = 0;
    }
   }
}
return(num);      
}

使用特权

评论回复
25
程序匠人| | 2010-8-7 12:35 | 只看该作者
4个IO口呢?5个呢?6个呢?:lol

使用特权

评论回复
26
DM_man| | 2010-8-7 13:32 | 只看该作者
牛啊

使用特权

评论回复
27
xuyiyi| | 2010-8-7 16:08 | 只看该作者
24楼: 不亦心

你的原理图俺看的云里雾里,匠人在22楼的原理图一目了然。
革命尚未成功,不亦心还需努力。 :lol

使用特权

评论回复
28
不亦心|  楼主 | 2010-8-7 21:21 | 只看该作者
:( 不亦心就此退隐江湖二十年,能山寨出匠人的图和表格再出来
xu大侠保重,就此别过……:P
27# xuyiyi

使用特权

评论回复
29
程序匠人| | 2010-8-8 15:08 | 只看该作者
退隐江湖二十年?
等你再出来,岂不是要到坟墓里去找我们这些老家伙?

还是改成退隐江湖二十小时为好

使用特权

评论回复
30
香水城| | 2010-8-8 18:30 | 只看该作者
又来了个古墓派?

:lol:lol

使用特权

评论回复
31
MCU20082000| | 2010-8-22 12:08 | 只看该作者
高手如云!

使用特权

评论回复
32
xuyiyi| | 2010-8-22 12:18 | 只看该作者
恭喜不亦心小弟,贺喜不亦心小弟,

退隐江湖二天,就修练成了绝世武功,重出江湖!


有图为证,不亦心紧跟匠人,名符其实的匠人第二,呵呵!  ;P



使用特权

评论回复
33
hotpower| | 2010-8-22 12:27 | 只看该作者
晕!

使用特权

评论回复
34
xuyiyi| | 2010-8-22 12:53 | 只看该作者
哈哈!

大叔晕扒下了~~~

不亦心小友退隐江湖二天,就修练成了绝世武功,重出江湖!

大叔退隐江湖三十年,才修练成了绝世武功,三角密码学,重出江湖!

使用特权

评论回复
35
不亦心|  楼主 | 2010-8-22 13:11 | 只看该作者
:L 时隔十几日,xu大侠今日截图。。。哈哈 32# xuyiyi

使用特权

评论回复
36
xuyiyi| | 2010-8-22 13:33 | 只看该作者
哈哈!

这招不错,这水没白灌,把不亦心小友引出。

使用特权

评论回复
37
xuyiyi| | 2010-8-22 13:34 | 只看该作者
不亦心小友这段时间在忙啥?俺看你进展不神速。

使用特权

评论回复
38
zhufdf| | 2010-10-28 23:17 | 只看该作者
学习了,谢谢 所有老师啊!

使用特权

评论回复
39
ouxueguo| | 2010-10-29 17:11 | 只看该作者
:)看懂还得时间啊

使用特权

评论回复
40
lyfly_away| | 2014-4-9 21:20 | 只看该作者
很强大

使用特权

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

本版积分规则