📄 ds1302+lcd1602-c51.c.bak
字号:
alarm_time(); //K4键设定报警时间
if(alarm_flag) //alarm_flag=1,开定时
{
write_position(2,16);
lcd_wdat(0x00); //显示自定义字符小喇叭
}
}
}
//---------------------------------------------------------
if(!K4)
{
beep();
alarm_flag=~alarm_flag;
if(alarm_flag) //alarm_flag=1,开定时
{
write_position(2,16);
lcd_wdat(0x00); //显示自定义字符小喇叭
}
else
{
write_position(2,16);
lcd_wdat(0x20); //显示自定义字符小喇叭
}
}
//---------------------------------------------------------
if(!K3&flag) //开始设定时间
{
write_ds1302(0x8e,0x00); //写保护控制字,允许写
write_ds1302(0x80,0x80); //停止时钟运行
write_ds1302(0x8e,0x80); //写保护控制字,禁止写
beep();
year=1;
count=((init[6]&0xf0)>>4)*10+(init[6]&0x0f); //读当前年数据
}
while(year) //设定年
{
key_set(99,1,1);
if(!K3)
{
Set_W1302(0x8c);
Set_place(1,1);
year=0;
month=1;
count=((init[4]&0xf0)>>4)*10+(init[4]&0x0f); //读当前月数据
}
}
while(month) //设定月
{
key_set(12,1,4);
if(!K3)
{
Set_W1302(0x88);
Set_place(1,4);
month=0;
day=1;
count=((init[3]&0xf0)>>4)*10+(init[3]&0x0f); //读当前日数据
}
}
while(day) //设定日
{
key_set(31,1,7);
if(!K3)
{
Set_W1302(0x86);
Set_place(1,7);
day=0;
week=1;
count=init[5]&0x0f; //读当前星期数据
}
}
while(week) //设定星期
{
if(!K2)
{
beep();
if(count!=7)
count++;
else count=1;
}
if(!K1)
{
beep();
if(count!=1)
count--;
else count=7;
}
init1[1]=count%10;
if(flag)
{
write_position(1,15);
lcd_wdat(init1[1]+0x30);
}
else
{
write_position(1,15);
lcd_wdat(0x20);
}
if(!K3)
{
Set_W1302(0x8a);
write_position(1,15);
lcd_wdat(init1[1]+0x30);
week=0;
hour=1;
count=((init[2]&0xf0)>>4)*10+(init[2]&0x0f); //读当前时数据
}
}
while(hour) //设定时
{
key_set(23,2,7);
if(!K3)
{
Set_W1302(0x84);
Set_place(2,7);
hour=0;
min=1;
count=((init[1]&0xf0)>>4)*10+(init[1]&0x0f); //读当前分数据
}
}
while(min) //设定分
{
key_set(59,2,10);
if(!K3)
{
Set_W1302(0x82);
Set_place(2,10);
min=0;
sec=1;
count=((init[0]&0xf0)>>4)*10+(init[0]&0x0f); //读当前秒数据
}
}
while(sec) //设定秒
{
key_set(59,2,13);
if(!K3)
{
Set_W1302(0x80);
Set_place(2,13);
sec=0;
count=0;
}
}
Play_nowtime();
Time_compare();
}
}
/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定时
TL0=0x00;
timecount++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
}
/**********************************************************/
// 设定值写入DS1302
/**********************************************************/
void Set_W1302(uchar addr)
{
uchar temp;
write_ds1302(0x8e,0x00);
temp=(init1[0]<<4)+init1[1];
write_ds1302(addr,temp);
write_ds1302(0x8e,0x80);
beep();
}
/**********************************************************/
// 被设置数据闪动
/**********************************************************/
void Set_Flash(uchar row,uchar col )
{
init1[0]=count/10;
init1[1]=count%10;
if(flag)
{ //显示
write_position(row,col);
lcd_wdat(init1[0]+0x30);
write_position(row,col+1);
lcd_wdat(init1[1]+0x30);
}
else
{ //清屏
write_position(row,col);
lcd_wdat(0x20);
write_position(row,col+1);
lcd_wdat(0x20);
}
}
/**********************************************************/
// 指定位置显示
/**********************************************************/
void Set_place(uchar row,uchar col)
{
write_position(row,col);
lcd_wdat(init1[0]+0x30);
write_position(row,col+1);
lcd_wdat(init1[1]+0x30);
}
/**********************************************************/
// 显示当前时间
/**********************************************************/
void Play_nowtime()
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
write_position(2,7);
lcd_wdat(((init[2]&0xf0)>>4)+0x30);
write_position(2,8);
lcd_wdat('0'+(init[2]&0x0f)); //读小时
// write_position(2,9);
// lcd_wdat(':');
write_position(2,10);
lcd_wdat('0'+((init[1]&0xf0)>>4));
write_position(2,11);
lcd_wdat('0'+(init[1]&0x0f)); //读分钟
// write_position(2,12);
// lcd_wdat(':');
write_position(2,13);
lcd_wdat('0'+((init[0]&0xf0)>>4));
write_position(2,14);
lcd_wdat('0'+(init[0]&0x0f)); //读秒
write_position(1,1);
lcd_wdat('0'+((init[6]&0xf0)>>4));
write_position(1,2);
lcd_wdat('0'+(init[6]&0x0f)); //读年
// write_position(1,3);
// lcd_wdat('/');
write_position(1,4);
lcd_wdat('0'+((init[4]&0xf0)>>4));
write_position(1,5);
lcd_wdat('0'+(init[4]&0x0f)); //读月
// write_position(1,6);
// lcd_wdat('/');
write_position(1,7);
lcd_wdat('0'+((init[3]&0xf0)>>4));
write_position(1,8);
lcd_wdat('0'+(init[3]&0x0f)); //读日
write_position(1,15);
lcd_wdat('0'+(init[5]&0x0f)); //读周
flash();
}
/*********************************************************/
// 键设定函数
/*********************************************************/
void key_set(uchar num,uchar row,uchar col )
{
if(!K2)
{
beep();
if(count!=num)
count++;
else count=0;
}
if(!K1)
{
beep();
if(count!=0)
count--;
else count=num;
}
Set_Flash(row,col);
}
/*********************************************************/
// 报警时间设定
/*********************************************************/
void alarm_time()
{
// if(!K4&flag) //开始设定报警时间
{
write_str(0xc0,str3); //液晶显示提示信息
Play_alarmtime();
beep();
hour=1;
count=((bj_time[2]&0xf0)>>4)*10+(bj_time[2]&0x0f); //读当前时报警数据
while(hour) //设定时
{
key_set(23,2,7);
if(!K4)
{
Set_place(2,7);
bj_time[2]=((init1[0]<<4)|init1[1]);
beep();
hour=0;
min=1;
count=((bj_time[1]&0xf0)>>4)*10+(bj_time[1]&0x0f); //读当前分报警数据
}
}
while(min) //设定分
{
key_set(59,2,10);
if(!K4)
{
Set_place(2,10);
bj_time[1]=((init1[0]<<4)|init1[1]);
beep();
min=0;
sec=0;
count=((bj_time[0]&0xf0)>>4)*10+(bj_time[0]&0x0f); //读当前秒报警数据
write_str(0xc0,str2); //液晶显示提示信息
}
}
/*
while(sec) //设定秒
{
key_set(59,2,13);
if(!K4)
{
Set_place(2,13);
bj_time[0]=((init1[0]<<4)|init1[1]);
beep();
min=0;
sec=0;
count=0;
write_str(0xc0,str2); //液晶显示提示信息
}
}*/
}
}
/*********************************************************/
// 报警时间显示
/*********************************************************/
void Play_alarmtime()
{
write_position(2,7);
lcd_wdat(((bj_time[2]&0xf0)>>4)+0x30);
write_position(2,8);
lcd_wdat('0'+(bj_time[2]&0x0f)); //读小时
write_position(2,9);
lcd_wdat(':');
write_position(2,10);
lcd_wdat('0'+((bj_time[1]&0xf0)>>4));
write_position(2,11);
lcd_wdat('0'+(bj_time[1]&0x0f)); //读分钟
write_position(2,12);
lcd_wdat(':');
write_position(2,13);
lcd_wdat('0'+((bj_time[0]&0xf0)>>4));
write_position(2,14);
lcd_wdat('0'+(bj_time[0]&0x0f)); //读秒
}
/*********************************************************/
// 时间比较
/*********************************************************/
void Time_compare()
{
if(alarm_flag)
{
if(init[2]==bj_time[2])
{
if(init[1]==bj_time[1])
beep();
}
}
}
/*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -