合并一下两个程序通过按键实现功能的切换

/*
 * 万年历
*/

#include "main.h"	 		//包含头文件main.h
#include "LCD.h"			//包含头文件LCD.h
#include "DS1302.h"			//包含头文件DS1302.h
#include "word.h"			//包含头文件word.h
#include "lunar_calendar.h" //包含头文件lunar_calendar.h
#include "buzz.h"			//包含头文件buzz.h



#include "eeprom52.h"
TIME time, tmp_time;        //时间变量
ALARM alarm;				//时间变量
char a_a;
bit Alarm_flag=0;			//时间变量
bit Clock_flag=0;			//时间变量
bit flag=0;					//时间变量

sbit DQ=P3^7;   //DS18B20 pin 温度传感器引脚

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{


	SectorErase(0x2c00);			  //清空
	SectorErase(0x2e00);
	byte_write(0x2c01,Alarm_flag);
   	byte_write(0x2c02,Clock_flag);
	byte_write(0x2c03,alarm.hour);
	byte_write(0x2c04,alarm.min);
  	   
	byte_write(0x2060,a_a);	

}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
	Alarm_flag=	byte_read(0x2c01);
   	Clock_flag=byte_read(0x2c02);
	alarm.hour=byte_read(0x2c03);
	alarm.min=byte_read(0x2c04);

	a_a = byte_read(0x2060);

}

/**************开机自检eeprom初始化*****************/
void init_eeprom() 
{
	a_a = byte_read(0x2060);
	if(a_a != 1)		//新的单片机初始单片机内问eeprom
	{
	
		a_a = 1;
		write_eeprom();	   //保存数据
	}	
}


//-----------------18B20-----------------------
unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen;  //温度用变量
unsigned int fg=0,xiaoshu_a;							//温度用变量
//-----------------18B20----------------------


void delay(uint16 n)//延时us级
{
	while (n--);
}
//************************************************************************/
// 函数: LCD_Delay()
// 描述: 延时t ms函数
// 参数: t 
// 返回: 无
// 备注: 11.0592MHZ       t=1延时时间约1ms
// 版本:  2015/01/01      First version
//************************************************************************/
void Delay_nms(unsigned int t)
{
	unsigned int i,j;
	for(i=0;i<t;i++)    	 //循环t次
	for(j=0;j<113;j++) 		//循环113次 每次约3us
	;
}
/////////////////////////////////////////////////
//-----------播放音乐----------------------------

/////////////////////////////////////////////////
/*------DS18B20------*/
void delay_18B20(unsigned int i)
{
	while(i--);
}
/*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
  然后主机释放单总线并进入接收模式 此时单总线电平被拉高
  DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲  */						
void Init_DS18B20(void) 
{
	 unsigned char x=0;
	 DQ = 1;          //DQ复位
	 delay_18B20(8);  //稍做延时
	 DQ = 0;          //单片机将DQ拉低
	 delay_18B20(80); //精确延时 大于 480us
	 DQ = 1;          //拉高总线
	 delay_18B20(14); //延时
	 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
	 delay_18B20(20); //延时
}

/*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
  所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
  两种写时隙均以主机拉低总线开始
  产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
  产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
void WriteOneChar(unsigned char dat)
{
 	unsigned char i=0;
 	for (i=8; i>0; i--)//循环8次
 	{
  		DQ = 0;			//DQ输出0
 		DQ = dat&0x01; 
    	delay_18B20(5); //延时
 		DQ = 1;         //DQ输出1
    	dat>>=1;        //右移位
 }
}
  
/*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
  每次读时隙由主机发起,拉低总线至少1us。
  若传1,则保持总线高电平;若发送0,则拉低总线
  传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */
unsigned char ReadOneChar(void)
{
	unsigned char i=0;
	unsigned char dat = 0;
	for (i=8;i>0;i--)
	 {
		  DQ = 0; 		// 给脉冲信号
		  dat>>=1;      //移位
		  DQ = 1; 		// 给脉冲信号
		  if(DQ)       //如果DQ=1,执行下面的语句   
		  dat|=0x80;
		  delay_18B20(4);//延时
	 }
 	return(dat);		//返回数据
}
		 

