for(j=0;j<120;j++)
;//空操作
}
//*************LCD1602驱动程序***************************//
voidlcd_delay(unsignedchardelaytime)
{
while(delaytime)delaytime--;
}
voidwrite_lcd_command(unsignedcharwrite_command)
{
lcd_delay(40);
RS=0;
RW=0;
LCDPORT=write_command;
EN=1;
EN=0;
}
voidwrite_lcd_data(unsignedcharwrite_data)
{
lcd_delay(40);
RS=1;
RW=0;
LCDPORT=write_data;
EN=1;
EN=0;
}
voidLCD_write_char(unsignedx,unsignedchary,unsignedchardat)//x表示行,y表示该行的位置(也就是列)
{
//LCD_set_xy(x,y);
switch(x)
{
case0:
write_lcd_command(0x80+y);
break;
case1:
write_lcd_command(0xc0+y);
break;
}
//LCD_en_dat(dat);
write_lcd_data(dat|0x30);//dat或上0x30,就时把数字0123456789转换成ASIIC码
}
voidlcd_displaystr(unsignedcharx,unsignedchary,unsignedcharcode*str)
{
switch(x)
{
case0:
write_lcd_command(0x80+y);
break;
case1:
write_lcd_command(0xc0+y);
break;
}
while(*str)
{
write_lcd_data(*str);
str++;
}
}
voidinitial_lcd1602(void)//初始化LCD1602
{
unsignedchari;
EN=0;
for(i=200;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38);
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x38);
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x0f);
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x06);
for(i=4;i>0;i--)
lcd_delay(248);
write_lcd_command(0x01);
for(i=4;i>0;i--)
lcd_delay(248);
}
//********************lcd1602驱动程序到此完********************//
/////////////////////////////////////////////////////////////////////
//**************ds1302读写程序*************************//
voidWrite_Ds1302_Byte(unsignedchartemp)//写一个字节
{
unsignedchari;
for(i=0;i<8;i++)
{
SCL=LOW;
SDA=temp&LSB;
temp>>=1;
SCL=HIGH;
}
}
/****************************************************************************/
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)//写ds1302
{
DS1302_RESET;
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=LOW;
}
/****************************************************************************/
unsignedcharRead_Ds1302(unsignedcharaddress)//读ds1302
{
unsignedchari,temp=0x00,temp_temp;
DS1302_RESET;
Write_Ds1302_Byte(address);
for(i=0;i<8;i++)
{
if(SDA)
temp|=0x80;
SCL=LOW;
temp>>=1;
SCL=HIGH;
}
RST=LOW;
temp_temp=temp/16;
temp=temp%16;
temp=temp+temp_temp*10;
return(temp);
}
/****************************************************************************/
voidRead_RTC(void)//读出DS1302里的相关信息,存放在read_rtd_code[]数组中
{
unsignedchari,*p;
p=read_rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
voidSet_RTC(void)//初始化设置DS1302
{
unsignedchari,*p;
p=write_rtc_address;
for(i=0;i<7;i++)
{
Write_Ds1302(*p,set_rtc_code[i]);
p++;
}
}
/******************************************************/
voidinitial_ds1302(void)//初始化ds1302
{
DS1302_WP_ENABLE;
Set_RTC();
}
/**************ds1302读写程序到此完************************/
///////////////////////////////////////////////////
//系统初始化
voidsystem_initial(void)
{
initial_ds1302();
initial_lcd1602();
}
/****************************************************************************/
voidmain(void)
{
unsignedcharcount,staus;
system_initial();
//输出显示
lcd_displaystr(0,0x00,"20");
delay_nms(10);
lcd_displaystr(0,0x04,"-");
delay_nms(10);
lcd_displaystr(0,0x07,"-");
lcd_displaystr(0,0x0b,"Week:
");
lcd_displaystr(1,0x00,"Time:
");
lcd_displaystr(1,0x07,":
");
lcd_displaystr(1,0x0a,":
");
while
(1)
{
//按键扫描,实现对时间的调整,对应实验板的独立按钮
//开始时间设置,staus=1
if(P2_0==0)
{
delay_nms(10);
if(P2_0==0)
{
staus^=1;
count=0;
while(P2_0==0);
}
}
if(P2_1==0)
{
delay_nms(10);
if(P2_1==0)
{
count++;//光标移位
if(count==8)
count=1;
while(P2_1==0);
}
}
if(P2_2==0)//加按钮
{
delay_nms(10);
if(P2_2==0)
{
switch(count)
{
case0x01:
read_rtc_code[0]++;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));
LCD_write_char(0,0x02,(read_rtc_code[0]/10));//年十位
LCD_write_char(0,0x03,(read_rtc_code[0]%10));//年个位
break;
case0x02:
read_rtc_code[1]++;
if(read_rtc_code[1]==13)
read_rtc_code[1]=1;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));
LCD_write_char(0,0x05,(read_rtc_code[1]/10));//月十位
LCD_write_char(0,0x06,(read_rtc_code[1]%10));//月个位
break;
case0x03:
read_rtc_code[2]++;
if(read_rtc_code[2]==31)
read_rtc_code[2]=1;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));
LCD_write_char(0,0x08,(read_rtc_code[2]/10));//日十位
LCD_write_char(0,0x09,(read_rtc_code[2]%10));//日个位
break;
case0x04:
read_rtc_code[3]++;
if(read_rtc_code[3]==8)
read_rtc_code[3]=1;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));
LCD_write_char(0,0x0f,(read_rtc_code[3]%10));//星期
break;
case0x05:
read_rtc_code[4]++;
if(read_rtc_code[4]==25)
read_rtc_code[4]=0;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));
LCD_write_char(1,0x05,(read_rtc_code[4]/10));//时十位
LCD_write_char(1,0x06,(read_rtc_code[4]%10));//时个位
break;
case0x06:
read_rtc_code[5]++;
if(read_rtc_code[5]==60)
read_rtc_code[5]=0;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[5],(read_rtc_code[5]+(read_rtc_code[5]/10)*6));
LCD_write_char(1,0x08,(read_rtc_code[5]/10));//分十位
LCD_write_char(1,0x09,(read_rtc_code[5]%10));//分个位
break;
case0x07:
read_rtc_code[6]++;
if(read_rtc_code[6]==60)
read_rtc_code[6]=0;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[6],(read_rtc_code[6]+(read_rtc_code[6]/10)*6));
LCD_write_char(1,0x0b,(read_rtc_code[6]/10));//秒十位
LCD_write_char(1,0x0c,(read_rtc_code[6]%10));//秒个位
break;
default:
break;
}
while(P2_2==0);
}
}
if(P2_3==0)//减按钮
{
delay_nms(10);
if(P2_3==0)
{
switch(count)
{
case0x01:
if(read_rtc_code[0]==0)
{
lcd_displaystr(0,0x00,"19");
read_rtc_code[0]=99;
}
else
read_rtc_code[0]--;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));
LCD_write_char(0,0x02,(read_rtc_code[0]/10));//年十位
LCD_write_char(0,0x03,(read_rtc_code[0]%10));//年个位
break;
case0x02:
if(read_rtc_code[1]==1)
read_rtc_code[1]=12;
else
read_rtc_code[1]--;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));
LCD_write_char(0,0x05,(read_rtc_code[1]/10));//月十位
LCD_write_char(0,0x06,(read_rtc_code[1]%10));//月个位
break;
case0x03:
if(read_rtc_code[2]==1)
read_rtc_code[2]=30;
else
read_rtc_code[2]--;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));
LCD_write_char(0,0x08,(read_rtc_code[2]/10));//日十位
LCD_write_char(0,0x09,(read_rtc_code[2]%10));//日个位
break;
case0x04:
if(read_rtc_code[3]==1)
read_rtc_code[3]=7;
else
read_rtc_code[3]--;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));
LCD_write_char(0,0x0f,(read_rtc_code[3]%10));//星期
break;
case0x05:
if(read_rtc_code[4]==0)
read_rtc_code[4]=24;
else
read_rtc_code[4]--;
DS1302_WP_ENABLE;
Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));
LCD_write_char(1,0x05,(read_rtc_code[4]/10));//时十位
LCD_write_char(1,0x06,(read_rtc_code[4]%10));//时个位
break;
case0x06:
if(read_rtc_code[5]==00)
read_rtc_code[5]=59;
else
read_rtc_code[5]--;
DS1302_WP_ENABLE;
Write_Ds