麻烦大家帮我看个单片机C语言程序

weilong8998 2010-08-02 12:03:32
程序功能:
按key1开始记时
按key2记录一个数据,存储到数组中,存储8组
按key3和key4翻看存储在数组的数据

问题就是这个程序存储到数组中的都是最后存储的那个数,也就是说只能记录下最后按下键时的那个数

程序如下,大家帮我看看

#include<reg52.h>

code unsigned char tab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
code unsigned char tab1[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF} ;//共阴数码管0-9带小数点

static unsigned char ms,sec,min;
static unsigned char sec1,min1,sec2,min2,sec3,min3,sec4,min4,sec5,min5,sec6,min6,sec7,min7,sec8,min8;
static unsigned char Sec[8],Min[8];
static char i=0,j=0,ID;

sbit KEY1=P3^0; //开始、暂停
sbit KEY2=P3^1; //记录
sbit KEY3=P3^2; //上翻
sbit KEY4=P3^3; //下翻

void delay(unsigned char cnt)
{
while(--cnt)
;
}


main()//主函数
{


TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=0;

TMOD |=0x10; //定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA =1;


//display();

while(1)//主循环
{

/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作
{
delay(10000);
if(!KEY1)
{
TR0=!TR0; //正常时间 小时 加1

}
}
////////////////////////////////////////////////////////////////
if(!KEY2) //按键2去抖以及动作
{
delay(10000);
if(!KEY2)
{

Sec[i]=sec;
Min[i]=min;
delay(10);
i++;
if(i==8)
i=0;

}
}
////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
if(!KEY3) //按键去抖以及动作
{
delay(10000);
if(!KEY3)
{
TR0=0;

sec=Sec[j];
min=Min[j];
j++;
if(j==8)
j=0;

}
}
/////////////////////////////////////////////////////////////////
if(!KEY4) //按键去抖以及动作
{
delay(10000);
if(!KEY4)
{
if(j==0)
j=7;
TR0=0;
sec=Sec[j];
min=Min[j];
j--;

}
}
}
}
////////////////////////////////////////////////////////////////
/********************************/
/* 定时中断1 */
/********************************/
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描
{
static unsigned char num;
TH1=0xF8;//重入初值
TL1=0xf0;

switch (num){
case 0:P2=0;P0=tab[min/10];break; //分别调用缓冲区的值进行扫描
case 1:P2=1;P0=tab1[min%10];break;
case 2:P2=2;P0=tab[sec/10];break;
case 3:P2=3;P0=tab[sec%10];break;

default:break;
}
num++; //扫描8次,使用8个数码管
if(num==4)
num=0;
}
//////////////////////////////////////////////////////////////////
/********************************/
/* 定时中断0 */
/********************************/
void tim(void) interrupt 1 using 1
{

TH0=0xd8;//重新赋值
TL0=0xf0;
ms++;

if (ms==100)
{
ms=0;
sec++;//秒加1
if(sec==60)
{
sec=0;
min++; //分加1
if(min==60)
{
min=0;

}

}

}

}
...全文
155 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
logiciel 2010-08-04
  • 打赏
  • 举报
回复
重写如下:

  static unsigned char last_key=0;
while(1)//主循环
{
/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作
{
delay(10000);
if(!KEY1)
{
if (last_key !=1)
{
TR0=!TR0; //正常时间 小时 加1
last_key=1;
}
}
}
////////////////////////////////////////////////////////////////
else if(!KEY2) //按键2去抖以及动作
{
delay(10000);
if(!KEY2)
{
if (last_key !=2)
{
Sec[i]=sec;
Min[i]=min;
delay(10);
i++;
if(i==8)
i=0;
last_key=2;
}
}
}
else if (!KEY3)
{
}
else if (!KEY4)
{
}
else
last_key=0;
}

logiciel 2010-08-04
  • 打赏
  • 举报
回复
主循环修改为在发现键变化了才进行处理:


