找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5954|回复: 10
打印 上一主题 下一主题
收起左侧

基于51单片机定时器的电子时钟程序问题,关于按键控制问题?

[复制链接]
跳转到指定楼层
楼主
void keyscan()
{
   unsigned char flag;
   if(KEY1==0)
   {
         DelayMS(10);
         if(KEY1==0)
         {                   
              di();
                  TR0=~TR0;
                  flag=~flag;
                     while(!KEY1);
         }       
   }
   if(flag)
   {
         if(KEY2==0)
     {
         DelayMS(5);
         if(KEY2==0)
            {
                  di();
                 s=s+1;
                 if(s==60)
                 s=0;
                  while(!KEY1);


            }
     }


         if(KEY3==0)
     {
         DelayMS(5);
         if(KEY3==0)
            {
                  di();
                 m=m+1;
                 if(m==60)
                 m=0;
                  while(!KEY3);
            }
     }
         if(KEY4==0)
     {
         DelayMS(5);
         if(KEY4==0)
            {
                  di();
                 h=h+1;
                 if(h==24)
                 s=0;
                  while(!KEY4);


            }
     }






   }


}


我用的的T0定时器,想要按键KEY1第一次按数码暂停,KEY2控制秒加减,KEY3控制分加减,KEY4控制时加减,第二次按KEY1数码管继续计时,按键这部分程序写到这里不知道为什么数码管不受按键控制?求大神指导一下。



按键.png (41.79 KB, 下载次数: 88)

按键.png

CPU.png (120.88 KB, 下载次数: 87)

CPU.png

数码管.png (146.82 KB, 下载次数: 77)

数码管.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2016-11-1 23:42 | 只看该作者
你的防按键弹动方案太初级了。
回复

使用道具 举报

板凳
ID:123289 发表于 2016-11-1 23:47 | 只看该作者
按键按下有个弹动的过程,即会产生0、1若干次,持续的时间是多少呢?就是你要解决的问题。
你用DelayMS(5),DelayMS(10)来解决弹动问题的依据是什么呢?
回复

使用道具 举报

地板
ID:102056 发表于 2016-11-2 18:01 | 只看该作者
yzwzfyz 发表于 2016-11-1 23:42
你的防按键弹动方案太初级了。

真心不会按键防抖更难的。
回复

使用道具 举报

5#
ID:102056 发表于 2016-11-2 18:03 | 只看该作者
yzwzfyz 发表于 2016-11-1 23:47
按键按下有个弹动的过程,即会产生0、1若干次,持续的时间是多少呢?就是你要解决的问题。
你用DelayMS(5) ...

按照一般来说,按键防抖延时5-20MS
回复

使用道具 举报

6#
ID:145763 发表于 2016-11-2 18:59 | 只看该作者
当按键按下后,是等待按键恢复后在执行功能的吗?如while(key!=0);
回复

使用道具 举报

7#
ID:102056 发表于 2016-11-2 19:16 | 只看该作者
feikong 发表于 2016-11-2 18:59
当按键按下后,是等待按键恢复后在执行功能的吗?如while(key!=0);

不是,首先判断按键有没有按下if(KEY==0),执行程序,在判断按键有没有弹起while(!KEY),如果弹起就跳出这个循环。
回复

使用道具 举报

8#
ID:145922 发表于 2016-11-3 15:41 | 只看该作者
你可以用软件编译一下
回复

使用道具 举报

9#
ID:123289 发表于 2016-11-5 01:10 | 只看该作者
给你一个用了多年的程序,汇编的。领会实质后自己用C写。
回复

使用道具 举报

10#
ID:123289 发表于 2016-11-5 01:10 | 只看该作者
;SCANKEY.ASM扫键,有效时,置键有效B_INPUT,置键已按下未松开B_KEYPUSHED。
;下列状况无效
;1,与上次键值R_LASTKEY不同
;2,与上次键值相同时间不足R_TIMEKEY<>0(<32ms)
;3,无按键
;4,按下未松开B_KEYPUSHED=1
;影响:PSW,A,RB_KEY,R_LASTKEY ,R_TIMEKEY

SCANKEY:        MOV        A, P1                        ;取键值1-8键都可以
                MOV        RB_KEY,A                ;存入本次键值,如果成功RB_KEY里的各位就是按键结果,成功与否取决于B_INPUT(后面述)
                XCH        A, R_LASTKEY                ;取并存上次键值
                XRL     A, R_LASTKEY                ;与上次比较,相同?
                ANL        A, #C_KEY                ;如果有不用的键,就用#C_KEY常数屏蔽掉
                JZ        K001                        ;与上次比较,相同...
;与上次不同处理:复计次退出
                MOV        R_TIMEKEY, #C_TIME        ;不同,复键计次,#C_TIME计扫键的计次器,这里设8,8次
                SJMP    K00E
;与上次相同处理:不足8次(32ms),也不处理
K001:                MOV        A, R_TIMEKEY                ;上次与本次键值相同计次器
                JZ        K002                        ;=0,就表示到时间了,可以决定了。
                DEC        R_TIMEKEY                ;相同不足8次(32ms),也不处理
;与上次相同不足时间不处理
                SJMP    K00E
;8次相同-------------------------
;检查是否未按下
K002:                MOV        A, R_LASTKEY            ;取本次键标记位
                XRL        A, #C_KEY               ;未按的键值=0
                ANL        A, #C_KEY               ;只取键标记位,排除不用的键位(1-8个键)
                JNZ        K003                    ;非0,一定有键按下
;未按下不处理:清长按标记(按下未松)后退出
                CLR        B_KEYPUSHED                ;是0,则键已长时未按,即键已松开,清松开标记
                SJMP    K00E
;键按下且达32ms以上,键否松开?
K003:                JNB        B_KEYPUSHED, K004       ;按下未松不处理
                SJMP    K00E                    ;键已按下不处理
;键按下且达32ms以上,键也松开了
K004:                SETB        B_INPUT                        ;否则置键有效,B_INPUT
                SETB        B_KEYPUSHED                ;置键已按下
K00E:                RET

主程序使用
1、B_INPUT=1,则RB_KEY中的键值有效,可以使用(1-8个键,通常=0的是按下了),键处理程序完成后,记得清B_INPUT=0,就可以了。
2、B_INPUT=0,无键有效。

程序中各参数:
B_INPUT:    键有效标记
RB_KEY:     键值,通常是20H-2FH中的一个单元,可以位寻址,用起来方便。
R_LASTKEY:  上次采样键值
R_TIMEKEY:  上次本次键值相同计次器,如计8次,对于4ms的扫键,=32ms
B_KEYPUSHED:键按下未松标记
C_KEY:      键屏蔽值,如:00001111B,表示高4位无键,低4位有键(P10,P11,P12,P13)
C_TIME:      常数8,当上次本次键值不相同时,用它复位R_TIMEKEY。
回复

使用道具 举报

11#
ID:186936 发表于 2017-9-27 21:42 | 只看该作者
yzwzfyz 发表于 2016-11-1 23:47
按键按下有个弹动的过程,即会产生0、1若干次,持续的时间是多少呢?就是你要解决的问题。
你用DelayMS(5) ...

延时去除抖动
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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