打印

可以帮我看看这个按键模块吗

[复制链接]
1125|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
技术小师弟|  楼主 | 2017-10-20 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这个是多功能时钟的按键模块,按键功能有调时间,设日期。可是按键按下总会有延迟,就是让人有一种按键时灵时坏的感觉。可是我明明按键消抖了呀,问题会出在哪里呢,程序如下
#ifndef _KEY_H_
#define _KEY_H_
void mdelay(uint delay)
{uint i;
for(;delay>0;delay--)
{for(i=0;i<62;i++) //1ms延时.
{;}
}
}
void outkey() //跳出调整模式,返回默认显示
{
        uchar Second;
        if(out==0||wireless_1==1)
        {
        //mdelay(8);
        count=0;
        hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
        Second=Read1302(DS1302_SECOND);
    Write1302(0x8e,0x00); //写入允许
        Write1302(0x80,Second&0x7f);
        Write1302(0x8E,0x80);//禁止写入
        done=0;
        while(out==0);
        while(wireless_1==1);
    }
}
void Upkey()//升序按键
{
        Up=1;
        if(Up==0||wireless_2==1)
        {
        mdelay(8);
        switch(count)
        {
        case 1:
                 temp=Read1302(DS1302_SECOND); //读取秒数
                 temp=temp+1; //秒数加1
                 up_flag=1; //数据调整后更新标志
                 if((temp&0x7f)>0x59) //超过59秒,清零
                 temp=0;
                break;
        case 2:
                 temp=Read1302(DS1302_MINUTE); //读取分数
                 temp=temp+1; //分数加1
                 up_flag=1;
                 if(temp>0x59) //超过59分,清零
                 temp=0;
                  break;
    case 3:
                 temp=Read1302(DS1302_HOUR); //读取小时数
                 temp=temp+1; //小时数加1
                 up_flag=1;
                 if(temp>0x23) //超过23小时,清零
                 temp=0;
                 break;
    case 4:
                 temp=Read1302(DS1302_WEEK); //读取星期数
                 temp=temp+1; //星期数加1
                 up_flag=1;
                 if(temp>0x7)
                 temp=1;
                 break;
        case 5:
                 temp=Read1302(DS1302_DAY); //读取日数
                 temp=temp+1; //日数加1
                 up_flag=1;
                 if(temp>0x31)
                 temp=1;
                 break;
    case 6:
                 temp=Read1302(DS1302_MONTH); //读取月数
                 temp=temp+1; //月数加1
                 up_flag=1;
                 if(temp>0x12)
                 temp=1;
                 break;
        case 7:
                 temp=Read1302(DS1302_YEAR); //读取年数
                 temp=temp+1; //年数加1
                 up_flag=1;
                 if(temp>0x85)
                 temp=0;
                 break;
                 default:break;
        }
        while(Up==0);
        while(wireless_2==1);
    }
}
void Downkey()//降序按键
{
        Down=1;
    if(Down==0||wireless_3==1)
        {
         //mdelay(8);
         switch(count)
        {
        case 1:
                 temp=Read1302(DS1302_SECOND); //读取秒数
                 temp=temp-1; //秒数减1
                 down_flag=1; //数据调整后更新标志
                 if(temp==0x7f) //小于0秒,返回59秒
                 temp=0x59;
                 break;
        case 2:
                 temp=Read1302(DS1302_MINUTE); //读取分数
                 temp=temp-1; //分数减1
                 down_flag=1;
                 if(temp==-1)
                 temp=0x59; //小于0秒,返回59秒
                 break;
        case 3:
                 temp=Read1302(DS1302_HOUR); //读取小时数
                 temp=temp-1; //小时数减1
                 down_flag=1;
                 if(temp==-1)
                 temp=0x23;
                 break;
        case 4:
                temp=Read1302(DS1302_WEEK); //读取星期数
                                 temp=temp-1; //星期数减1
                                                                down_flag=1;
                if(temp==0)
                temp=0x7;;
                break;
        case 5:
                temp=Read1302(DS1302_DAY); //读取日数
                 temp=temp-1; //日数减1
                down_flag=1;
                if(temp==0)
                 temp=31;
                 break;
        case 6:
                 temp=Read1302(DS1302_MONTH); //读取月数
                 temp=temp-1; //月数减1
                 down_flag=1;
                 if(temp==0)
                 temp=12;
                 break;
        case 7:
                 temp=Read1302(DS1302_YEAR); //读取年数
                 temp=temp-1; //年数减1
                 down_flag=1;
                 if(temp==-1)
                 temp=0x85;
                 break;
                 default:break;
        }
        while(Down==0);
        while(wireless_3==1);
        }
}
void Setkey()//模式选择按键
{
        Set=1;
        if(Set==0||wireless_4==1)
        {
                 mdelay(8);
                 count=count+1; //Setkey按一次,count就加1
                done=1;//进入调整模式
                 while(Set==0);
                 while(wireless_4==1);
        }
}
void keydone()//按键功能执行
        {
        uchar Second;
        if(flag==0) //关闭时钟,停止计时
        {
                Write1302(0x8e,0x00); //写入允许
                temp=Read1302(0x80);
                Write1302(0x80,temp|0x80);
                Write1302(0x8e,0x80); //禁止写入
                flag=1;
        }
        Setkey();//扫描模式切换按键
        switch(count)
        {
        case 1:do//count=1,调整秒
                {
                outkey();//扫描跳出按钮
                Upkey(); //扫描加按钮
                Downkey(); //扫描减按钮
                if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x80,temp|0x80); //写入新的秒数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                hide_sec++;//位闪计数
                if(hide_sec>3)
                         hide_sec=0;
                         show_time();//液晶显示数据
                }while(count==2);break;
        case 2:do//count=2,调整分
                {
                hide_sec=0;
                outkey();
                Upkey();
                Downkey();
                if(temp>0x60)
                        temp=0;
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x82,temp); //写入新的分数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                                 hide_min++;
                                if(hide_min>3)
                                hide_min=0;
                                        show_time();
                }while(count==3);break;
        case 3:do//count=3,调整小时
                {
                hide_min=0;
                outkey();
                Upkey();
                Downkey();
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x84,temp); //写入新的小时数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                hide_hour++;
                if(hide_hour>3)
                        hide_hour=0;
                        show_time();
                }while(count==4);break;
        case 4:do //count=4,调整星期
                {
                hide_hour=0;
                outkey();
                Upkey();
                Downkey();
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x8a,temp); //写入新的星期数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                hide_week++;
                if(hide_week>3)
                        hide_week=0;
                        show_time();
                }while(count==5);break;
        case 5:do //count=5,调整日
                {
                hide_week=0;
                outkey();
                Upkey();
                Downkey();
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x86,temp); //写入新的日数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                hide_day++;
                if(hide_day>3)
                        hide_day=0;
                        show_time();
                }while(count==6);break;
        case 6:do //count=6,调整月
                {
                hide_day=0;
                outkey();
                Upkey();
                Downkey();
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x88,temp); //写入新的月数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                hide_month++;
                if(hide_month>3)
                        hide_month=0;
                         show_time();
                }while(count==7);break;
        case 7:do //count=7,调整年
                {
                hide_month=0;
                outkey();
                Upkey();
                Downkey();
                if(up_flag==1||down_flag==1)
                {
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x8c,temp); //写入新的年数
                        Write1302(0x8e,0x80); //禁止写入
                        up_flag=0;
                        down_flag=0;
                }
                 hide_year++;
                if(hide_year>3)
                         hide_year=0;
                        show_time();
                }while(count==8);break;
        case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态
                        Second=Read1302(DS1302_SECOND);
                        Write1302(0x8e,0x00); //写入允许
                        Write1302(0x80,Second&0x7f);
                        Write1302(0x8E,0x80);//禁止写入
                        done=0;
                        break; //count=7,开启中断,标志位置0并退?
                        default:break;
        }
}