void read_18B20(void)
{

	Init_DS18B20();
	WriteOneChar(0xCC);    	// 跳过读序号列号的操作
	WriteOneChar(0x44); 	// 启动温度转换

	delay_18B20(100);       // this message is wery important

	Init_DS18B20();			//初始化DS18B20
	WriteOneChar(0xCC); 	//跳过读序号列号的操作
	WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度

	delay_18B20(100);		//延时

	L_18B20=ReadOneChar();	//读取低八位数据
	H_18B20=ReadOneChar();	//读取高八位数据

	zhengshu=L_18B20/16+H_18B20*16; //整数部分
	xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
}
//------------------DS18B20---------------------
/////////////////////////////////////////////////
/* 
 * 按键扫描
*/
int8 scan_key(void)
{
	int8 val=-1;          	//初始化键值为-1

	if (KeyIn1 == 0)		 //判断=0?有无按键按键
	{
		val = 1;			 //键值=1
		while (KeyIn1 == 0); //等待按键释放
	}
	else if (KeyIn2 == 0)	 //判断=0?有无按键按键
	{
		val = 2;			//键值=2
		while (KeyIn2 == 0);//等待按键释放
	}
	else if (KeyIn3 == 0)	//判断=0?有无按键按键
	{
		val = 3;			//键值=3
		while (KeyIn3 == 0);//等待按键释放
	}

	//if (val > 0)
		//buzzer_sound();

	return val;				//返回键值
}

/*
 * 主界面框架
*/
void main_frame(void)
{
	play32(80, 2, 10); //显示数
	play32(32, 2, 10); //显示数
	play8(16, 0, S_xie);//显示斜线
	play8(40, 0, S_xie);//显示斜线
//	play8(96, 0, RH);
//	play8(120, 0, S_percent);
	play8(120, 6, S_du);//显示度
}

