蓝桥杯单片机-国赛2——按键专项测试:单击、双击、双按键、数码管闪烁移位

本文基于小蜜蜂代码风格,并结合往期文章程序修改

参考代码中注释较少,有疑问可评论或私信,会及时解答

其他参考文章请查看本人博客其他专栏


1. 编程心得

  • 定时计数器尽量选用1T
  • ds1302的bcd码,最大值选用0x99。在进位判定时,转为十进制,再比较时间大小决定是否补偿60
  • 双按键消抖尽量长,为了消除按键的前后次序,20ms比较可以
  • 要检测按键是否按下,可以使用标志位指示按下的操作。
  • 注意定义的局部变量,要放在语句最开始,前面不能放任何语句
  • 刷新外设时,注意利用ds1302的时间进行定时时,会出现不在中断内,导致更新时间不及时
  • 数码管8位只亮1位,可能是因为中断函数内太复杂,可以想办法减轻中断函数负担
  • 可以使用多层if嵌套替代多个逻辑判断,减少bug的产生
  • 活用标志位变量
     

2. 题目讲解

2.1 时间界面,开机默认界面,显示正常时间

2.2 闹钟界面,可自定义3个闹钟

【按键要求】:

        红色区域为本任务涉及的部分。

        在界面1下,s8-s17单击时,切换到界面2 。同时长按不松手s18+s19时,蜂鸣器滴一声,并间隔1s逐个显示用户设置的闹钟 。双击s19展示闹钟铃声1,并设置为闹钟铃声。双击s19展示闹钟铃声2,并设置为闹钟铃声。

        在界面2下,s8-s11为0-3, s12-s15为4-7,s16-s17为8-9,S18单击为闹钟界面切换,S19单击为确定设置键,S18+S19同时按下无反应。

2.3【具体要求】:

        1.设置功能

        正常时间显示界面1情况下,按下s11-s17任意按键,进入闹钟设置界面2,默认秒的十位闪烁。再次按下s11-s17任意按键 ,可以实现闹钟时间设置,从分的个位,向左移动到分十位,直到时十位,依次循环,再次按下,时十位切换至秒个位。按下数字键,直接修改对应的闹钟时间(需注意分时间整体不能大于等于60,只能0-59,时不能大于等于24,只能0-23)。 按下s19,确定闹钟设置,立即回到界面1,(没有按下确定设置键s19,设置不成功),在界面2下,5秒无按键按下,自动退出闹钟设置界面2,进入时间显示界面1,闹钟无效。同时,在界面2下,按下s18可切换到下一个闹钟设置,共3个闹钟可设置。

        2.交互功能

        在时间显示界面1下,长按下不松手S18+S19双按键,蜂鸣器发出滴的一声,并可以间隔1s逐个查看设定的3个闹钟数值。双击s19时,可以播放闹钟铃声1,并将闹钟的实际铃声设定为铃声1 。双击s18时,可以播放闹钟铃声2,并将闹钟的实际铃声设定为铃声2 。双击操作必须在1s以内完成,如果超出1s则判定双击失败。

        【额外考点】:定义s7为长按按键,按住超过2s则所有闹钟清零,但不松手界面2依旧保持。

        3.显示要求

        数码管无闪烁、跳动、鬼影、抖动、脉动等现象

        在界面2下设置闹钟时,要求对应位间隔0.5s闪烁,即亮灭周期为1s ,按下任意数字键后,闪烁位循环向左移动,并立即将对应数字显示在数码管上。在界面2下,如果没有按下任何按键,则5s后自动返回界面1。在界面1下,按下任意数字键立即切换到界面2,此时固定为设置闹钟A1。并确保在界面1时间显示到xx:xx:55~00:00:00之间任意时刻按下数字键后,在界面2能正常维持5s的滞空时间(注意秒进位带来的返回界面1的bug)。

        4.蜂鸣器设置

        闹钟时间到,蜂鸣器播放对应的铃声。铃声1为2s一个周期,前1s内均匀滴滴滴……,后1s内静音,以此重复,持续6秒,具体效果自定义。铃声2为2s一个周期,前1s为滴——滴——滴滴——……,后1s静音,因此循环,持续6秒,具体效果自定义。

        如果时间到了整点,蜂鸣器持续响1秒。

(注意,对于未设置的闹钟,默认为00:00,此时当时间刚好到整点时,只有整点的1s报时,而闹钟不会启动)

        界面1下,双击s18或s19可以播放对应铃声,播放总时长为2s

        在界面1下,同时按下S18+S19进行闹钟查看时,蜂鸣器滴一声,时长自定义。

3.代码资源情况

  • 只用定时计数器0产生50us的中断,未用定时计数器1
  • 矩阵按键s4-s6未使用,ds1302每500ms刷新一次
  • 设置初始时间为:23:58:55,初始闹钟1为:23:59,闹钟2和闹钟3为00:00处于无效状态
  • 初始为闹钟铃声1

4.完整参考代码

        头文件如不会操作,可查看本人博客省赛专栏

4.1 底层代码源文件

#include <ds1302.h>
#include <onewire.h>
#include <reg52.h>
#include <intrins.h>

//锁存器通道选择函数
void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
		case 0:
			P2 = ( P2 & 0x1f ) | 0x00;
		break;
	}
}

//单位数码管显示函数
void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 0 );
	P0 = 0x01 << pos_SMG;	
	select_HC573( 6 );
	select_HC573 ( 0 );
	P0 = value_SMG;
	select_HC573( 7 );
	select_HC573 ( 0 );
}

//全位数码管静态显示
void state_SMG_all ( unsigned char value_SMG_all )
{
	select_HC573 ( 0 );
	P0 = 0xff;	
	select_HC573( 6 );
	select_HC573 ( 0 );
	P0 = value_SMG_all;
	select_HC573( 7 );
	select_HC573 ( 0 );
}	


//led灯光控制函数
void state_led ( unsigned char value_led )
{
	select_HC573 ( 0 );
	P0 = 0xff;
	select_HC573 ( 4 );
	P0 = value_led;
	select_HC573 ( 4 );	
	select_HC573 ( 0 );
}

//初始化系统,关闭继电器和蜂鸣器
void init_sys ()
{
	select_HC573 ( 0 );
	P0 = 0xff;	
	select_HC573 ( 4 );
	select_HC573 ( 0 );
	P0 = 0x00;
	select_HC573 ( 5 );
	select_HC573 ( 0 );

}

4.2 底层代码头文件

#ifndef __BASECODE_H__
#define __BASECODE_H__


unsigned char code duanma[20] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                 0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0xc7,0x89,0x8c};
unsigned char code Write_address [7] = { 0x80 , 0x82 , 0x84 , 0x86 , 0x88 , 0x8a , 0x8c};
unsigned char code Read_address [7] = { 0x81 , 0x83 , 0x85 , 0x87 , 0x89 , 0x8b , 0x8d };
 
//2024year 5month 14day 2 23 58 55
unsigned char date_ds1302 [7] = { 0x55 , 0x58 , 0x23 , 0x14 , 0x05 , 0x02 , 0x24 };

void state_buzz ( unsigned char value_buzz );
void select_HC573 ( unsigned char channal );
void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG );
void state_SMG_all ( unsigned char value_SMG_all );
void state_led ( unsigned char value_led );
void init_sys ();
void state_buzz ( unsigned char value_buzz );


#endif

4.3 主函数文件

#include <reg52.h>
#include <intrins.h>
#include <ds1302.h>
#include "basecode.h"

sfr AUXR = 0x8e;
sfr P4 = 0xc0;

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

unsigned char SMG_flag = 1;
unsigned char clock_flag = 1;
unsigned char set_bit = 4;
unsigned char old_second = 0x99;
unsigned char flash_count = 0x00;
unsigned char ds1302_hour = 0x00;
unsigned char ds1302_min = 0x00;
unsigned char ds1302_second = 0x00;
bit count_1s = 0;

void flash_SMG();
void Delay20ms();
void Delay100ms ();

void state_buzz ( unsigned char value_buzz )
{
	if ( value_buzz == 0 )
	{
		P2 = ( P2 & 0x1f ) | 0xa0;
		P0 = 0x00;
	}
	else
	{
		P2 = ( P2 & 0x1f ) | 0xa0;
		P0 = 0x40;
	}
}

