打印

单片机IO口检测按键

[复制链接]
1946|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

S1通过RC4高电平检测,S2通过RC3高电平检测,S3通过RC3给高电平检测RC4是否为高电平来检测,用S3来控制LED亮灭(检测到S3按下时IO控制的LED会亮,再次检测S3按下时LED会灭),测试中发现按按S3时正常,按S1或S2过程中有时会影响S3控制的LED的亮灭(比如LED是亮的,在没按S3情况下,有时按S2或S2过程中,LED会灭),是不是按键检测步骤有什么问题,请老师指导下,谢谢。

相关帖子

沙发
blust5| | 2014-4-28 12:02 | 只看该作者
估计是按键检测逻辑有问题,可以发上来看看。

使用特权

评论回复
板凳
dirtwillfly| | 2014-4-28 20:30 | 只看该作者
建议楼主上传代码看看

使用特权

评论回复
地板
mylsf| | 2014-4-29 11:32 | 只看该作者
S2也能影响?

使用特权

评论回复
5
惠泽| | 2014-5-2 11:31 | 只看该作者
从原理图看S3断开时S2是不会影响LED的亮灭的。S2闭合时,按S3会影响LED的亮灭。同时在编写软件时,要注意两点:RC4和RC3均为读状态(IO口设置)时,与按键S3无关;当RC3为输出模式时,此时检测RC4的电平状态,此时判断的是S3键。在硬件操作上,任一时刻仅允许按一个键。

使用特权

评论回复
6
chest20090909|  楼主 | 2014-5-4 11:56 | 只看该作者
使用时只按一个按键,不会同时有两个按键一起按

使用特权

评论回复
7
MR4| | 2014-5-5 22:12 | 只看该作者
R27可否放在S1 and S2间作节流,利用S3作检测

使用特权

评论回复
8
handcosmos| | 2014-5-6 22:52 | 只看该作者
是不是在检测按键过程中,切换IO口的输入输出模式太快,导致出现问题?

使用特权

评论回复
9
chest20090909|  楼主 | 2014-5-7 08:55 | 只看该作者
应该快些好吧,切换慢了怕会漏检测

使用特权

评论回复
10
NWPU_CHEN| | 2014-5-7 09:34 | 只看该作者
撸主不上代码,没法分析,硬件看似符合原理,但需要软件结合

使用特权

评论回复
11
chest20090909|  楼主 | 2014-5-7 09:45 | 只看该作者
void keyscan()
{
          while(1)
        {
                if(RC4==1)
                {
                        Delay(6);
                        if(RC4==1)
                        {
                                t++;
                                if(t>12)t=12;
                                write_eprom(0x15,t);
                                refresh=1;
                                while(RC4==1);
                                break;       
                        }
                               
                }
                TRISC3=1;
                if(RC3==1)
                {
                        Delay(6);
                        if(RC3==1)
                        {
                                t--;
                                if(t<1)t=1;
                                write_eprom(0x15,t);
                                refresh=1;
                                while(RC3==1);
                                break;
                        }
                       
                }
                TRISC3=0;
                RC3=1;
                if(RC4==1)
                {
                        Delay(6);
                        if(RC4==1)
                        {
                                trans=0;
                                n++;
                                if(n>1)n=0;       
                                write_eprom(0x16,n);
                                refresh=1;
                                while(RC4==1);
                                break;
                        }       
                       
                }
                break;
        }                                 
}

使用特权

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

本版积分规则

121

主题

632

帖子

4

粉丝