/*
 * 主界面
*/
void main_show(bit refresh)
{
    uint8  lunar[2];
	if (refresh)
		read_time((uint8 *)&time);// 读时间函数// 时间											   
	if (refresh || (time.sec != tmp_time.sec)) // 秒更新
	{
		tmp_time.sec = time.sec;			  	//读取秒数据
 	    play8_num(104, 6,zhengshu);   			//温度显示
		play32_num(96, 2, time.sec);			//显示秒


	}
	if (refresh)
		main_frame();//刷新界面
	if (refresh || (time.min != tmp_time.min)) // 分更新
	{
		if (!refresh)
			flag = 0;
		tmp_time.min = time.min;//读取分
		play32_num(48, 2, time.min); //显示分
	}
	if (refresh || (time.hour != tmp_time.hour)) // 时更新
	{
		if ((!refresh)&&(Clock_flag))
			alarm_sound();
		tmp_time.hour = time.hour; 				//读取时
		play32_num(0, 2, time.hour);			//显示时
	}
	if (refresh || (time.day != tmp_time.day))  //日更新
	{
		tmp_time.day = time.day;				//读取日
		play8_num(48, 0, time.day);				//显示日
		// 农历	
		turn_lunar_calendar(&time, lunar);
		play_lunar_calendar(0, 6, lunar[0], lunar[1]);
	}
	if (refresh || (time.week != tmp_time.week)) // 周更新
	{
		tmp_time.week = time.week;				//读取周
		play_week(68, 0, time.week);			//显示周
	}
	if (refresh || (time.mon != tmp_time.mon))  // 月更新
	{
		tmp_time.mon = time.mon;				//读取月
		play8_num(24, 0, time.mon);				//显示月
		// 农历	
		turn_lunar_calendar(&time, lunar);				//转换农历月
		play_lunar_calendar(0, 6, lunar[0], lunar[1]);	//显示农历月
	}

	if (refresh || (time.year != tmp_time.year)) // 年更新
	{
		tmp_time.year = time.year;					//读取年数据
		play8_num(0, 0, time.year);					//显示年
		// 农历	
		turn_lunar_calendar(&time, lunar);				//转换农历年
		play_lunar_calendar(0, 6, lunar[0], lunar[1]);	//显示农历年
	}
	
}
/*
 * 主机界面设置 
*/
void main_set(void)
{
	int8 key_val, state=1;			 	//变量
	play32_num(96, 2|0x80, time.sec);	//显示秒
	
	  
	


	while (1)
	{	key_val = scan_key();//键盘扫描
		if (key_val == 1) // 设置
		{
			if (state >= 7)
				state = 0;
			else
				state++;				//位置状态加1
			set_time((uint8 *)&time);	//设置时间
			main_show(1);				//显示主界面

			switch (state)
			{	case 0:	set_time((uint8 *)&time); break;//设置时间
				case 1:	play32_num(96, 2|0x80, time.sec); break;//显示秒
				case 2:	play32_num(48, 2|0x80, time.min); break;//显示分
				case 3:	play32_num(0, 2|0x80, time.hour); break;//显示时
				case 4:	play_week(68, 0|0x80, time.week); break;//显示周
				case 5:	play8_num(48, 0|0x80, time.day); break; //显示日
				case 6:	play8_num(24, 0|0x80, time.mon); break; //显示月
				case 7:	play8_num(0, 0|0x80, time.year); break; //显示年
			




	while(1)
    {
  
	}
}		;break;


				default: break;		//退出循环						  
			}
		}
		else if (key_val > 1)//按键值大于1
		{
			if (state == 1)//位置1设置秒
			{
				if (key_val == 3)//加按下?
					time.sec++;//秒加1
				else
					time.sec--; //秒减1
				if (time.sec >= 60)
					time.sec = 0;
				else if (time.sec < 0)
					time.sec = 59;       
				play32_num(96, 2|0x80, time.sec);//显示秒
			}
			else if (state == 2)				//位置2设置分
			{
				if (key_val == 3)				//加按下?
					time.min++;					//加1
				else
					time.min--;					//减1
				if (time.min >= 60)
					time.min = 0;
				else if (time.min < 0)
					time.min = 59;
				play32_num(48, 2|0x80, time.min);//显示分
			}
			else if (state == 3)				//位置3设置时
			{		if (key_val == 3)				//加按下?
					time.hour++;				//加1
				else
					time.hour--;				//减1
				if (time.hour >= 24)
					time.hour = 0;
				else if (time.hour < 0)
					time.hour = 23;
				play32_num(0, 2|0x80, time.hour);//显示时
			}
			else if (state == 4)				//位置4设置周
			{		if (key_val == 3)			//加按下?
					time.week++;				//加1
				else
					time.week--;				//减1
				if (time.week >= 8)
					time.week = 1;
				else if (time.week < 1)
					time.week = 7;
				play_week(68, 0|0x80, time.week);//显示周
			}
			else if (state == 5)//位置5设置日
			{
				if (key_val == 3)				//加按下?
					time.day++;					//加1
				else
					time.day--;					//减1
				if (time.day >= 32)
					time.day = 1;
				else if (time.day < 1)
					time.day = 31;
				play8_num(48, 0|0x80, time.day);//显示日
			}
			else if (state == 6)				//位置6设置月
			{
				if (key_val == 3)				//加按下?
					time.mon++;					//加1
				else
					time.mon--;					//减1
				if (time.mon >= 13)
					time.mon = 1;
				else if (time.mon < 1)
					time.mon = 12;
				play8_num(24, 0|0x80, time.mon);//显示月
			}
			else if (state == 7)				//位置7设置年
			{
				if (key_val == 3)				//加按下?
					time.year++;				//加1
				else
					time.year--;				//减1
				if (time.year >= 100)
					time.year = 0;				//0年
				else if (time.year < 0)
					time.year = 99;				//99年
				play8_num(0, 0|0x80, time.year);//显示年
			}
			
			else
			{
				break;		//退出循环
			}
		}
		if (state == 0)
			break;		//退出循环
	}


