登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

ATmega 键盘问题请教

作者:hldd 栏目:单片机
ATmega 键盘问题请教
请教,我们的键盘工作不正常,请哪位高手帮忙看一下,电路设计有问题吗?

现在的问题是,当按下某一个键时,在电容(比如 C152)和键盘连接的一边,电压可以被拉下来,可是通过电阻连接到单片机上的一边没有任何反应。

谢谢。

2楼: >>参与讨论
hldd
请高手帮帮忙啊.
 
3楼: >>参与讨论
zhang..yb
电容去掉啊!
电容去掉啊!

4楼: >>参与讨论
NE5532
老大,你接电容干什么啊?
信号都过不来了。

5楼: >>参与讨论
hotpower
小电容对地还说得过去,电容隔直应该复习
搞个微分电路还行,但一端必须能捕捉到...

将电容短路应该不太麻烦,但换成二极管可能更"专业"...

6楼: >>参与讨论
zsmbj
将电容短路即可!
 
7楼: >>参与讨论
hotpower
歪打正着,命大造化大--讲述"二极管专业"之理由
这种电路我以前遇到过(将楼主的电容全直接短路)...

当时有人请我"会诊"瞧他的键盘为何老犯病,...我当即开了个用二极管的"药方"...

何也???

如果我没眼花的话,楼主的键盘电路应该是"8出3入"的24键.

在键扫描期间,肯定要遇到"1低7高"的扫描次序,即PA0=0,PA1~PA7=1
(先不说快速全扫描)
在PC0~PC2收键码,当然楼主用74HC11(没用过,猜测是3与门之类)引发INT2中断.(AVR菜鸟我未用过M128的INT2中断--当然也用不起...)

且看:
当PA0=0,PA1~PA7=1时有SW2和SW5键同时压下时,R78,R84,R88都是看客,R99只不过再"限流"或"提高输入阻抗"而成为"花架子".

而真正"工作"的是R83和R85这2个"小电阻"!!!(产生单键可以双键不行的"怪现象")

由于PA0=0V,PA1=5V,所以PC2或74HC11-C1的电压为R83和R85电阻的分压即2.5V!!!

同理可知,当不同多键压下时,PA0~PA7的分压比有不同的变化...

这时INT2能引发键盘中断吗???肯定在做梦!!!

要想避免"分压现象",应该在PA0~PA7加二极管,这样就阻断了高电平输出端的输出,避免了"同侧分压"而与键盘PC0~PC2上的分压...

由此可知行输出侧的上拉电阻应该可以不需要的!!!实际也是无用的...
(当然双向键扫描除外)

当然,如果不需要多键压下,本帖就无任何意义!!!


所以,在"行扫描"侧千万要注意这种"同行电阻分压现象",以免整日"百思不解"等郁闷...

如果不想郁闷的话,就加二极管来"解梦"...

注意双向IO和准双向IO的不同之处!!!

由于AVR与MCS51不同,所以加二极管还需加限流电阻(当然也可设置成为输入以省去限流电阻)

故双向IO若不加限流电阻相当与在输出高电平与输出低电平之间跨接了一个二极管,这样做灌电流和拉电流都会很大...

以上主要讲述了一般加二极管的正确性.
但针对AVR这样的IO灵活控制的MCU,不加二极管也是可行的(也是应该的)---即输出0时设置该IO管脚为输出方式,输出1时设置该IO管脚为输入方式(高阻).

即:
  PORTA = 0x00;//不管三七二十一全为0(输出0,输入不上拉)
  DDRA  = 0b00000001;//扫描时进行DDRA的移位操作(1出7入)

这就是为什么键盘电路多有二极管的郁闷之处
但愿此帖对多键同时压下设计有用...

这里的"专业"即通用MCU之意.

结论:
AVR可以短路电容,但编程时不能按常规的IO输出操作,否则需加二极管.


* - 本贴最后修改时间:2005-2-17 0:30:08 修改者:hotpower