void ring1 ()
{
	if ( count_1s == 1 )
	{
		state_buzz ( 1 );
		Delay20ms();
		state_buzz ( 0 );
		Delay20ms();
		state_buzz ( 1 );
		Delay20ms();
		state_buzz ( 0 );
		Delay20ms();
		state_buzz ( 1 );
		Delay20ms();
		state_buzz ( 0 );
		Delay20ms();
	}
}

void ring2 ()
{
	if ( count_1s == 1 )
	{
		state_buzz ( 0 );
		Delay100ms();
		state_buzz ( 1 );
		Delay100ms();
		state_buzz ( 0 );
		Delay100ms();
		state_buzz ( 1 );
	}
}

void ringdi ()
{
		state_buzz ( 1 );
		Delay20ms();
		Delay20ms();
		state_buzz ( 0 );
}	
	

void init_ds1302 ()
{
	unsigned char i;
	Write_Ds1302_Byte ( 0x8e , 0x00 );
	for ( i=0 ; i<3 ; i++ )
	{
		Write_Ds1302_Byte ( Write_address[i] , date_ds1302[i] );
	}
	Write_Ds1302_Byte ( 0x8e , 0x80 );
 
}
 
void flash_date()
{
		unsigned char i;
		ds1302_hour = date_ds1302[2];
		ds1302_min = date_ds1302[1];
		ds1302_second = date_ds1302[0];
		
		
		for ( i=0 ; i<3 ; i++ )
		{
			date_ds1302[i] = Read_Ds1302_Byte ( Read_address[i] );
		}
}


void init_timer0()		//50微秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xA8;		//设置定时初始值
	TH0 = 0xFD;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	EA = 1;
	ET0 = 1;
}



unsigned char clock[3][4] = { { 2 , 3 , 5 , 9 } , { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 } };//分别对应三个闹钟的时分位
unsigned char set_clock_value[4] = { 0 , 0 , 0 , 0 };  //用于数码管显示,同时存储暂时数据
unsigned char old_clean_second = 0;
unsigned char count_50us = 0;
unsigned char count_10ms = 0;
unsigned char count_05s = 0;
bit count_500ms = 0;
bit count_500ms_flag = 0;
bit clean_clock = 0;
bit key7_flag = 0;
void timer0_service () interrupt 1
{
	if ( ++count_50us == 200 )
	{
		count_50us = 0;
		
		if ( ++count_10ms % 50 == 0 ) 
		{
			if ( count_500ms_flag == 0 )
			{
				count_500ms = ~count_500ms;	
			}
			else
			{
				count_500ms = 1;	
			}
			
			if ( ++count_05s % 2 == 0 )
			{
				count_1s = ~count_1s;
				
				if ( count_05s == 200 ) 
				{
					count_05s = 0;
				}
			}
			
			count_10ms = 0;			
			
		}
		flash_date();
			
	}		
		
	
	
	if ( count_50us % 40 == 0 )
	{
		if ( ++flash_count == 8 )
		{
			flash_count = 0;
		}
		
		flash_SMG();
	}
	
	
	//长按s7超过2s所有闹钟清零
	if ( clean_clock == 1 && key7_flag == 1 )
	{

		unsigned char i,j;		
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_clean_second / 16 * 10) + (old_clean_second % 16);

		if ( current_second < previous_second )
		{
			current_second += 60;
		}
		
		if ( current_second - previous_second >= 2 ) 		
		{
			for( i=0 ; i<4 ; i++ )
			{
				for ( j=0 ; j<4 ; j++ )
				{
					clock[i][j] = 0;
				}
			}
			
			for ( i=0 ; i<4 ; i++ )
			{
				set_clock_value[i] = 0;
			}
			key7_flag = 0;			
		}
		
	}	
}

bit flag_buzz = 0;
bit key_flag = 0;   //按键被按下标志,1表示被按下,0表示未被按下
bit play_ring = 0;
unsigned char key19_twice = 0;
unsigned char key18_twice = 0;
unsigned char old_twice_second = 0;