/*
 * 闹钟界面显示
*/
void alarm_show(void)
{
	int8 key_val, state=1;
	uint32 t=0;

	play16(0, 0, nao);			//显示 闹
	play16(16, 0, zhong);		//钟
	play16(32, 0, maohao);		//冒号:
	if (Alarm_flag)
		play16(48, 0, kai);		//开
	else
		play16(48, 0, guan);//关
	play32_num(32, 2, alarm.hour);	//时
	play32(64, 2, 10);				//冒号
	play32_num(80, 2, alarm.min);	//分
	play16(0, 6, zheng);			//显示 整
	play16(16, 6, dian);			//显示 点
	play16(32, 6, bao);				//显示 报
	play16(48, 6, shi);				//显示 时
	play16(64, 6, maohao);			//显示 冒号
	if (Clock_flag)
		play16(80, 6, kai);			//显示 开
	else
		play16(80, 6, guan);		//显示 关	
	for (t=0; t<30000; t++)
	{	key_val = scan_key();		//键盘扫描 获取键值
		if (key_val > 1)			//判断数据
			break;
		else if (key_val == 1)		//判断数据
		{
			if (Alarm_flag)
				play16(48, 0|0x80, kai);//显示 开
			else
				play16(48, 0|0x80, guan);//关			
			while (1)
			{				key_val = scan_key();//键盘扫描 获取键值
				if (key_val == 1) 				// 完成设置
				{
					if (state >= 4)				//判断数据
						state = 0;
					else
						state++;
					if (Alarm_flag)
						play16(48, 0, kai);			//显示 开
					else
						play16(48, 0, guan);		//显示 关
					play32_num(32, 2, alarm.hour);  //闹钟 时 显示 
					play32_num(80, 2, alarm.min);	//闹钟 分 显示 
					if (Clock_flag)
						play16(80, 6, kai);			//显示 开
					else
						play16(80, 6, guan);		//显示 关

					switch (state) //判断数据
					{
						case 1: 	
							if (Alarm_flag)//判断数据
								play16(48, 0|0x80, kai);	//显示 开
							else
								play16(48, 0|0x80, guan); 	//显示 关
							break;
						case 2:
							play32_num(80, 2|0x80, alarm.min);//闹钟 分 显示 
							break;
						case 3: 
							play32_num(32, 2|0x80, alarm.hour);//闹钟 时 显示 
							break;
						case 4: 
							if (Clock_flag)//判断数据
								play16(80, 6|0x80, kai);//显示 开
							else
								play16(80, 6|0x80, guan);//显示 关
							break;
						default: break;
					}
				}
				else if (key_val > 1)//判断数据
				{
					if (state == 1)//判断数据
					{
						Alarm_flag = ~Alarm_flag;
						if (Alarm_flag)
							play16(48, 0|0x80, kai);//显示 开
						else
							play16(48, 0|0x80, guan);//显示 关
							write_eeprom();
					}
					else if (state == 2)//判断数据
					{
						if (key_val == 3)//判断数据
							alarm.min++;//加1
						else
							alarm.min--;//减1
						if (alarm.min >= 60)//判断数据
							alarm.min = 0;
						else if (alarm.min < 0)//判断数据
							alarm.min = 59;
						play32_num(80, 2|0x80, alarm.min);//闹钟 分 显示 
							write_eeprom();
					}
					else if (state == 3)//判断数据
					{
						if (key_val == 3)//判断数据
							alarm.hour++;//加1
						else
							alarm.hour--;//减1
						if (alarm.hour >= 24)//判断数据
							alarm.hour = 0;
						else if (alarm.hour < 0)//判断数据
							alarm.hour = 23;
						play32_num(32, 2|0x80, alarm.hour);//闹钟 时 显示 
							write_eeprom();
					}
					else if (state == 4)			//判断数据
					{
						Clock_flag = ~Clock_flag;
						if (Clock_flag)				//判断数据
							play16(80, 6|0x80, kai);//显示 开
						else
							play16(80, 6|0x80, guan);//显示 关
							write_eeprom();
					}
					else
					{
						break;	//退出
					}
				}
				if (state == 0)	//状态为0退出
				break;			//状态为0退出
			}
			if (state == 0)		//状态为0退出
				break;			//状态为0退出
		}

	}
}
void daling()									//打铃函数
{
uint8 i;
 for(i=0;i<10;i++)
{ 
Delay_nms(200);
 BEEP=~BEEP;
 }
}


