3475|3

1297

帖子

2

TA的资源

纯净的硅(中级)

楼主
 

【瑞萨R7F0之等灯等灯】3、按键扫描与按键中断 [复制链接]

这次的作品中涉及了多种模式转换,用按键控制,因此此处来调试下按键。普通单片机的按键只有2种,端口扫描和外中断。无论哪种,检测到下降沿或者低电平后都是需要延时消抖的。而R7F0很特别的,又给出了一个按键中断,看来是颇有特色的。在看过几个例程以后,发现基本都用KRx来做按键检测,嘿嘿,人家既然专门弄了这么一个中断,为啥不用呢,好像都无需延时什么的,直接给出键值,帅呆了。可是实际情况是:板上的按键接在P137口上了,这家伙只支持INTP0,不支持KRx中断。看来咱还是老老实实用扫描吧。对于这颗按键,P13只有端口寄存器,也就是说我们不用中断的话,只能读取P13.7的值。因为外部中断也要延时消抖,那咱就没必要了。没有消抖,绝对不行。随便copy了一个stc的延时程序,简单修改,发现ms级的基本能用。剩下的基本和其他单片机一样,
if (P13.7 == 0)
              {     delay_ms(10);
                     if (P13.7 == 0)
                     {     while(P13.7 == 0);
                //下面接按键控制代码。。。。
这次做的时候使用了新建空project的方式,然后把其他的common文件夹给copy过来了,那个common文件夹在绝大部分示例代码里面都有,下面一般都至少有common.hoptionbyte.asmr_cg_macrodriver.hr_cg_port.h,看起来,也是用cg自动生成的。看来他们的工程师也用cg的啊。然后主程序也参照例程修改成了按键控制四种频率方波输出。运行正常,嘿嘿。
做完扫描忽然想到了,其实P137的按键效果可以用杜邦线连到其他KRx上去啊,除了KR0KR1用作调试了,那KR2-5都可以用哦。实际测试用2个就够,因为KR4要给出变化的方波,KR5原来用来测试delay的,所以就KR2KR3好了,正好一个增加频率,一个减小频率。主要是看如果用中断的话,是不是连延时都可以省了,可以直接读取键值。下面来看寄存器设置:
对于port,除了adc,其他PMC一律为0;按键是数字输入,而KR2-3对应P01P02(又一个数字差一位的,这一点设计有点脑残),因此PM0bit1bit21
然后KRCTL,只有bit7bit0,最高位一般选1,使用返回标志,这个KRF要用;bit0一般选0,使用下降沿。接着是KRM0,对应位确定使用哪几个KR的中断,我们用0x0C,即KR2KR3。最后键值从哪里读呢?KRF。其实这个是类似中断标志位,6bit对应6个按键。所以直接8位一起读,可以得到按键的判断,KR20x04,KR30x08。读完以后要软件清0。思考,难道这个可以组合按键检测?注意,要想读KRFKRCTLbit7必须为1。以上,大家可以去看源代码中R_KEY_Create()函数,非常详细。设置完后,工作正常。基本流程就是在按键中断中读key_code,主函数判断到非零的key_code,开始根据键值来增加或者减少方波频率。
调试经验分享,因为没有加pull up,而按键只有原来板上那个,所以最开始用3-7短接、8脚悬空的时候,发现频率在迅速变化,看看7脚电平正常,再看8KR3,才发现有输入工频干扰。把KR3固定接Vdd,一切正常。后来把KR2KR3两脚都设上拉,一切也正常。按键不需要人工消抖,直接中断给出按键值,这一个爽啊。不过实际跑过程中,偶尔还是存在按一次mode多加一次的情况。可是debug的时候却从来不发生。而用扫描方式测试按键没有跳变过。
这次好像还是弄代码为主,所以好像没图啊,真相都在代码里面了,两种方式分了两个压缩包,供大家参考。这个KRx的按键跳变请高手指点。 按键扫描改变方波频率.zip (55.49 KB, 下载次数: 27)

KRx 按键检测.zip (60.23 KB, 下载次数: 31)

最新回复

        GPIO_setLow(myGpio,GPIO_Number_19);         GPIO_setHigh(myGpio,GPIO_Number_18);         GPIO_setHigh(myGpio,GPIO_Number_17);         GPIO_setHigh(myGpio,GPIO_Number_16);         key0=GPIO_getData(myGpio,GPIO_Number_29);         key1=GPIO_getData(myGpio,GPIO_Number_32);         key2=GPIO_getData(myGpio,GPIO_Number_33);         key3=GPIO_getData(myGpio,GPIO_Number_34);         key4=GPIO_getData(myGpio,GPIO_Number_19);         key5=GPIO_getData(myGpio,GPIO_Number_18);         key6=GPIO_getData(myGpio,GPIO_Number_17);         key7=GPIO_getData(myGpio,GPIO_Number_16);         if(key4==0&&key5==1&&key6==1&&key7==1)         {                 key0=GPIO_getData(myGpio,GPIO_Number_29);                 key1=GPIO_getData(myGpio,GPIO_Number_32);                 key2=GPIO_getData(myGpio,GPIO_Number_33);                 key3=GPIO_getData(myGpio,GPIO_Number_34);         if(key0==0&&key1==1&&key2==1&&key3==1)         {                 key=1;         }         if(key0==1&&key1==0&&key2==1&&key3==1)                 {                         key=2;                 }         if(key0==1&&key1==1&&key2==0&&key3==1)                         {                                 key=3;                         }         if(key0==1&&key1==1&&key2==1&&key3==0)                                 {                                         key=4;                                 }         }         GPIO_setHigh(myGpio,GPIO_Number_19);                 GPIO_setLow(myGpio,GPIO_Number_18);                 GPIO_setHigh(myGpio,GPIO_Number_17);                 GPIO_setHigh(myGpio,GPIO_Number_16);                 key0=GPIO_getData(myGpio,GPIO_Number_29);                 key1=GPIO_getData(myGpio,GPIO_Number_32);                 key2=GPIO_getData(myGpio,GPIO_Number_33);                 key3=GPIO_getData(myGpio,GPIO_Number_34);                 key4=GPIO_getData(myGpio,GPIO_Number_19);                         key5=GPIO_getData(myGpio,GPIO_Number_18);                         key6=GPIO_getData(myGpio,GPIO_Number_17);                         key7=GPIO_getData(myGpio,GPIO_Number_16);                         if(key4==1&&key5==0&&key6==1&&key7==1)                         {                                 key0=GPIO_getData(myGpio,GPIO_Number_29);                                 key1=GPIO_getData(myGpio,GPIO_Number_32);                                 key2=GPIO_getData(myGpio,GPIO_Number_33);                                 key3=GPIO_getData(myGpio,GPIO_Number_34);                                 if(key0==0&&key1==1&&key2==1&&key3==1)                         {                                 key=5;                         }                                 if(key0==1&&key1==0&&key2==1&&key3==1)                                         {                                                 key=6;                                         }                                 if(key0==1&&key1==1&&key2==0&&key3==1)                                                         {                                                                 key=7;                                                         }                                 if(key0==1&&key1==1&&key2==1&&key3==0)                                                                         {                                                                                 key=8;                                                                         }         }                 GPIO_setHigh(myGpio,GPIO_Number_19);                                 GPIO_setHigh(myGpio,GPIO_Number_18);                                 GPIO_setLow(myGpio,GPIO_Number_17);                                 GPIO_setHigh(myGpio,GPIO_Number_16);                                 key0=GPIO_getData(myGpio,GPIO_Number_29);                                         key1=GPIO_getData(myGpio,GPIO_Number_32);                                         key2=GPIO_getData(myGpio,GPIO_Number_33);                                         key3=GPIO_getData(myGpio,GPIO_Number_34);                                 key4=GPIO_getData(myGpio,GPIO_Number_19);                                                 key5=GPIO_getData(myGpio,GPIO_Number_18);                                                 key6=GPIO_getData(myGpio,GPIO_Number_17);                                                 key7=GPIO_getData(myGpio,GPIO_Number_16);                                                 if(key4==1&&key5==1&&key6==0&&key7==1)                                                 {                                                         key0=GPIO_getData(myGpio,GPIO_Number_29);                                                                 key1=GPIO_getData(myGpio,GPIO_Number_32);                                                                 key2=GPIO_getData(myGpio,GPIO_Number_33);                                                                 key3=GPIO_getData(myGpio,GPIO_Number_34);                                                                 if(key0==0&&key1==1&&key2==1&&key3==1)                                                         {                                                                 key=9;                                                         }                                                                 if(key0==1&&key1==0&&key2==1&&key3==1)                                                                         {                                                                                 key=10;                                                                         }                                                                 if(key0==1&&key1==1&&key2==0&&key3==1)                                                                                         {                                                                                                 key=11;                                                                                         }                                                                 if(key0==1&&key1==1&&key2==1&&key3==0)                                                                                                         {                                                                                                                 key=12;                                                                                                         }                 }                                 GPIO_setHigh(myGpio,GPIO_Number_19);                                                                 GPIO_setHigh(myGpio,GPIO_Number_18);                                                                 GPIO_setHigh(myGpio,GPIO_Number_17);                                                                 GPIO_setLow(myGpio,GPIO_Number_16);                                                                 key0=GPIO_getData(myGpio,GPIO_Number_29);                                                                         key1=GPIO_getData(myGpio,GPIO_Number_32);                                                                         key2=GPIO_getData(myGpio,GPIO_Number_33);                                                                         key3=GPIO_getData(myGpio,GPIO_Number_34);                                                                 key4=GPIO_getData(myGpio,GPIO_Number_19);                                                                                                 key5=GPIO_getData(myGpio,GPIO_Number_18);                                                                                                 key6=GPIO_getData(myGpio,GPIO_Number_17);                                                                                                 key7=GPIO_getData(myGpio,GPIO_Number_16);                                                                 if(key4==1&&key5==1&&key6==1&&key7==0)                                                                                                                 {                                                                         key0=GPIO_getData(myGpio,GPIO_Number_29);                                                                                 key1=GPIO_getData(myGpio,GPIO_Number_32);                                                                                 key2=GPIO_getData(myGpio,GPIO_Number_33);                                                                                 key3=GPIO_getData(myGpio,GPIO_Number_34);                                                                                 if(key0==0&&key1==1&&key2==1&&key3==1)                                                                                                                         {                                                                                                                                 key=13;                                                                                                                         }                                                                 if(key0==1&&key1==0&&key2==1&&key3==1)                                                                                                                                         {                                                                                                                                                 key=14;                                                                                                                                         }                                                                 if(key0==1&&key1==1&&key2==0&&key3==1)                                                                                                                                                         {                                                                                                                                                                 key=15;                                                                                                                                                         }                                                                 if(key0==1&&key1==1&&key2==1&&key3==0)                                                                                                                                                                         {                                                                                                                                                                                 key=16;                                                                                                                                                                         }                                 }   详情 回复 发表于 2014-8-27 15:36
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我编了个自己参考c51的键盘扫描,但是里面没加消抖,可以正常使用。我也觉得要消抖,但是不消也可以正常
使用,,,老师能否解答下为什么????  

点评

你不妨把代码贴出来互相学习一下啊。是有可以不加消抖,用主函数循环来判键的算法。不过我写的这个,如果把延时消抖去掉,按键就偶尔会出问题。  详情 回复 发表于 2014-8-26 13:41
 
 

回复

1297

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
huangyiqian1000 发表于 2014-8-26 09:32
我编了个自己参考c51的键盘扫描,但是里面没加消抖,可以正常使用。我也觉得要消抖,但是不消也可以正常
...

你不妨把代码贴出来互相学习一下啊。是有可以不加消抖,用主函数循环来判键的算法。不过我写的这个,如果把延时消抖去掉,按键就偶尔会出问题。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

4
 
        GPIO_setLow(myGpio,GPIO_Number_19);
        GPIO_setHigh(myGpio,GPIO_Number_18);
        GPIO_setHigh(myGpio,GPIO_Number_17);
        GPIO_setHigh(myGpio,GPIO_Number_16);


        key0=GPIO_getData(myGpio,GPIO_Number_29);
        key1=GPIO_getData(myGpio,GPIO_Number_32);
        key2=GPIO_getData(myGpio,GPIO_Number_33);
        key3=GPIO_getData(myGpio,GPIO_Number_34);




        key4=GPIO_getData(myGpio,GPIO_Number_19);
        key5=GPIO_getData(myGpio,GPIO_Number_18);
        key6=GPIO_getData(myGpio,GPIO_Number_17);
        key7=GPIO_getData(myGpio,GPIO_Number_16);





        if(key4==0&&key5==1&&key6==1&&key7==1)
        {
                key0=GPIO_getData(myGpio,GPIO_Number_29);
                key1=GPIO_getData(myGpio,GPIO_Number_32);
                key2=GPIO_getData(myGpio,GPIO_Number_33);
                key3=GPIO_getData(myGpio,GPIO_Number_34);

        if(key0==0&&key1==1&&key2==1&&key3==1)
        {
                key=1;
        }
        if(key0==1&&key1==0&&key2==1&&key3==1)
                {
                        key=2;
                }
        if(key0==1&&key1==1&&key2==0&&key3==1)
                        {
                                key=3;
                        }
        if(key0==1&&key1==1&&key2==1&&key3==0)
                                {
                                        key=4;
                                }
        }








        GPIO_setHigh(myGpio,GPIO_Number_19);
                GPIO_setLow(myGpio,GPIO_Number_18);
                GPIO_setHigh(myGpio,GPIO_Number_17);
                GPIO_setHigh(myGpio,GPIO_Number_16);


                key0=GPIO_getData(myGpio,GPIO_Number_29);
                key1=GPIO_getData(myGpio,GPIO_Number_32);
                key2=GPIO_getData(myGpio,GPIO_Number_33);
                key3=GPIO_getData(myGpio,GPIO_Number_34);



                key4=GPIO_getData(myGpio,GPIO_Number_19);
                        key5=GPIO_getData(myGpio,GPIO_Number_18);
                        key6=GPIO_getData(myGpio,GPIO_Number_17);
                        key7=GPIO_getData(myGpio,GPIO_Number_16);

                        if(key4==1&&key5==0&&key6==1&&key7==1)
                        {


                                key0=GPIO_getData(myGpio,GPIO_Number_29);
                                key1=GPIO_getData(myGpio,GPIO_Number_32);
                                key2=GPIO_getData(myGpio,GPIO_Number_33);
                                key3=GPIO_getData(myGpio,GPIO_Number_34);
                                if(key0==0&&key1==1&&key2==1&&key3==1)
                        {
                                key=5;
                        }
                                if(key0==1&&key1==0&&key2==1&&key3==1)
                                        {
                                                key=6;
                                        }
                                if(key0==1&&key1==1&&key2==0&&key3==1)
                                                        {
                                                                key=7;
                                                        }
                                if(key0==1&&key1==1&&key2==1&&key3==0)
                                                                        {
                                                                                key=8;
                                                                        }
        }








                GPIO_setHigh(myGpio,GPIO_Number_19);
                                GPIO_setHigh(myGpio,GPIO_Number_18);
                                GPIO_setLow(myGpio,GPIO_Number_17);
                                GPIO_setHigh(myGpio,GPIO_Number_16);



                                key0=GPIO_getData(myGpio,GPIO_Number_29);
                                        key1=GPIO_getData(myGpio,GPIO_Number_32);
                                        key2=GPIO_getData(myGpio,GPIO_Number_33);
                                        key3=GPIO_getData(myGpio,GPIO_Number_34);




                                key4=GPIO_getData(myGpio,GPIO_Number_19);
                                                key5=GPIO_getData(myGpio,GPIO_Number_18);
                                                key6=GPIO_getData(myGpio,GPIO_Number_17);
                                                key7=GPIO_getData(myGpio,GPIO_Number_16);

                                                if(key4==1&&key5==1&&key6==0&&key7==1)
                                                {


                                                        key0=GPIO_getData(myGpio,GPIO_Number_29);
                                                                key1=GPIO_getData(myGpio,GPIO_Number_32);
                                                                key2=GPIO_getData(myGpio,GPIO_Number_33);
                                                                key3=GPIO_getData(myGpio,GPIO_Number_34);
                                                                if(key0==0&&key1==1&&key2==1&&key3==1)
                                                        {
                                                                key=9;
                                                        }
                                                                if(key0==1&&key1==0&&key2==1&&key3==1)
                                                                        {
                                                                                key=10;
                                                                        }
                                                                if(key0==1&&key1==1&&key2==0&&key3==1)
                                                                                        {
                                                                                                key=11;
                                                                                        }
                                                                if(key0==1&&key1==1&&key2==1&&key3==0)
                                                                                                        {
                                                                                                                key=12;
                                                                                                        }
                }







                                GPIO_setHigh(myGpio,GPIO_Number_19);
                                                                GPIO_setHigh(myGpio,GPIO_Number_18);
                                                                GPIO_setHigh(myGpio,GPIO_Number_17);
                                                                GPIO_setLow(myGpio,GPIO_Number_16);



                                                                key0=GPIO_getData(myGpio,GPIO_Number_29);
                                                                        key1=GPIO_getData(myGpio,GPIO_Number_32);
                                                                        key2=GPIO_getData(myGpio,GPIO_Number_33);
                                                                        key3=GPIO_getData(myGpio,GPIO_Number_34);


                                                                key4=GPIO_getData(myGpio,GPIO_Number_19);
                                                                                                key5=GPIO_getData(myGpio,GPIO_Number_18);
                                                                                                key6=GPIO_getData(myGpio,GPIO_Number_17);
                                                                                                key7=GPIO_getData(myGpio,GPIO_Number_16);




                                                                if(key4==1&&key5==1&&key6==1&&key7==0)
                                                                                                                {


                                                                        key0=GPIO_getData(myGpio,GPIO_Number_29);
                                                                                key1=GPIO_getData(myGpio,GPIO_Number_32);
                                                                                key2=GPIO_getData(myGpio,GPIO_Number_33);
                                                                                key3=GPIO_getData(myGpio,GPIO_Number_34);
                                                                                if(key0==0&&key1==1&&key2==1&&key3==1)
                                                                                                                        {
                                                                                                                                key=13;
                                                                                                                        }
                                                                if(key0==1&&key1==0&&key2==1&&key3==1)
                                                                                                                                        {
                                                                                                                                                key=14;
                                                                                                                                        }
                                                                if(key0==1&&key1==1&&key2==0&&key3==1)
                                                                                                                                                        {
                                                                                                                                                                key=15;
                                                                                                                                                        }
                                                                if(key0==1&&key1==1&&key2==1&&key3==0)
                                                                                                                                                                        {
                                                                                                                                                                                key=16;
                                                                                                                                                                        }
                                }





 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表