搜索
bottom↓
回复: 16

很久没有发有价值的贴了,再帖一个74HC595的按键检测,希望抛砖引玉【恢复】

[复制链接]

出0入0汤圆

发表于 2009-1-2 10:45:59 | 显示全部楼层 |阅读模式
最近家中内外交困,没有任何“重登机器人分坛主”的实际行动,先发个没有技术含量的串行按键驱动回馈各位热心坛友。


功能:
最大8按键检测,带消干扰;
4线制驱动(其中2线为共用SPI时钟、数据,1线锁存,1线KEY_FEED反馈);
类似PC键盘的按键重发(首次重发长延时,其后端延时,可调)。



74HC595串行按键检测电路 (原文件名:KeyBoard.JPG) 

代码:


#include "key_board.h"                        /* 头文件啦,里面就一个函数声明,大家应该知道怎么写的 */

#include "chip.h"                                /* 一些WinAVR的类型定义等,如uint8_t */
#include "util.h"


#define SCAN_THREASHOLD                                2        /* 重复判断多少次以上视为按键被按下 */
#define FIRST_REPEAT_THREASHOLD                20        /* 首次重复多少次视为按住不放 */
#define NORMAL_REPEAT_THREASHOLD        10        /* 首次重复以后,重复多少次视为按住不放 */

static uint8_t repeat_threashold        = FIRST_REPEAT_THREASHOLD;


uint8_t get_key()
{
        uint8_t i;
        static uint8_t        last_code, last_code_count;
        static uint8_t        last_key, last_key_repeat;
        static uint8_t        chk_repeat = 0;


        for (i=0xFE; i!=0; i=(i<<1))
        {
                //
                // Shift data & check ket feed
                
                /* Start transmission */
                SPDR = i;
                
                /* Wait for transmission complete */
                while(!(SPSR & (1<<SPIF)));


                PORT_PIN_CLR (KEY_RCLK);
                NOP ();
                PORT_PIN_SET (KEY_RCLK);

                delay_us(1);
                
                if (!PORT_PIN_VALUE (KEY_FEED))
                {
                        if (i == last_code)
                        {
                                /* 按下的键与上次相同 */
                                if (++last_code_count> SCAN_THREASHOLD)
                                {
                                        last_key = i;
                                        last_code_count = 0;

                                        if( chk_repeat )
                                        {
                                                if (last_key_repeat++> repeat_threashold)
                                                {
                                                        repeat_threashold = NORMAL_REPEAT_THREASHOLD;
                                                        return last_key;
                                                }
                                                else
                                                        return 0xFF;
                                        }
                                        else
                                        {
                                                // 首次检测到该按键,下次该检查重发啦
                                                chk_repeat = 1;
                                                repeat_threashold = FIRST_REPEAT_THREASHOLD;
                                                return last_key;
                                        }
                                }
                        }
                        else
                        {
                                /* 换了个键按下 */
                                last_code = i;
                                last_code_count = 0;
                                last_key = 0;
                                last_key_repeat = 0;

                                chk_repeat = 0;
                                repeat_threashold = FIRST_REPEAT_THREASHOLD;
                        }

                        break;
                }
        }

        if (i == 0)
        {
                /* 没有键按下 */
                last_code = 0;
                last_code_count = 0;
                last_key = 0;
                last_key_repeat = 0;

                chk_repeat = 0;
                repeat_threashold = FIRST_REPEAT_THREASHOLD;
        }

        return 0xFF;
}

代码检测的是7个按键,但是改一下循环,就能够检测8个了,有兴趣的可以试试。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2009-1-2 11:35:16 | 显示全部楼层
发错坛了,应该在AVR坛里-_-!!!

出0入0汤圆

发表于 2009-1-2 15:12:09 | 显示全部楼层
楼主,多个按键同时按下,HC595输出短路了

出0入0汤圆

发表于 2009-1-2 15:14:10 | 显示全部楼层
键上串个二极管吧

出0入0汤圆

发表于 2009-1-2 15:46:21 | 显示全部楼层
既然只是检测按键,不如用HC165,只用三个IO(常规接法),或者两个IO(节约接法),或者一个IO(最省接法)。

出0入0汤圆

发表于 2009-1-2 15:50:23 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-1-2 15:52:37 | 显示全部楼层
以下蓝色文字由版主:Gorgon Meducer 于:2009-01-02,15:52:37 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[9999]51单片机
即将移去的分区:[1000]AVR&nbsp;(原ourAVR.com)&nbsp;技术论坛
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

 楼主| 发表于 2009-1-2 17:29:24 | 显示全部楼层
>>>【2楼】&nbsp;cowboy
>>>&nbsp;楼主,多个按键同时按下,HC595输出短路了
多亏兄台提醒,再次瀑布汗……
反正要修改键位,我会加上1K电阻。谢谢!


>>>【3楼】&nbsp;h2feo4&nbsp;无机酸
>>>&nbsp;键上串个二极管吧&nbsp;&nbsp;

>>>【4楼】&nbsp;cowboy
>>>&nbsp;既然只是检测按键,不如用HC165,只用三个IO(常规接法),或者两个IO(节约接法),或者一个IO(最省接法)。
再次多谢提醒!以前发过过164驱动的按键+显示,74HC164键扫+显示实例,已经过项目验证
不过居然也没考虑多个按键同时按的问题,有一次瀑布汗

见笑了,各位&nbsp;

本贴被 ghost2 编辑过,最后修改时间:2009-01-02,17:32:02.

出0入0汤圆

发表于 2009-1-2 19:11:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-1-2 19:45:55 | 显示全部楼层
这个程序可以修改为:同时驱动数码管,同时检测按钮~~~~,

出0入0汤圆

发表于 2009-1-3 21:12:13 | 显示全部楼层
对,用165好,多键同时按下也能识别出来.

出0入0汤圆

发表于 2009-1-3 21:24:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-1-3 21:37:46 | 显示全部楼层
坛子就没有多少iar写得程序吗?

出0入0汤圆

发表于 2010-10-30 11:09:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-2 10:49:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2017-7-19 17:01:35 | 显示全部楼层
MARK                           
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-4 21:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表