main()
{
	uint8 key_val;

    read_18B20();    //初始DS18B20
    Delay_nms(1000);//延时1S,等待18B20工作正常


	LCD_init();           //初始化液晶
	clear12864();         //清屏幕
	main_frame();         //显示主界面框架
	main_show(1);         //刷新1次

    read_18B20();    				//读温度
	play8_num(104, 6,zhengshu);   //显示温度




	init_eeprom();
	read_eeprom();
	while(1)
	{ 
		key_val = scan_key();
		if (key_val == 1)         //K1?
		{
			main_set();           //设置主界面
		}
		else if (key_val == 2)    //K2?
		{
			clear12864();         //清屏幕
			alarm_show();		  //闹钟画面
			clear12864();	      //清屏幕
			main_show(1);		  //主界面
		}
		else if (key_val == 3)    //K3?
		{ 
		  
		}
		else
		{
			read_time((uint8 *)&time);			//读取时间
		
		     read_18B20();
			 	main_show(0);						//显示主界面
		
		}
	
		// 闹钟
		if (Alarm_flag)//如果闹钟标志有 执行下面的
		{
			if ((time.sec <30) && (alarm.hour == time.hour) && (alarm.min == time.min))//判断条件是否满足
			{
			 if(time.sec%2==0)
			 daling();	
			}
		}
	}
}




第二个程序
#include <reg52.h>

#define LCDLCDDisp_Off   0x3e
#define LCDLCDDisp_On    0x3f
#define Page_Add     0xb8//ye

#define LCDCol_Add     0x40//lie
#define Start_Line     0xC0//hang
/*****液晶显示器的端口定义*****/
#define data_ora P2 /*液晶数据总线*/
sbit LCDMcs=P1^3 ;    /*片选1*/
sbit LCDScs=P1^4 ;    /*片选2*/
sbit LCDDi=P1^0 ;     /*数据/指令 选择*/
sbit LCDRW=P1^1 ;     /*读/写 选择*/
sbit LCDEnable=P1^2 ;     /*读/写 使能*/