8楼: >>参与讨论
hldd
谢谢各位!早上起来看见这么多回复,真感动,祝大家新春快乐!
等我试一试,再来和大家汇报。

9楼: >>参与讨论
hldd
各位老大,电容去掉了,可是按键后电压还是下不来,
请各位老大再帮忙看看,是否电阻值不对?

我的程序中是PA口设置为低,并且是输出。PC口设置为高,也为输出。

然后希望,当键盘按下时,连接PC口的3根线中的一根被拉低,通过74HC11(3与门)触发中断INT2。

谢谢。

10楼: >>参与讨论
cma
try
  图中的R99-R101去掉,PC口应设置为输入。

11楼: >>参与讨论
zsmbj
晕,PC既然设置为输出高了,如何能为低呢?
先把上边的hotpower的帖子仔细读3遍再开始编程!

12楼: >>参与讨论
hldd
继续请教各位。可以检测到行了,但列还不行,请各位再帮帮。
当按下SW2键后,可以进入中断程序了。但如何检测列呢?
main 程序如下:
        // Porta, KEYBOARD row
        PORTA = 0x00;
          DDRA  = 0xff;
          
        // Portc, KEYBOARD column
          DDRC  = 0x00;

中断程序如下,value_c的值是对的,可以知道是哪行按键了。但value_a值总是读为0x00.没有办法区别是哪一列被按键了。

SIGNAL(SIG_INTERRUPT2)
{
         int value_a, value_c;
    
    value_c = PINC;

    PORTC = 0x00;
    DDRC  = 0xff;
          
    DDRA  = 0x00;
    value_a = PINA;
}

谢谢!

13楼: >>参与讨论
hotpower
哈哈,看来楼主真不明白什么是“键扫描”
我在21IC关于“键盘”及“键扫描”的帖子太多了,自己在21ICBBS的主页搜索“键扫描”,肯定会找到答案及思路...

14楼: >>参与讨论
hldd
谢谢各位老大的帮助,键盘基本工作正常了。
在准备I2C的调试,还要继续请教各位。谢谢。

15楼: >>参与讨论
hotpower
搞出来了也不来个工作总结???
看来TWI/USI是帮不上忙了...

16楼: >>参与讨论
zsmbj
最简单的就是先用IO模拟的办法,网上有很多帖子!拿来主义。
 
17楼: >>参与讨论
hotpower
我有实战例程,但要见到工作总结报告
 
18楼: >>参与讨论
hldd
hotpower大虾,没有总结是因为
好像觉得大家都觉得键盘太简单,写出来怕大家笑话,既然大家不嫌弃,稍后就写个总结出来。

19楼: >>参与讨论
hldd
ATMEGA128 键盘的工作总结
键盘这个东西不会的时候挺难,懂了,就不是很难了。呵呵。

键盘的工作总结:这个原理图是可以基本工作的键盘原理图。键盘扫描中断响应控制程序如下,希望对大家有帮助。也希望得到大家的帮助。

