在学校做出来有暂停功能的秒表之后,和手机秒表做精确度实验时,看见手机秒表里有计次功能,就想做出来带有计次功能的秒表,当时做好之后,计次的值并不是自己实际记下的,程序也不错,当时很困惑,这几天把定时器和按键的又练了练,还是没找到为啥,今天把头文件改成STC12C5A60S2之后编译,出现的一条错误, “'DATA': SEGMENT TOO LARGE “ 原来是当时建的用来储存计次数据的数组太大了,超过了这个单片机的RAM,在学校的时候还不知道怎么添加宏晶的单片机,当时用的那个型号可能RAM比较大,keil没检查出来错误。
看主程序
void main()
{
unsigned long sec = 0;
bit backup = 1; //按键值备份,保存前一次的扫描值
bit backup4 = 1;
bit backup12 = 1;
char times = 0; //按键计数,记录按键按下的次数
EA = 1; //使能总中断
ENLED = 0; //使能数码管进行显示
TMOD = 0x11; //设置T0,T1均为模式1
ET0 = 1; //使能T0中断
ET1 = 1; //使能T1中断
TR0 = 1; //启动T0
TR1 = 1; //启用T1
p23 = 0; //启用K4 K12 K16
while (1)
{
if(flag1s == 1) //时间增加0.00999s
{
flag1s = 0;
sec++; //计时时间增加0.01s
}
if(jici == 0&&h<15) //启用计次
{
jicihuancunqu[h]=sec;//记下当前时间
h++;
jici =~jici;
}
if(jici == 0&&h == 15)
{
jicihuancunqu[14]=sec;//保留最后一个计次数据
jici =~jici;
}
if(menu ==0) //显示当前时间
{
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = daidianLedChar[sec/100%60%10];//秒位
LedBuff[3] = LedChar[sec/100%60/10%10];
LedBuff[4] = daidianLedChar[sec/6000%10];//分钟位
LedBuff[5] = LedChar[sec/60000%10];
}
else if(1 == menu)//显示计次时间
{
LedBuff[0] = LedChar[jicihuancunqu[k]%10];
LedBuff[1] = LedChar[jicihuancunqu[k]/10%10];
LedBuff[2] = daidianLedChar[jicihuancunqu[k]/100%60%10];//秒位
LedBuff[3] = LedChar[jicihuancunqu[k]/100%60/10%10];
LedBuff[4] = daidianLedChar[jicihuancunqu[k]/6000%10];//分钟位
if (jicihuancunqu[k]<59900)
LedBuff[5] = LedChar[k+1];//表示第几次记的时间
else LedBuff[5] = LedChar[jicihuancunqu[k]/60000%10];//大于10分钟显示时间
}
if (KeySta4 != backup4) //判断计次按键是否按下
{
if (backup4 == 0)
{
if(0 == menu)
jici =~jici;
else
{
k++;
if (k>14)
k = 0;
}
}
backup4 = KeySta4;
}
if (KeySta12 != backup12) //判断模式按键是否按下
{
if (backup12 == 0)
{
menu = ~menu;
}
backup12 = KeySta12;
}
if (KeySta != backup) //判断暂停/启动按键是否按下
{
if (backup == 0) //完成 奇数 次按下,时间暂停
{
cntkey=~cntkey;
buzzer = 0;//蜂鸣器响
for(j=0;j<40000;j++);
buzzer = 1;
}
backup = KeySta; //更新备份为当前值,以备进行下次比较
}
}
}
|