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

[复制链接]
14221|43
xuyiyi 发表于 2010-8-6 12:12 | 显示全部楼层
匠人整理的不错,顶一把!
程序匠人 发表于 2010-8-6 16:46 | 显示全部楼层
看看,原理图这么画是不是看起来更爽一些?  :lol

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +1 收起 理由
不亦心 + 1 五体投地……

查看全部评分

 楼主| 不亦心 发表于 2010-8-6 18:49 | 显示全部楼层
本帖最后由 不亦心 于 2010-8-6 19:02 编辑

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

20# 程序匠人
 楼主| 不亦心 发表于 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);      
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
程序匠人 发表于 2010-8-7 12:35 | 显示全部楼层
4个IO口呢?5个呢?6个呢?:lol
DM_man 发表于 2010-8-7 13:32 | 显示全部楼层
xuyiyi 发表于 2010-8-7 16:08 | 显示全部楼层
24楼: 不亦心

你的原理图俺看的云里雾里,匠人在22楼的原理图一目了然。
革命尚未成功,不亦心还需努力。 :lol
 楼主| 不亦心 发表于 2010-8-7 21:21 | 显示全部楼层
:( 不亦心就此退隐江湖二十年,能山寨出匠人的图和表格再出来
xu大侠保重,就此别过……:P
27# xuyiyi
程序匠人 发表于 2010-8-8 15:08 | 显示全部楼层
退隐江湖二十年?
等你再出来,岂不是要到坟墓里去找我们这些老家伙?

还是改成退隐江湖二十小时为好
香水城 发表于 2010-8-8 18:30 | 显示全部楼层
又来了个古墓派?

:lol:lol
MCU20082000 发表于 2010-8-22 12:08 | 显示全部楼层
高手如云!
xuyiyi 发表于 2010-8-22 12:18 | 显示全部楼层
恭喜不亦心小弟,贺喜不亦心小弟,

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


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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2010-8-22 12:27 | 显示全部楼层
xuyiyi 发表于 2010-8-22 12:53 | 显示全部楼层
哈哈!

大叔晕扒下了~~~

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

大叔退隐江湖三十年,才修练成了绝世武功,三角密码学,重出江湖!
 楼主| 不亦心 发表于 2010-8-22 13:11 | 显示全部楼层
:L 时隔十几日,xu大侠今日截图。。。哈哈 32# xuyiyi
xuyiyi 发表于 2010-8-22 13:33 | 显示全部楼层
哈哈!

这招不错,这水没白灌,把不亦心小友引出。
xuyiyi 发表于 2010-8-22 13:34 | 显示全部楼层
不亦心小友这段时间在忙啥?俺看你进展不神速。
zhufdf 发表于 2010-10-28 23:17 | 显示全部楼层
学习了,谢谢 所有老师啊!
ouxueguo 发表于 2010-10-29 17:11 | 显示全部楼层
:)看懂还得时间啊
lyfly_away 发表于 2014-4-9 21:20 | 显示全部楼层
很强大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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