#endif
在这里谢谢大家了,挺长的这程序

相关帖子

沙发
座机呀| | 2017-10-24 21:32 | 只看该作者
大实话:
个人认为写代码的人要学会的第一件事提高就是写代码的修养,到处都是while,0,1xxx_1,xxx_2,这样的代码可读性很差,简直就是给自己添堵.
楼主可以多看看安富莱的开发板的资料,他们的资料是我认为所有的开发板中做的最好的,是最有借鉴意义的,恕我直说,什么X火,X子的,都是垃圾,坑人

使用特权

评论回复
板凳
liwen_01| | 2017-10-25 08:35 | 只看该作者
我来说两句吧,第一你这程序可读性差是没得说,第二,如果你想增加一个功能,你觉得好加吗,第三,基础课有老师说过在程序里面应该只有一个while吧,你写这么多的死循环?第四,是最重要,你的程序结构就是大大的错误,一看就是初写着,你这种结构能写大程序吗,可读性,移植性好吗,,你这种写法是书本写法,没有实际处理的一点优势,你也可以说我怎么怎么样,至少我表面看出来是这些,还有更深层的我就不说了,好好体会第四点,对你终身都受益,

使用特权

评论回复
地板
feelhyq| | 2017-10-25 09:08 | 只看该作者
liwen_01 发表于 2017-10-25 08:35
我来说两句吧,第一你这程序可读性差是没得说,第二,如果你想增加一个功能,你觉得好加吗,第三,基础课有 ...

不敢苟同,while多不多 怎么用应该根据需求来,我还真没听那个老师说过只能用一个while

使用特权

评论回复
5
dirtwillfly| | 2017-10-26 08:26 | 只看该作者
很多老师,并没有多少实际的工程经验,包括有些卖板子出视频的

使用特权