SIGNAL(SIG_INTERRUPT2)
{
    int value_a, value_c;     //define value_a and value_c are int
    
    value_c = PINC;  // got row NUMBER
    value_c = value_c & 0x07;
    
    DDRC  = 0xff; // send row NUMBER
    PORTC = value_c;

    DDRA  = 0x00;
    value_a = 0x00;
    
    value_a = PINA; // get column NUMBER
    
    PORTE = value_a; // for testing
    PORTB = value_c;  // for testing

    if (value_c == 3) // KEYBOARD : SW2 LINE
    {
          SWITCH(value_a)
        {
            case 254: KEYBOARD_power();break; // SW2
             case 253: KEYBOARD_search();break; // SW5
             case 251: KEYBOARD_aspect();break; // SW8
             case 247: KEYBOARD_auto();break; // SW11
             case 239: KEYBOARD_blank();break; // SW14
             case 223: KEYBOARD_magnify_on();break; // SW17
             case 191: KEYBOARD_magnify_off();break; // SW20
             case 127: KEYBOARD_volume();break; // SW23
             default:break;
         }
    }
    else if (value_c == 5) // KEYBOARD : SW3 LINE
    {
        SWITCH(value_a)
        {
            case 254:KEYBOARD_mute();break; // SW3
                case 253:KEYBOARD_freeze();break; // SW6
             case 251:KEYBOARD_position();break; // SW9
                case 247:KEYBOARD_menu();break; // SW12
             case 239:KEYBOARD_esc();break; // SW15
                case 223:KEYBOARD_reset();break; // SW18
              case 191:KEYBOARD_up();break; // SW21
             case 127:KEYBOARD_down();break; // SW24
             default:break;
         }
    }
    else if (value_c == 6) // KEYBOARD : SW4 LINE
    {
        SWITCH(value_a)
        {
            case 254:KEYBOARD_left();break; // SW4
            case 253:KEYBOARD_right();break; // SW7
            case 251:KEYBOARD_enter();break; // SW10
            case 247:KEYBOARD_keystone();break; // SW13
            case 239:KEYBOARD_sw16();break; // SW16
            case 223:KEYBOARD_sw19();break; // SW19
            case 191:KEYBOARD_sw22();break; // SW22
            case 127:KEYBOARD_sw25();break; // SW25
            default:break;
        }
    }

    // restore for next KEYBOARD interrupt
    // Porta, KEYBOARD row
    PORTA = 0x00;
    DDRA  = 0xff;
          
    // Portc, KEYBOARD column
    DDRC  = 0x00;
}




20楼: >>参与讨论
hotpower
累!好端端的行列矩阵让你糟蹋了
 
21楼: >>参与讨论
hldd
hotpower大虾,不知道您是什么意思?可以指教一下?提醒也行。谢
 
22楼: >>参与讨论
hotpower
switch-case太累
 
23楼: >>参与讨论
shenshi
如果是我设计的话,我不会这样做
24个键盘,可以用3个245来做,接到数据总线上,用3个选通信号分别选通245,然后用扫描的方法读键盘值 

24楼: >>参与讨论
hotpower
245又什么好处???楼主的电路肯定比245强!!!
 
25楼: >>参与讨论
busy
简单回复,过程如下
根本没有用A/D原理检测键盘。

软件部分:
PA0---PA7,扫描脉冲输出,任何时候只有一个脚是低电位(也就是输出扫描字),74HC11三输入与门检测键盘按下,通过Y1送到MEGA128的INT2(也就是中断检测键盘),PC0---PC2是接收的键盘码,和扫描字合在一起就可以区分键值。

硬件部分:
去掉100R500PF立即可正常工作。


个人见解,不妥请见谅。

* - 本贴最后修改时间:2005-3-3 12:26:16 修改者:busy

26楼: >>参与讨论
hotpower
74HC11其实也没必要,加3个二极管线与后接中断即可.
要胆大的话电阻电容全部不要.

只要遵循:

输出低电平写'0',输入上拉电阻写'1'的原则即可简化硬件电路.

74HC11其实也没必要,加3个二极管线与后接INT2中断即可.

如果74HC11还有别用那就无所谓了,如果专门用于三线中断那就不如接加3个二极管线与方便实用了.

27楼: >>参与讨论
tiannong
再请教!
 
28楼: >>参与讨论
zhang_2000
100K
 
29楼: >>参与讨论
liangq
真是晕倒。
按键两端都上拉?这么好一个矩阵电路真的被你糟蹋了。

30楼: >>参与讨论
ycc1415926
你的键盘真的能用吗?(我说的能用是能够完成它应该完成的功能)
 
31楼: >>参与讨论
zyy
简单的东西总是人气旺。。。
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
WINAVR中怎么设置才能使用.O文件而不用使用.c源文件
我想买AT90S2343单片机请连系我QQ:799712200电话013159059887
请教一下:
两年前写的AVR单片机烧写程序,DOS下 C 代码,不知道有没人要
建议ATMEL开发集成USB的AVR单片机
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号