c51实现万年历、温度与闹钟功能程序
if(Minb==1) //分钟闪烁标志位
{
if(flag==1)
{
d = Read_One_Byte(0x02);//读取24的分的数值
Mcs=0;Scs=1;
Disp_Digit(4,8,zero+(d/10)*16);
Disp_Digit(4,16,zero+(d%10)*16);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(4,8,space); //显示空格
Disp_Digit(4,16,space);
}
}
else
{
d = Read_One_Byte(0x02);//读取24的分的数值
Mcs=0;Scs=1;
Disp_Digit(4,8,zero+(d/10)*16);
Disp_Digit(4,16,zero+(d%10)*16);
}
if(Secb==1) //秒闪烁标志位
{
if(flag==1)
{
d = Read_One_Byte(0x03);//读取24的秒的数值
Mcs=0;Scs=1;
Disp_Digit(4,32,zero+(d/10)*16);
Disp_Digit(4,40,zero+(d%10)*16);
}
else
{
Mcs=0;Scs=1;
Disp_Digit(4,32,space); //显示空格
Disp_Digit(4,40,space);
}
}
else
{
d = Read_One_Byte(0x03);//读取24的秒的数值
Mcs=0;Scs=1;
Disp_Digit(4,32,zero+(d/10)*16);
Disp_Digit(4,40,zero+(d%10)*16);
}
}
/******************************************************************************/
void id_case1_key(void)//id为1时的下一级选择
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_time(id,0); //调用Set_time函数
while(Add_Key ==0);
}
if (Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_time(id,1);
while(Dec_Key ==0);
}
}
/******************************************************************************/
void Set_time(unsigned char sel, bit sel_1) //根据选择调整相应项目并写入DS1302
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;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=7;mini=1;} //星期
//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}
/******************************************************************************/
void id_case2_key(void)//id为1时的下一级选择
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_Bell(id2,0); //调用Set_time函数
while(Add_Key ==0);
}
if (Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_Bell(id2,1);
while(Dec_Key ==0);
}
}
/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目并写入24
{
signed char address,item;
signed char max,mini;
if(sel==4) {address=0x03; max=59;mini=0;} //秒
if(sel==3) {address=0x02; max=59;mini=0;} //分
if(sel==2) {address=0x01; max=23; mini=0;} //时
if(sel==1)
{
address=0x04;
if(Add_Key ==0 || Dec_Key ==0)
Bell_Swh=~Bell_Swh;
Write_One_Byte(address,Bell_Swh);
} //开关
item = Read_One_Byte(address); Write_One_Byte(address,item);//写入24 /******************************************************************************/ /******************************************************************************/ TH0=(65535-50000)/256; //50ms定时 /******************************************************************************/
if(sel_1==0)
item++;
else
item--;
if(item>max) item=mini;
if(item
}
void Timer0_Init(void)//定时器0初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Timer0(void) interrupt 1 using 1//中断入口,冒号闪烁
{
static unsigned char timecount = 0;//
TL0=(65535-50000)%256;
timecount++;
if(timecount > 9)//500MS
{
timecount = 0;
flag = ~flag;
}
}
void Init_1302(void)//设置1302的初始时间
{
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x05);//年
write_clock(0x8a,0x06);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x12);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
c51万年历温度与闹 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)