📄 rtc._c
字号:
功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
参 数: 无
返回值 : 无
/********************************************/
void shizhong(void)
{
uchar i,RD_TFLAG=1,set_num=0,n=0;//i为键盘译码值
//RD_TFLAG为是否设置时间的标志,为1是显示状态,不设置,为0时进入设置状态
//set_num是设置哪一位的标志,如为0的时候设置的是秒
uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
//setdat是当前设置的数值,即被送入DS1302指定寄存器的数
//shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
uchar dis_x,dis_y; //存储1602液晶当前光标的位置
uchar settime[7]={0x15,0x58,0x13,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
Board_init(); //初始化开发板
LCD12864_initial();
LCD12864_clear();
DS1302_portinit(); //初始化DS1302的三根数据线
DS1302_init(); //启动振荡器,DS1302开始工作
while(!n) //以下程序完成显示和设置时间
{
if(RD_TFLAG) //如果是设置模式则不更新时间显示
{
DS1302_getT(gettime); //获得当前时间
Disp_time(gettime); //显示当前时间
}
if(Mkey_press()) //是否有按键按下
{
i=Mkey_scan(); //扫描并反回翻译后的键码
switch(i)
{
case 0x0: //将当前设置位设置成0
if(RD_TFLAG==0) //检测是否是设置模式(为0就是设置模式)
{
setdat=DS1302_readD(setadd|RD); //读出当前时间
setdat=setdat>>shift|setdat<<shift; //根据shift值来设置DS1302寄存器的十位还是个位(shift为0设置的是个位,为4设置的是十位)
setdat&=0xF0; //保留高位不变(设置十位则个位不变,设置个位则十位不变,因为上条语句已经根据shift的值把需要设置的位移动到低位了)
setdat|=0; //按下的是0键,所以把当前设置位设置成0
setdat=setdat>>shift|setdat<<shift; //把十位和个位还原成正确值
DS1302_writeD(C_WP|WR,UPROTECT); //解除写保护
DS1302_writeD(setadd|WR,setdat); //写入设置值
DS1302_writeD(C_WP|WR,PROTECT); //写保护
LCD12864_gotoXY(dis_x,dis_y); //将当前设置位在1602液晶上对应的位置显示更新
LCD12864_sendstr("0"); //向1602写入0字符并显示
LCD12864_gotoXY(dis_x,dis_y); //将光标保持在当前设置位上
}
break;
case 0x1: //过程和0键相同,只是将当前设置位设置成1并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=1;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("1");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x2: //过程和0键相同,只是将当前设置位设置成2并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=2;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("2");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x3: //过程和0键相同,只是将当前设置位设置成3并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=3;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("3");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x4: //过程和0键相同,只是将当前设置位设置成4并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=4;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("4");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x5: //过程和0键相同,只是将当前设置位设置成5并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=5;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("5");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x6: //过程和0键相同,只是将当前设置位设置成6并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=6;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("6");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x7: //过程和0键相同,只是将当前设置位设置成7并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=7;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("7");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x8: //过程和0键相同,只是将当前设置位设置成8并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=8;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("8");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0x9: //过程和0键相同,只是将当前设置位设置成9并更新显示
if(RD_TFLAG==0)
{
setdat=DS1302_readD(setadd|RD);
setdat=setdat>>shift|setdat<<shift;
setdat&=0xF0;
setdat|=9;
setdat=setdat>>shift|setdat<<shift;
DS1302_writeD(C_WP|WR,UPROTECT);
DS1302_writeD(setadd|WR,setdat);
DS1302_writeD(C_WP|WR,PROTECT);
LCD12864_gotoXY(dis_x,dis_y);
LCD12864_sendstr("9");
LCD12864_gotoXY(dis_x,dis_y);
}
break;
case 0xC: //模式选择按键,更换设置模式和显示模式(每按一下,交替设置和显示模式)
RD_TFLAG^=0x01; //改变模式标志,RD_TFLAG为0是设置模式,RD_TFLAG为1是显示模式
if(RD_TFLAG==0) //如果进入设置模式,做以下工作
{
setdat=DS1302_readD(C_SEC|RD); //读出秒寄存器的内容
DS1302_writeD(C_WP|WR,UPROTECT); //解除写保护
DS1302_writeD(C_SEC|WR,CLK_HALT|setdat); //进入设置模式就停止振荡器,但不改变秒寄存器的内容
DS1302_writeD(C_WP|WR,PROTECT); //写保护
// while(LCD12864_readBF()); //更新1602
LCD12864_sendbyte(iCmd, 0XFE); //启动光标闪烁功能
LCD12864_gotoXY(3,7); //光标定位在秒个位(进入设置模式默认设置秒个位)
// LCD12864_sendstr(" ");
setadd=C_SEC; //将设置地址指向秒寄存器
shift=0; //设置秒个位
dis_x=3; //1602第2行
dis_y=7; //1602第11列
}
else
{ //显示模式应做以下工作
setdat=DS1302_readD(C_SEC|RD); //读出秒寄存器的内容
DS1302_writeD(C_WP|WR,UPROTECT); //解除写保护
DS1302_writeD(C_SEC|WR,0x7F&setdat); //进入显示模式就启动振荡器,但不改变秒寄存器的内容
DS1302_writeD(C_WP|WR,PROTECT); //写保护
LCD12864_sendbyte(iCmd, 0X0C); //将光标闪烁关闭
set_num=0; //将当前设置位改为默认的秒寄存器
}
break;
case 0xD: //当前设置位选择按键(按动此键,将循环改变设置位为:秒-分-时-星期-日-月-年,先个位后十位)
if(RD_TFLAG==0) //设置模式此键生效,显示模式此键不响应
{
set_num+=1; //当前设置位加1
if(set_num==13) //当前设置位为年十位的时候,再按此键将当前设置位改为秒个位
{
set_num=0;
}
switch(set_num) //根据set_num来判断当前设置位,并做相应工作
{
case 0: //设置秒个位
LCD12864_gotoXY(2,6); //更新1602的光标位置
setadd=C_SEC; //设置地址指向秒寄存器
shift=0; //设置个位标志
dis_x=2; //1602第2行
dis_y=6; //1602第11列
break;
case 1: //设置秒十位
LCD12864_gotoXY(2,10); //更新1602的光标位置
setadd=C_SEC; //设置地址指向秒寄存器
shift=4; //设置十位标志
dis_x=2; //1602第2行
dis_y=10; //1602第10列
break;
case 2:
LCD12864_gotoXY(2,8);
setadd=C_MIN; //设置地址指向分寄存器
shift=0; //设置个位标志
dis_x=2;
dis_y=8;
break;
case 3:
LCD12864_gotoXY(2,7);
setadd=C_MIN; //设置地址指向分寄存器
shift=4; //设置十位标志
dis_x=2;
dis_y=7;
break;
case 4:
LCD12864_gotoXY(2,5);
setadd=C_HR; //设置地址指向小时寄存器
shift=0; //设置个位标志
dis_x=2;
dis_y=5;
break;
case 5:
LCD12864_gotoXY(2,4);
setadd=C_HR; //设置地址指向小时寄存器
shift=4; //设置十位标志
dis_x=2;
dis_y=4;
break;
case 6:
LCD12864_gotoXY(1,13);
setadd=C_WK; //设置地址指向星期寄存器
shift=0; //设置个位标志
dis_x=1;
dis_y=13;
break;
case 7:
LCD12864_gotoXY(1,11);
setadd=C_DAY; //设置地址指向日寄存器
shift=0; //设置个位标志
dis_x=1;
dis_y=11;
break;
case 8:
LCD12864_gotoXY(1,10);
setadd=C_DAY; //设置地址指向日寄存器
shift=4; //设置十位标志
dis_x=1;
dis_y=10;
break;
case 9:
LCD12864_gotoXY(1,8);
setadd=C_MTH; //设置地址指向月寄存器
shift=0; //设置个位标志
dis_x=1;
dis_y=8;
break;
case 10:
LCD12864_gotoXY(1,7);
setadd=C_MTH; //设置地址指向月寄存器
shift=4; //设置十位标志
dis_x=1;
dis_y=7;
break;
case 11:
LCD12864_gotoXY(1,5);
setadd=C_YR; //设置地址指向年寄存器
shift=0; //设置个位标志
dis_x=1;
dis_y=5;
break;
case 12:
LCD12864_gotoXY(1,4);
setadd=C_YR; //设置地址指向年寄存器
shift=4; //设置十位标志
dis_x=1;
dis_y=4;
break;
}
break;
}
case 0xf://取消
menu_0();
n=1;
break;
default:
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -