标题:
单片机两路延时时间 存储的程序问题
[打印本页]
作者:
yong761228
时间:
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;
}
}
}
作者:
yong761228
时间:
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;
作者:
yong761228
时间:
2019-7-18 13:48
有哪位师傅可以帮忙看看吗?
作者:
cjm82
时间:
2019-7-19 23:22
程序有点长,代码得一行行看,挺费脑筋的.这里只说说思路吧.
粗略看了下,你这程序大概是利用TM1650读按键,根据输入来决定具体操作,保存之类的.
既然程序存储有问题,而且是根据输入的东西来决定保存,那么影响它不能保存的可能是输入状态的那部分代码没写好导致保存的代码没有得到执行,或者用于保存的那部分代码没写好.你可以先另建个工程,写个很简单的小程序.建立个两个常量比如 0xa3和0xb4把他保存到FLASH的某个地址里,然后再从这个地址里读出来,假如读出来的数字也是0XA3和0xb4,那么就点亮LED1,如果不是 就点亮LED2.这样很容易验证你保存的代码是否有误.
用类似的办法,也很容易验证输入部分的代码有无出错了.
两者都调试完,整合一下就可以了.
或者会用单步调试的话,用单步调试也是不错的办法.(51的单步调试以前学的时候没怎么研究过,现在也很少用51,所以懒得去研究了)
作者:
yong761228
时间:
2019-7-20 06:14
cjm82 发表于 2019-7-19 23:22
程序有点长,代码得一行行看,挺费脑筋的.这里只说说思路吧.
粗略看了下,你这程序大概是利用TM1650读按键,根 ...
非常感谢师傅,我昨晚已经搞好了,就是根据您的类似方法,我先存储1个时间,没问题了,再存储第二个时间。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1