void value_running ()
{
	if ( ds1302_hour == 0x00 && ds1302_min == 0x00 && ds1302_second < 0x01 )
	{
//		select_HC573(5);P0 = 0x40;select_HC573(0);
		state_buzz ( 1 );
	}
	else 
	{
//		select_HC573(5);P0 = 0x00;select_HC573(0);
		state_buzz ( 0 );
	}
	
	if ( key_flag == 1 )
	{
		SMG_flag = 2;	
	}
	else if (key_flag == 0 && SMG_flag == 2) 
	{
		// 将BCD编码的秒转换为十进制
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_second / 16 * 10) + (old_second % 16);

		// 检查是否已经过了5秒,考虑到秒数从59回到0的情况
		if (current_second < previous_second) 
		{ // 说明发生了进位
			current_second += 60;
		}

		if ((current_second - previous_second) >= 5) 
		{
			SMG_flag = 1;
			clock_flag = 1;
			set_bit = 4;
		}
	}

	//1s内未成功双击,只是单击
	if ( key19_twice == 1 )
	{
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_twice_second / 16 * 10) + (old_twice_second % 16);
		
		if ( (current_second - previous_second) > 2 )
		{	
			key19_twice = 0;
		}		
	}
	else if ( key18_twice == 1 )
	{		
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_twice_second / 16 * 10) + (old_twice_second % 16);
		
		if ( current_second - previous_second > 2 )
		{	
			key18_twice = 0;
		}
	}
	
	//1s内成功双击
	if ( key19_twice == 2 )
	{		
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_twice_second / 16 * 10) + (old_twice_second % 16);
		play_ring = 0;
		if (current_second < previous_second) 
		{ 
			current_second += 60;
		}
		
		if ( (current_second - previous_second) <= 2 )
		{	
			ring1 ();
		}
		else
		{
			key19_twice = 0;
			state_buzz ( 0 );
		}		
	}
	else if ( key18_twice == 2 )
	{				
		unsigned char current_second = (ds1302_second / 16 * 10) + (ds1302_second % 16);
		unsigned char previous_second = (old_twice_second / 16 * 10) + (old_twice_second % 16);
		play_ring = 1;
		if (current_second < previous_second) 
		{ 
			current_second += 60;
		}
		
		if ( current_second - previous_second <= 2 )
		{	
			ring2 ();
		}
		else
		{
			key18_twice = 0;
			state_buzz ( 0 );
		}
	}
	
	//闹钟正常铃声
	if ( clock[0][0]*16+clock[0][1] == ds1302_hour && clock[0][2]*16+clock[0][3] == ds1302_min ) 
	{
		if ( clock[0][0]+clock[0][1]+clock[0][2]+clock[0][3] != 0 )
		{
			if ( ds1302_second  <= 0x06 )
			{
				if ( play_ring == 0 )
				{
					ring1();
				}
				else
				{
					ring2();
				}
			}
		}
	}
	else if ( clock[1][0]*16+clock[1][1] == ds1302_hour && clock[1][2]*16+clock[1][3] == ds1302_min )
	{
		if ( clock[1][0]+clock[1][1]+clock[1][2]+clock[1][3] != 0 )
		{
			if ( ds1302_second  <= 0x06 )
			{
				if ( play_ring == 0 )
				{
					ring1();
				}
				else
				{
					ring2();
				}
			}
		}		
		
	}
	else if ( clock[2][0]*16+clock[2][1] == ds1302_hour && clock[2][2]*16+clock[2][3] == ds1302_min )
	{
		if ( clock[2][0]+clock[2][1]+clock[2][2]+clock[2][3] != 0 )
		{
			if ( ds1302_second  <= 0x06 )
			{
				if ( play_ring == 0 )
				{
					ring1();
				}
				else
				{
					ring2();
				}
			}
		}
	}	

}

