本帖最后由 ytfdhb 于 2013-9-1 12:45 编辑
不知道大家动手试了没有,下面是我当时写的,不知道大家有没有更好的方法,如果有,请交流一下,谢谢!
下面这段程序是在圈圈的51开发板上做的试验:
电路连线是这样的:
S1 - LED开灯键
S2 - LED关灯键
S3- 电源键
如果有板子的话可以试一下,俺是菜鸟,希望大家不要鄙视,但也请大家不要眼高手低,虽然是简单的题目,你不好好想一下,就不知道会有更好的方法,
我当时看这题目时也觉得没什么,可是越写逻辑越混乱,后来静下心来,慢慢整理了一下,才写出来的。我同事有用冒泡法写的,也不错,还有其它方法,
所以,我还是希望大家能想更多的解决办法,而不是一看这个题目就觉得没水平,解决这个小问题浪费时间,觉得在这个论坛问这个问题的人,就是弱智,我是来与大家讨论的,希望大家不要人身攻击,谢谢!
同时也希望,那些像我一样的菜鸟能多动动脑,多动动手,多思考思考看有没有更好的方法,谢谢!
顺便说一下,我做的时候多加了一个灯,效果是一样的!
//----------------------------------------------------------------------------------------------------------------------------------------------
// 存储亮灯的队列
unsigned char box[4] = {1,2,3,4}; // 就绪队列
unsigned char on_seq[4] = {0,0,0,0}; // 已开灯队列(完成队列)
// led_inc - 开灯键按下标志
// led_de - 关灯键按下标志
// power_st - 电源按键标志
unsigned char led_inc,led_de,power_st;
//*********************************************************************
// 执行相关任务
//*********************************************************************
void on_off_deal( void )
{
unsigned char seq_sum,item_swap;
unsigned char i;
// 系统电源按键
if(power_st == TRUE){
OnLed8(); // 打开power灯
}
else
{
led_all_off(); // 关闭所有的灯
for(i=0;i<4;i++) // reset the state of leds
{
on_seq = 0; // 开灯队列清空
box = (i+1); // box 队列复位
led_de = FALSE; // 开灯键无效
led_inc = FALSE; // 关灯键无效
}
return;
}
// 开灯按键
if((led_inc & power_st) == TRUE)
{
seq_sum = on_seq[0]+on_seq[1]+on_seq[2]+on_seq[3];
if(seq_sum < 10) // 检测是否全开,如果没有全开,则执行开的动作
{
item_swap = box[3];
box[3] = box[2];
box[2] = box[1];
box[1] = box[0];
box[0] = item_swap;
// 点亮的灯入队列
if(on_seq[3] == FALSE )
{
on_seq[3] = on_seq[2];
on_seq[2] = on_seq[1];
on_seq[1] = on_seq[0];
on_seq[0] = item_swap;
}
led_sw(on_seq[0],TURN_ON); // 开灯,每次只开队尾的灯
}
}
led_inc = FALSE; // 保证按键每次只执行一次
// 关灯按键
if((led_de&power_st) == TRUE)
{
seq_sum = on_seq[0]+on_seq[1]+on_seq[2]+on_seq[3];
if(seq_sum >= 10) // 如果开灯队列已满,关最先排在队头的
{
item_swap = on_seq[3];
on_seq[3] = 0;
}
else
{
if(seq_sum != 0) // 如果开灯队列没有满,且不为空
{
if(on_seq[2] != FALSE)
{
item_swap = on_seq[2];
on_seq[2] = 0;
}
else{
if(on_seq[1] != FALSE){
item_swap = on_seq[1];
on_seq[1] = 0;
}
else{
if(on_seq[0] != FALSE){
item_swap = on_seq[0];
on_seq[0] = 0;
}
}
// 容错检测,以保证box队列中没有空位,将熄灭的灯,装入就绪队列
if(box[0]==0){
if(box[1]==0){
if(box[2]==0){
if(box[3] == 0){
box[3] = item_swap;
}
else{
box[2] = item_swap;
}
}
else{
box[1]=item_swap;
}
}
else
{
box[0]=item_swap;
}
}
}
}
}
led_sw(item_swap,TURN_OFF); // 执行关灯动作
}
led_de = FALSE; // 保证按键只执行一次
}
|