评论回复
6
Ketose| | 2017-10-26 11:11 | 只看该作者
第一:这样的代码,看都不想看.
第二:要学会使用论坛里的代码格式化功能.

使用特权

评论回复
7
技术小师弟|  楼主 | 2017-10-26 16:06 | 只看该作者
座机呀 发表于 2017-10-24 21:32
大实话:
个人认为写代码的人要学会的第一件事提高就是写代码的修养,到处都是while,0,1xxx_1,xxx_2,这样的代 ...

真是说的实实在在,我正在学51和msp430,程序都是跟着板子配套视频学的,这样下去我的问题会越来越多,不可能什么都到论坛提问,我还要不要接着看这些坑爹的视频。关于怎么训练自己写程序的可读性、可维护性和可变更性有什么这一方面视频推荐吗,求助呀。

使用特权

评论回复
8
技术小师弟|  楼主 | 2017-10-26 16:06 | 只看该作者
dirtwillfly 发表于 2017-10-26 08:26
很多老师,并没有多少实际的工程经验,包括有些卖板子出视频的

真是说的实实在在,我正在学51和msp430,程序都是跟着板子配套视频学的,这样下去我的问题会越来越多,不可能什么都到论坛提问,我还要不要接着看这些坑爹的视频。关于怎么训练自己写程序的可读性、可维护性和可变更性有什么这一方面视频推荐吗,求助呀。

使用特权

评论回复
9
dirtwillfly| | 2017-10-26 16:08 | 只看该作者
技术小师弟 发表于 2017-10-26 16:06
真是说的实实在在,我正在学51和msp430,程序都是跟着板子配套视频学的,这样下去我的问题会越来越多,不 ...

没听说有视频,书籍倒是有一些,你可以找找
还有就是可以找大企业的代码编写规范来看

使用特权

评论回复
10
技术小师弟|  楼主 | 2017-10-26 16:09 | 只看该作者
Ketose 发表于 2017-10-26 11:11
第一:这样的代码,看都不想看.
第二:要学会使用论坛里的代码格式化功能. ...

程序的确很差劲,什么是代码格式化功能呀

使用特权

评论回复
11
技术小师弟|  楼主 | 2017-10-26 16:10 | 只看该作者
dirtwillfly 发表于 2017-10-26 08:26
很多老师,并没有多少实际的工程经验,包括有些卖板子出视频的

有没有好一点的视频推荐呢

使用特权

评论回复
12
技术小师弟|  楼主 | 2017-10-26 16:44 | 只看该作者
dirtwillfly 发表于 2017-10-26 16:08
没听说有视频,书籍倒是有一些,你可以找找
还有就是可以找大企业的代码编写规范来看 ...

好的,老师讲的知识都是书本内容,就得起多看看实际的公司项目开发

使用特权

评论回复
13
座机呀| | 2017-10-26 21:09 | 只看该作者
技术小师弟 发表于 2017-10-26 16:06
真是说的实实在在,我正在学51和msp430,程序都是跟着板子配套视频学的,这样下去我的问题会越来越多,不 ...

多看看芯片的外设库,像ST的HAL库,TI的OSAL,多想,多实践,多反思.
要看就看大厂的文档,更权威,不是我说,国内那些杂七杂八的学习视频,看了也是浪费时间,学习单片机就是要多实践,没有捷径.

使用特权

评论回复
14
caijie001| | 2017-10-26 21:38 | 只看该作者
feelhyq 发表于 2017-10-25 09:08
不敢苟同,while多不多 怎么用应该根据需求来,我还真没听那个老师说过只能用一个while ...

我也觉得,while得看用在什么地方

使用特权

评论回复
15
caijie001| | 2017-10-26 21:39 | 只看该作者
技术小师弟 发表于 2017-10-26 16:06
真是说的实实在在,我正在学51和msp430,程序都是跟着板子配套视频学的,这样下去我的问题会越来越多,不 ...

视频要看的,分模块写代码,可移植性好。然后写代码要多加点注释,说说这句代码有什么用,然后写代码多用英文名称,

使用特权

评论回复
16
caijie001| | 2017-10-26 21:40 | 只看该作者
技术小师弟 发表于 2017-10-26 16:44
好的,老师讲的知识都是书本内容,就得起多看看实际的公司项目开发

去看看写代码的规范性

使用特权

评论回复
17
技术小师弟|  楼主 | 2017-10-27 15:33 | 只看该作者
座机呀 发表于 2017-10-26 21:09
多看看芯片的外设库,像ST的HAL库,TI的OSAL,多想,多实践,多反思.
要看就看大厂的文档,更权威,不是我说,国 ...

理解

使用特权

评论回复
18
技术小师弟|  楼主 | 2017-10-27 15:34 | 只看该作者
caijie001 发表于 2017-10-26 21:40
去看看写代码的规范性

知道了,谢谢你!

使用特权

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

本版积分规则

11

主题

53

帖子

1

粉丝