unsigned char set_clock_hour = 0x00;
unsigned char set_clock_min = 0x00;
unsigned char set_clock_second = 0x00;
void flash_SMG()
{
	state_SMG_all ( 0xff );
	
	if ( SMG_flag == 1 )
	{
		switch ( flash_count )
		{
			case 0:
				state_SMG ( 0 , duanma[ds1302_hour/16] );
			break;
			case 1:
				state_SMG ( 1 , duanma[ds1302_hour%16] );
			break;
			case 2:
				state_SMG ( 2 , duanma[16] );
			break;
			case 3:
				state_SMG ( 3 , duanma[ds1302_min/16] );
			break;
			case 4:
				state_SMG ( 4 , duanma[ds1302_min%16] );
			break;
			case 5:
				state_SMG ( 5 , duanma[16] );
			break;
			case 6:
				state_SMG ( 6 , duanma[ds1302_second/16] );
			break;
			case 7:
				state_SMG ( 7 , duanma[ds1302_second%16] );
			break;
		}
	}
	else if ( SMG_flag == 2 )
	{
		switch ( flash_count )
		{
			case 0:
				state_SMG ( 0 , duanma[10] );
			break;
			case 1:
				state_SMG ( 1 , duanma[clock_flag] );
			break;
			case 2:
				state_SMG ( 2 , 0x7f );
			break;
			case 3:
				if ( set_bit == 1 && count_500ms == 0 )
				{
					state_SMG ( 3 , 0xff );
				}
				else
				{
					state_SMG ( 3 , duanma[set_clock_value[0]] );
				}
			break;
			case 4:
				if ( set_bit == 2 && count_500ms == 0 )
				{
					state_SMG ( 4 , 0xff );
				}
				else
				{
					state_SMG ( 4 , duanma[set_clock_value[1]] );
				}
			break;
			case 5:
				state_SMG ( 5 , duanma[16] );
			break;
			case 6:
				if ( set_bit == 3 && count_500ms == 0 )
				{
					state_SMG ( 6 , 0xff );
				}
				else
				{
					state_SMG ( 6 , duanma[set_clock_value[2]] );
				}
			break;
			case 7:
				if ( set_bit == 4 && count_500ms == 0 )
				{
					state_SMG ( 7 , 0xff );
				}
				else
				{
					state_SMG ( 7 , duanma[set_clock_value[3]] );
				}
			break;
		}
	}
}

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void Delay20ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 234;
	j = 115;
	do
	{
		while (--j);
	} while (--i);
}