static unsigned char last_key=0;
while(1)//主循环
{
/////////////////////////////////////////////////////////////////
if(!KEY1 && last_key!=1) //按键1去抖以及动作
{
delay(10000);
if(!KEY1)
{
TR0=!TR0; //正常时间 小时 加1
last_key=1;
}
}
////////////////////////////////////////////////////////////////
if(!KEY2 && last_key!=2) //按键2去抖以及动作
{
delay(10000);
if(!KEY2)
{

Sec[i]=sec;
Min[i]=min;
delay(10);
i++;
if(i==8)
i=0;
last_key=2;
}
}

zhangxuyu1118 2010-08-04
  • 打赏
  • 举报
回复
程序有问题的
DayDayUpCQ 2010-08-02
  • 打赏
  • 举报
回复
你每次按下键后,去抖动之后,应设置while( !KEY1 );等待按键被松开,要不当你按下某个键时,你的程序会一直检测到这个键被按下,而一直记录数据。
weilong8998 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bobo364 的回复:]
C/C++ code
if(!KEY2) //按键2去抖以及动作
{
delay(10000);
if(!KEY2)
{

Sec[i]=sec;//按键后把sec变量的值给sec数组的第i个
Min[i]=min;
delay(10);
i++;
if(i==……
[/Quote]


还是不行呀,试过了、、、
bobo364 2010-08-02
  • 打赏
  • 举报
回复
if(!KEY2) //按键2去抖以及动作
{
delay(10000);
if(!KEY2)
{

Sec[i]=sec;//按键后把sec变量的值给sec数组的第i个
Min[i]=min;
delay(10);
i++;
if(i==8)
i=0; //i等于8时i归0,数组从0位开始记录

}
}
logiciel 2010-08-02
  • 打赏
  • 举报
回复
也可以在大循环中加delay,但这样周期不准确。
logiciel 2010-08-02
  • 打赏
  • 举报
回复
可能是主循环中采样4个键值的频率太高。delay(10000)相当于延迟多少时间?当采到KEY2时,delay(10000),然后就是下一次大循环。

建议通过定时器周期(例如,每秒1次)地采样KEY2。
durant 2010-08-02
  • 打赏
  • 举报
回复
这是类似秒表的功能?
weilong8998 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 logiciel 的回复:]
if(!KEY4)
{
if(j==0) //应改为if(j<0)
j=7;

if (ms==100)
1秒=1000毫秒,在单片机上=100?如果是1000毫秒,那么ms的类型要改为int
[/Quote]

那个定时器是10ms的,没有问题,第四个键可以先不管哟,问题就是只能记录下最后按下键时的那个数据
weilong8998 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]
是你的程序按一下键就记录 n 多次。而你的记录区只有8个,当然只看到最后一个键了。

怀疑是你的 KEY2 这个键使用后不自动复位所致,当这个键按下一次之后,以后每次轮询都处于按下状态,所以它就不断地记录。
[/Quote]

有什么办法可以解决吗,我的开发板应该是可以复位的呀,按键是没有问题的,如果是这样的话,有什么办法可以解决吗?
logiciel 2010-08-02
  • 打赏
  • 举报
回复
if(!KEY4)
{
if(j==0) //应改为if(j<0)
j=7;

if (ms==100)
1秒=1000毫秒,在单片机上=100?如果是1000毫秒,那么ms的类型要改为int
icansaymyabc 2010-08-02
  • 打赏
  • 举报
回复
是你的程序按一下键就记录 n 多次。而你的记录区只有8个,当然只看到最后一个键了。

怀疑是你的 KEY2 这个键使用后不自动复位所致,当这个键按下一次之后,以后每次轮询都处于按下状态,所以它就不断地记录。
yarkhotel 2010-08-02
  • 打赏
  • 举报
回复
要先判定按键按下后,该按键是否一直处于按下状态,你可以在KEY2中把循环展开,并加led指示灯。然后在根据不同的情况加以分析。
weilong8998 2010-08-02
  • 打赏
  • 举报
回复
我自己再顶一下,麻烦了、、、

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