附 录
unsigned char
yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;
//定义时间映射全局变量(专用寄存器) signed char address,item,item0,max,mini;
unsigned char clk_ala[2]={0x00,0x00};//闹钟数据存放初,始值为00:00 unsigned char hour,minute,time;//用于闹铃的设置 void main_MOTO(void);
/*-----------------------------日期、时间设置函数-----------------------------*/ void tiaozheng(void) {
yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中 mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中 dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中 week = read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中 //---------------------------------- lcm_w_test(0,0x80);
lcm_w_word(\显示内容字符20 lcm_w_test(1,(yy/16)+0x30);
//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示 示 /*
lcm_w_test(0,0x88);
//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端)
30
lcm_w_test(1,yy+0x30);//函数 lcm_w_word(\年\//---------------------------------- lcm_w_test(1,(mo/16)+0x30); lcm_w_test(1,mo+0x30);
//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显
lcm_w_word(\月\//----------------------------------
//调用字符显示函数,显示文字 月
附 录
示 */
lcm_w_word(\星期\lcm_w_test(1,mo+0x30);
//调用字符显示函数,显示文字 星期
//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显
//---------------------------------- lcm_w_test(1,(dd/16)+0x30); lcm_w_test(1,dd+0x30);
//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码
lcm_w_word(\日\显示字符 日 //---------------------------------- if(read_clock(0x85) != hh)
{//如果程序中的小时与1302芯片中的不同, }
lcm_w_test(0,0x91);
lcm_w_test(1,(hh/16)+0x30);//显示十位 lcm_w_test(1,hh+0x30);//显示个位 lcm_w_word(\时\//---------------------------------- if(read_clock(0x83) != mm)
{//如果1302芯片中的分钟数据与程序中的分钟变量不相等 }
lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数 lcm_w_test(1,mm+0x30);//向液晶写数据,显示分钟的个位数 lcm_w_word(\分\//---------------------------------- if(read_clock(0x81) != ss){
31
hh = read_clock(0x85);//刷新程序中的小时数据
//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端)
mm = read_clock(0x83);//刷新程序中的分钟数据
//如果1302芯片中的分钟数据与程序中的秒钟变量不相等(0x81为读秒数据0x80为写秒数据)
附 录
}
ss = read_clock(0x81);//刷新程序中的秒钟数据
lcm_w_test(1,(ss/16)+0x30);//向液晶写数据,显示分钟的十位数 lcm_w_test(1,ss+0x30);//向液晶写数据,显示分钟的个位数 lcm_w_word(\秒\
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////// }
/*****************************************************************************/
//被调数据加一或减一,并检查数据范围,写入1302指定地址保存 void ds_w(void) {
item0=time;
item=((read_clock(address+1))/16)*10 + (read_clock(address+1));
32
//=========显示闹钟的设置时间===================
hour=clk_ala[0]; //取出上一次的闹钟小时值 minute=clk_ala[1]; //取出上一次的闹钟分钟值
lcm_w_test(0,0x88); lcm_w_word(\闹钟---\//----------------------------
lcm_w_test(1,(hour/10)+0x30);//显示小时十位 lcm_w_test(1,(hour)+0x30);//显示小时个位 //---------------------------- //----------------------------
lcm_w_test(1,(minute/10)+0x30);//显示分钟的十位 lcm_w_test(1,(minute)+0x30);//显示分钟的个位 //---------------------------- lcm_w_word(\
lcm_w_word(\
附 录
//时间的调整 }
/********************************************************************/ //===============闹钟时间的加减设置====================== void ds_w0(void) {
item0=time;
if(K3 == 0||key_add==1){//如果按动上调键
item0++;//数加 1 }
item0--;//数减 1 }
if(K3 == 0||key_add==1){//如果按动上调键 item++;//数加 1 }
if(K4 == 0||key_minish==1){//如果按动下调键 }
if(item>max) item=mini;//查看数值是否在有效范围之内
if(item write_clock(address,(item/10)*16+item);//转换成16进制写入1302 write_clock(0x8e,0x80);//写保护,禁止写操作 item--;//数减 1 if(K4 == 0||key_minish==1){//如果按动下调键 if(item0>max) item0=mini;//查看数值是否在有效范围之内 if(item0 //调整后的时间重新赋值给time(time为hour或minute),这步很重要,没有将无法更新闹钟数据 } /******************************************************************** 33 附 录 **************************************/ //调整时间子函数,设置键、数据范围、上调加一,下调减一功能。 void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302,函数参数是按动设置键的次数 /* if(sel==8) {lcm_w_word(\星期\ tiaozheng(); ds_w(); tiaozheng(); } */ //================================================================ lcm_w_test(0,0x9c); if(sel==7) {lcm_w_word(\闹钟分\ tiaozheng();//显示调整前的内容 clk_ala[1]=time;//把更新后的分钟数据重新保存 lcm_w_test(0,0x98); lcm_w_word(\调整>> <<<<\ //第一参数0表示本行写入指令,指定下面行的 调整 显示起始位置为9AH //调用字符显示函数,显示 调整字样 write_com(0x30); write_com(0x06); ds_w0();//设置闹钟 tiaozheng();//显示调整后的内容 }//按动8次显示 调整闹钟的分钟部分 if(sel==6) {lcm_w_word(\闹钟时\ tiaozheng(); ds_w0(); clk_ala[0]=time;//把更新后的小时数据重新保存 tiaozheng(); }//按动7次显示 调整闹钟的小时部分 //============================================================ 34