Disp_line1(); Disp_line2(); id_case1_key(); break;
case 7: //调节秒
min=0;sec=1;//设置秒钟闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break; } } }
//================================== 定时中断 ============================================= /***************************************************** 函数名:void t0()
功能:时间工作时,冒号闪烁 说明:T0中断入口,方式1 入口参数:无 返回值:无
*****************************************************/ void t0(void) interrupt 1 using 0 {
TH0=(65535-50000)/256; //取50ms定时初值 TL0=(65535-50000)%6; timecount++; if(timecount>9) {
timecount=0; //计时到,从先开始 flag=~flag; //标志位取反 } }
//==================================== 项目设置 =========================================== /***************************************************** 函数名:void id_case1_key()
功能:项目设置加减控制 说明:P1.5和P1.4 <==> +和- 入口参数:无 返回值:无
*****************************************************/ //id为1时的下一级选择 void id_case1_key() {
if (P1_5==0) //P1_5有按下,则数值增加(+) {
Delay5Ms(); //适当延时,消除抖动
if(P1_5==0) Set(id,0); //根据选择调整相应项目 if(id!=7) while(P1_5==0); }
if (P1_4==0) //P1_4有按下,则数值减少(-) {
Delay5Ms(); //适当延时,消除抖动
if(P1_4==0) Set(id,1); //根据选择调整相应项目 if(id!=7) while(P1_4==0); } }
/***************************************************** 函数名:void Set() 功能:项目设置
说明:sel_1=0时,数值加;sel_1=1时,数值减 入口参数:sel和sel_1 返回值:无
*****************************************************/ //根据选择调整相应项目并写入DS1302 void Set(uchar sel,uchar sel_1) {
signed char address,item; signed char max,mini; //偶数指令是写,奇数指令是读 //最大值与最小值限定
if(sel==7) {address=0x80; max=00;mini=0;} //秒 if(sel==6) {address=0x82; max=59;mini=0;} //分钟 if(sel==5) {address=0x84; max=23;mini=0;} //小时 if(sel==3) {address=0x86; max=31;mini=1;} //日 if(sel==2) {address=0x88; max=12;mini=1;} //月 if(sel==1) {address=0x8c; max=99;mini=0;} //年 if(sel==4) {address=0x8a; max=07;mini=1;} //星期
//先从1302中读出数据,把数据转换成十进制进行加减设置;后从先转换回来写入1302中
item=R1302(address+1)/16*10+R1302(address+1);//从1302中读出1字节,再转换成十进制
if (sel_1==0) item++; else item--; //sel_1=0则加,sel_1=1则减 if(item>max) item=mini; //大于最大值,则赋最小值(循环) if(item W1302(0x8e,0x00); //允许写操作 W1302(address,item/10*16+item);//把调节好的十进制数据转换成十六进制后写入1302中 W1302(0x8e,0x80); //写保护,禁止写操作 } //======================================================================================= /***************************************************** 函数名:void Disp_line1() 功能:显示时间和温度 (XX:XX:XX XX.X C) 说明:第一行显示数据处理 入口参数:无 返回值:无 *****************************************************/ //屏幕显示第一行: 时间和温度显示 void Disp_line1(void) { Read_Temperature(10,0); //温度显示 //冒号闪烁 if(flag==0) {DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);} else {DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);} if(sec==1) //秒闪烁标志位 { if(flag==1) { DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位 DisplayOneChar(8,0,R1302(0x81)+0x30); //显示秒个位 } else { DisplayOneChar(7,0,0x20); //显示秒十位 DisplayOneChar(8,0,0x20); //显示秒个位 } } else { DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位 DisplayOneChar(8,0,R1302(0x81)+0x30); //显示秒个位 } if(min==1) //分钟闪烁标志位 { if(flag==1) { DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位 DisplayOneChar(5,0,R1302(0x83)+0x30); //显示分钟个位 } else { DisplayOneChar(4,0,0x20); //显示分钟十位 DisplayOneChar(5,0,0x20); //显示分钟个位 } } else { DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位 DisplayOneChar(5,0,R1302(0x83)+0x30); //显示分钟个位 } if(hour==1) //小时闪烁标志位 { if(flag==1) { DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位 DisplayOneChar(2,0,R1302(0x85)+0x30);//显示小时个位 } else { DisplayOneChar(1,0,0x20); //显示小时十位 DisplayOneChar(2,0,0x20); //显示小时个位 } } else { DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位 DisplayOneChar(2,0,R1302(0x85)+0x30);//显示小时个位 } } /***************************************************** 函数名:void Disp_line2() 功能:显示日期和星期 (XX/XX/XX Week.X) 说明:第二行显示数据处理 入口参数:无 返回值:无 *****************************************************/ // 屏幕显示第二行日期和星期 void Disp_line2(void) { DisplayOneChar(3,1,0x2f); //显示固定字符