char code Hz[]=
{

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFE,0x16,0x96,0x96,0x86,0x80,0x96,
0x96,0x96,0x16,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBB,0xBB,
0xFB,0xFB,0xCB,0xFB,0xF3,0x00,0xF3,0xFB,0xEB,0xD8,0xD8,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xB1,0x38,0x7F,0x78,0x3B,0xBB,0xFB,0xFB,0xFB,
0xFB,0x3B,0x68,0xFF,0xB0,0x3F,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,0xBF,0xF3,
0xFF,0xFF,0x7F,0x71,0xFF,0xFF,0xFF,0xF1,0x73,0xFF,0x7F,0xF9,0x74,0xA0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x3F,0x3F,0x1F,0x07,0x07,0x07,0x03,0x03,0x01,
0x01,0x01,0x81,0x81,0x81,0x01,0x01,0x01,0x03,0x03,0x03,0x07,0x07,0x07,0x0F,0x1F,
0x7F,0xFF,0xFB,0x83,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x3F,0xFF,0xE0,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x60,0x60,0x60,
0x20,0x20,0x1F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xFF,0xFF,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,
0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF8,0xF8,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF8,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x81,0x81,0x81,0x81,
0x01,0x81,0x01,0x01,0x81,0x81,0x81,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0xC0,
0xC0,0xC0,0xC0,0xF0,0xFF,0xFF,0xFF,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x87,0xC7,0xC3,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0xFF,0xFF,0xFF,0x3F,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xE0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0xF0,0xF8,0xF8,0xF8,0xF8,0xFC,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0xF8,0xC0,
0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

/****************************************************************************
函数功能:LCD延时程序
入口参数:t
出口参数:
****************************************************************************/
void LCDdelay(unsigned int t)
{
	unsigned int i,j;
	for(i=0;i<t;i++);
	for(j=0;j<10;j++);
}
/****************************************************************************
状态检查,LCD是否忙


*****************************************************************************/
void CheckState()		
{
   unsigned char dat,DATA;//状态信息(判断是否忙)
   LCDDi=0; // 数据\指令选择,D/I(RS)="L" ,表示 DB7∽DB0 为显示指令数据 
   LCDRW=1; //R/W="H" ,E="H"数据被读到DB7∽DB0 
   do
   {
      DATA=0x00;
      LCDEnable=1;	//EN下降源
	  LCDdelay(2);//延时
	  dat=DATA;
      LCDEnable=0;
      dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
    }
    while(!(dat==0x00));
}
/*****************************************************************************
函数功能:写命令到LCD程序,RS(DI)=L,RW=L,EN=H,即来一个脉冲写一次
入口参数:cmdcode
出口参数:
*****************************************************************************/
void write_com(unsigned char cmdcode)
{
    CheckState();//检测LCD是否忙
	LCDDi=0;
	LCDRW=0;
	P2=cmdcode;		
	LCDdelay(2);
	LCDEnable=1;
	LCDdelay(2);
	LCDEnable=0;
}
/*****************************************************************************
函数功能:LCD初始化程序
入口参数:
出口参数:
*****************************************************************************/
void init_lcd()
{
	LCDdelay(100);	
	LCDMcs=1;//刚开始关闭两屏
	LCDScs=1;
	LCDdelay(100);
	write_com(LCDLCDDisp_Off);	 //写初始化命令
	write_com(Page_Add+0);
	write_com(Start_Line+0);
	write_com(LCDCol_Add+0);
	write_com(LCDLCDDisp_On);
}
/*****************************************************************************
函数功能:写数据到LCD程序,RS(DI)=H,RW=L,EN=H,即来一个脉冲写一次
入口参数:LCDDispdata
出口参数:
*****************************************************************************/
void write_data(unsigned char LCDDispdata)
{
    CheckState();//检测LCD是否忙
	LCDDi=1;
	LCDRW=0;
	P2=LCDDispdata;
	LCDdelay(2);
	LCDEnable=1;
	LCDdelay(2);
	LCDEnable=0;
}
/*****************************************************************************
函数功能:清除LCD内存程序
入口参数:pag,col,hzk
出口参数:
*****************************************************************************/
void Clr_Scr()
{
	unsigned char j,k;
	LCDMcs=0; //左、右屏均开显示
	LCDScs=0;
 	write_com(Page_Add+0);
 	write_com(LCDCol_Add+0);
 	for(k=0;k<8;k++)//控制页数0-7,共8页
 	{
		write_com(Page_Add+k); //每页每页进行写
  		for(j=0;j<64;j++)  //每页最多可写32个中文文字或64个ASCII字符
		{
      		write_com(LCDCol_Add+j);
			write_data(0x00);//控制列数0-63,共64列,写点内容,列地址自动加1
		}
	}
}
/*****************************************************************************
函数功能:左屏位置显示
入口参数:page,column,hzk
出口参数:
*****************************************************************************/
void Bmp_Left_Disp(unsigned char page,unsigned char column, unsigned char code *Bmp)
{
	unsigned char j=0,i=0;
	for(j=0;j<8;j++)
	{
		write_com(Page_Add+page+j);
		write_com(LCDCol_Add+column);
		for(i=0;i<64;i++) 
			write_data(Bmp[128*j+i]);
	}
}
/*****************************************************************************
函数功能:右屏位置显示
入口参数:page,column,hzk
出口参数:
*****************************************************************************/
void Bmp_Right_Disp(unsigned char page,unsigned char column, unsigned char code *Bmp)
{
	unsigned char j=0,i=0;
	for(j=0;j<8;j++)
	{
		write_com(Page_Add+page+j);
		write_com(LCDCol_Add+column);
		for(i=64;i<128;i++) 
			write_data(Bmp[128*j+i]);
	}
}

void main()
{
	init_lcd();
	Clr_Scr();
	
	LCDMcs=0; //左屏开显示
	LCDScs=1;
    Bmp_Left_Disp(0,0,Hz);
    LCDMcs=1; //右屏开显示
	LCDScs=0;
	Bmp_Right_Disp(0,0,Hz);

	while(1)
    {
  
	}
}

就是通过按键实现万年历和图片显示的转换

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^