找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机两路延时时间 存储的程序问题

[复制链接]
跳转到指定楼层
楼主
ID:405193 发表于 2019-7-17 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位师傅您们好,我用STC15W404AS和TM1650编程两路延时程序,不能存储两个时间,哪位师傅帮我看看,怎样修改,非常感谢。

if(key_timeto)//如果按键扫描时间到,此变量在定时器中会被每隔60ms置1一次
                    {                 
                                 key_L = key;
                                     key_timeto = 0; //清0
                                     key = Scan_Key();//读按键
                                     //第一个按键按下
                                     if(key == 0x44)   //此键值和数据手册上对应
                                     {
                                      if(key_ok==0) //按键按下
                                       {
                                         key_ok = 1;
                                        mode = (mode+1)%2;//切换模式
                                       }
                                     }
                                    //第二个按键按下
                                    else if(key == 0x4c)
                                     {        if(mode == 0)//模式0为设置模式
                                       {
                                         if(time2<999)
                                        time2 = (time2+1);//按此键加时间
                                       }
                                      if(mode == 1)//模式1为设置模式
                                       {
                                         if(time1<999)
                                        time1 = (time1+1);//按此键加时间
                                       }
                                    
                                     timea=time1;
                                        IapEraseSector(0);//保持改变后的时间值
                                    IapProgramByte(0,(timea>>8));
                                    IapProgramByte(1,(uchar)timea);
                                     timeb=time2;
                                        IapEraseSector(1);//保持改变后的时间值
                                    IapProgramByte(1,(timea>>8));
                                    IapProgramByte(2,(uchar)timea);
                                       
                                        }
                                    //第三个按键按下
                                   else if(key == 0x54)
                                   {  if(mode == 0)//模式0
                                       {
                                         if(time2>0)
                                         {
                                           time2--;//减时间
                                         }
                                       }
                                   
                                    
                                    if(mode == 1)//模式1
                                    {
                                     if(time1>0)
                                      {
                                       time1--;//减时间
                                      }
                                    }
                                   
                                     timea=time1;
                                        IapEraseSector(0); //保存时间
                                    IapProgramByte(0,(timea>>8));
                                    IapProgramByte(1,(uchar)timea);
                                            timeb=time2;
                                           IapEraseSector(1); //保存时间
                                    IapProgramByte(1,(timeb>>8));
                                    IapProgramByte(2,(uchar)timeb);
                                   }
                                   else
                                   {
                                    key_ok = 0;
                                    }
                  
                  
                   }
        if(update_dis) //30ms到,更新显示
         {
                        update_dis = 0;
                        TM1650_Set(0x48,0x11);

                        if(stat ==0)
                          {
                            if(mode == 1)//如果是模式1
                              {
                                                TM1650_Set(0x68,CODE[timea/100]);        //显示
                                                TM1650_Set(0x6A,CODE[timea/10%10]);
                                                TM1650_Set(0x6C,CODE[timea%10]);
                                                
                             }
                           else if(mode == 0)
                              {
                                           TM1650_Set(0x68,CODE[timeb/100]);
                                           TM1650_Set(0x6A,CODE[timeb/10%10]);
                                           TM1650_Set(0x6C,CODE[timeb%10]);
                                          
                              }
                           }
                        else if(stat == 1)//最后倒计时完后显示的内容
                          {         
                            timea=time1;
                                TM1650_Set(0x68,CODE[timea/100]);
                                TM1650_Set(0x6A,CODE[timea/10%10]);
                                TM1650_Set(0x6C,CODE[timea%10]);         
                                stat=0;         
                          }  
         }

   }

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

使用道具 举报

沙发
ID:405193 发表于 2019-7-17 12:13 | 只看该作者
初始化:uchar key,key_L,key_ok;
          TM1650_Set(0x48,0x11);//初始化数码管
          TM1650_Set(0x68,CODE[0]);//初始化后要把显存先写数据就能显示
          TM1650_Set(0x6A,CODE[0]);
          TM1650_Set(0x6C,CODE[0]);
       
          time1 = (IapReadByte(0)<<8)+IapReadByte(1);//读eeproM中数据,初始化时间初值
          time2 = (IapReadByte(0)<<8)+IapReadByte(2);//读eeproM中数据,初始化时间初值
          if(time1 >= 999)//如果时间值大于999则是第一次上电
           {
             time1 = 000;//则为默认值
                 time2 = 002;
           }
         Timer0Init();//定时器初始化
         timea = time1;//初始化时间
         timeb = time2;
回复

使用道具 举报

板凳
ID:405193 发表于 2019-7-18 13:48 | 只看该作者
有哪位师傅可以帮忙看看吗?
回复

使用道具 举报

地板
ID:388197 发表于 2019-7-19 23:22 | 只看该作者
程序有点长,代码得一行行看,挺费脑筋的.这里只说说思路吧.
粗略看了下,你这程序大概是利用TM1650读按键,根据输入来决定具体操作,保存之类的.
既然程序存储有问题,而且是根据输入的东西来决定保存,那么影响它不能保存的可能是输入状态的那部分代码没写好导致保存的代码没有得到执行,或者用于保存的那部分代码没写好.你可以先另建个工程,写个很简单的小程序.建立个两个常量比如 0xa3和0xb4把他保存到FLASH的某个地址里,然后再从这个地址里读出来,假如读出来的数字也是0XA3和0xb4,那么就点亮LED1,如果不是 就点亮LED2.这样很容易验证你保存的代码是否有误.
用类似的办法,也很容易验证输入部分的代码有无出错了.
两者都调试完,整合一下就可以了.
或者会用单步调试的话,用单步调试也是不错的办法.(51的单步调试以前学的时候没怎么研究过,现在也很少用51,所以懒得去研究了)

评分

参与人数 1黑币 +10 收起 理由
yong761228 + 10 赞一个!

查看全部评分

回复

使用道具 举报

5#
ID:405193 发表于 2019-7-20 06:14 | 只看该作者
cjm82 发表于 2019-7-19 23:22
程序有点长,代码得一行行看,挺费脑筋的.这里只说说思路吧.
粗略看了下,你这程序大概是利用TM1650读按键,根 ...

非常感谢师傅,我昨晚已经搞好了,就是根据您的类似方法,我先存储1个时间,没问题了,再存储第二个时间。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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