void Delay100ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay1s()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 46;
	j = 153;
	k = 245;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void key_running ()
{			
	C2 = 0;
	C1 = C3 = C4 = R1 = R2 = R3 = R4 = 1;
	if ( R1 == 0 )				//S11 
	{
		Delay1ms();
		if ( R1 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 )
				{
					set_clock_value[set_bit-1] = 3;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			

			while ( R1 == 0 );
			key_flag = 0;
		}
	}
	else if ( R2 == 0 )			//S10 
	{
		Delay1ms();
		if ( R2 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				set_clock_value[set_bit-1] = 2;
				if ( --set_bit == 0 )
				{
					set_bit = 4;
				}
			}			
			
			while ( R2 == 0 );
			key_flag = 0;
		}
	}
	else if ( R3 == 0 )			//S9 
	{
		Delay1ms();
		if ( R3 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				set_clock_value[set_bit-1] = 1;
				if ( --set_bit == 0 )
				{
					set_bit = 4;
				}
			}			
			
			while ( R3 == 0 );
			key_flag = 0;
		}
	}
	else if ( R4 == 0 )			//S8 
	{
		Delay1ms();
		if ( R4 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				set_clock_value[set_bit-1] = 0;
				if ( --set_bit == 0 )
				{
					set_bit = 4;
				}
			}			
		
			while ( R4 == 0 );
			key_flag = 0;
		}
	}
	
	C3 = 0;
	C1 = C2 = C4 = R1 = R2 = R3 = R4 = 1;
	if ( R1 == 0 )				//S15 
	{
		Delay1ms();
		if ( R1 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 && set_bit != 3 )
				{
						
					set_clock_value[set_bit-1] = 7;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R1 == 0 );
			key_flag = 0;
		}
	}
	else if ( R2 == 0 )			//S14
	{
		Delay1ms();
		if ( R2 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 && set_bit != 3 )
				{
					set_clock_value[set_bit-1] = 6;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R2 == 0 );
			key_flag = 0;
		}
	}
	else if ( R3 == 0 )			//S13
	{
		Delay1ms();
		if ( R3 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 )
				{
					set_clock_value[set_bit-1] = 5;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R3 == 0 );
			key_flag = 0;
		}
	}
	else if ( R4 == 0 )			//S12
	{
		Delay1ms();
		if ( R4 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 )
				{
					set_clock_value[set_bit-1] = 4;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R4 == 0 );
			key_flag = 0;
		}
	}

	C4 = 0;
	C1 = C2 = C3 = R1 = R2 = R3 = R4 = 1;
	if ( R1 == 0 || R2 == 0 )				
	{
		Delay20ms();
		if ( R1 == 0 && R2 == 0 ) //S19+S18 
		{
			key19_twice = key18_twice = 0;			
			if ( SMG_flag == 1 )
			{
				ringdi ();
				while ( R1 == 0 && R2 == 0 )
				{
					SMG_flag = 2;
					count_500ms_flag = 1;  //用于屏蔽数码管的闪烁
					set_clock_value[0] = clock[clock_flag-1][0];
					set_clock_value[1] = clock[clock_flag-1][1];
					set_clock_value[2] = clock[clock_flag-1][2];
					set_clock_value[3] = clock[clock_flag-1][3];
					
					if ( R1 == 0 && R2 == 0 )
					{
						Delay1s();
					}
					
					if ( ++clock_flag == 4 )
					{
						clock_flag = 1;
					}								
				}
				SMG_flag = 1;
				count_500ms_flag = 0;
				
			}
		}
		else if ( R1 == 0 ) 		//S19
		{
			if ( SMG_flag == 2 ) 
			{
				key19_twice = key18_twice = 0;
				clock[clock_flag-1][0] = set_clock_value[0];
				clock[clock_flag-1][1] = set_clock_value[1];
				clock[clock_flag-1][2] = set_clock_value[2];
				clock[clock_flag-1][3] = set_clock_value[3];
				SMG_flag = 1;	
				clock_flag = 1;
				set_bit = 4;
			}
			else if ( SMG_flag == 1 )
			{
				key18_twice = 0;
				if ( ++key19_twice == 2 );
//				{
					old_twice_second = ds1302_second;
//				}
			}

			while ( R1 == 0 );
		}
		else if ( R2 == 0 ) 		 //S18
		{
			if ( SMG_flag == 2 )
			{
				key_flag = 1;
				key19_twice = key18_twice = 0;
				old_second = ds1302_second;
				set_bit = 4;
				if ( ++clock_flag == 4 )
				{
					clock_flag = 1;
				}
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 1 )
			{
				key19_twice = 0;
				if ( ++key18_twice == 2 );
//				{
					old_twice_second = ds1302_second;
//				}
			}
			while ( R2 == 0 );
			key_flag = 0;
		}
	}
	else if ( R3 == 0 )				//S17
	{
		Delay1ms();
		if ( R3 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 && set_bit != 3 )
				{
					set_clock_value[set_bit-1] = 9;
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R3 == 0 );
			key_flag = 0;
		}
	}
	else if ( R4 == 0 )				//S16
	{
		Delay1ms();
		if ( R4 == 0 )
		{
			
			key_flag = 1;
			key19_twice = key18_twice = 0;
			old_second = ds1302_second;
			if ( SMG_flag == 1 )
			{
				SMG_flag = 2;
				set_clock_value[0] = clock[clock_flag-1][0];
				set_clock_value[1] = clock[clock_flag-1][1];
				set_clock_value[2] = clock[clock_flag-1][2];
				set_clock_value[3] = clock[clock_flag-1][3];				
			}
			else if ( SMG_flag == 2 )
			{
				if ( set_bit != 1 && set_bit != 3 )
				{
					set_clock_value[set_bit-1] = 8;
			
					if ( --set_bit == 0 )
					{
						set_bit = 4;
					}
				}
			}			
					
			while ( R4 == 0 );
			key_flag = 0;
		}
	}

	
	//长按s7闹钟清零按键
	C1 = 0;
	C2 = C3 = C4 = R1 = R2 = R3 = R4 = 1;
	if ( R1 == 0 )
	{
		Delay1ms();
		
		if ( R1 == 0 && SMG_flag == 2 )
		{	
			key_flag = 1;
			old_second = ds1302_second;
			key7_flag = 1;
			old_clean_second = ds1302_second;
			while ( R1 == 0 )
			{
				if ( key7_flag == 1 )
				{				
					clean_clock = 1;
				}
			}
			clean_clock = 0;
			key_flag = 0;
		}
	}					
}



void main ()
{
	init_sys ();
	init_ds1302 ();
	init_timer0 ();
	state_led ( 0xff );
	while ( 1 )
	{		
		
		key_running();
		value_running ();		
	}
}

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值