#include "Prinipal.h"
sbit CS_12887=P2^7;
sbit Noise=P3^2; //用于蜂鸣器响声
/*------ 函数声明 -----------------*/
void System(void); //系统设置
void Time(void); //时间设置
void Calendar(void); //日历设置
void Luminance(void); //亮度设置
void Alarm_xlock(void); //钟设置
void Hour_sytem(void); //时制设置
void Alarm_xlock_1(void); /*第一组闹钟*/
void Alarm_xlock_2(void); /*第二组闹钟*/
void Alarm_xlock_3(void); /*第三组闹钟*/
void ies(void); //
void Make_the_bell(void); //闹铃响
void Aswitch(void); //三组开/关闹铃设置
void Buzzer(unsigned short,unsigned short);//蜂鸣器声
void show(void); //显示
void bbbb(void); //查闹铃
/*------- 全局变量 --------------------------*/
unsigned char at24c02_A[6]; //用于各设置状况数组
unsigned char at24c02_B[6]; //用于各设置状况数组
unsigned char State[4]; //用于进入系统设置后,显示状态栏
unsigned char Setup[8]; //用于设置显示栏的显示数组
unsigned char aa; //用于中断显示计次
unsigned short cv; //用于显示标志
unsigned int aab; //用于定时计数
unsigned short cc; //用于退出整个菜单的延时标志位
unsigned short bbb; //用于定时到了就置1,用于在闹钟启动后开始用定时中断标志位
unsigned int Disengaging; //用于外中断闹钟启动后计时退出
unsigned long Account_A; //用于闹定计时退出
unsigned short che=0x00; //chen用于选择显示状态标志
/***************--- 主函数 ----********************************************/
void main(void)
{ P0=0xff;
P1=0xff;
P2=0xff;
P3=0xfb;
CS_12887=0; //12887片选
/*--- 24C02的读出 -------*/
Read24c02(at24c02_A,0,6); //读
Read24c02(at24c02_B,9,6); //读
/*-----MAX6954初始化寄存器--------------*/
send(0x07,0x01); //开始显示测试(0x07寄存器地址,0x01数据)
send(0x02,at24c02_A[2]);//全局亮度控制寄存器,控制亮度
send(0x04,0x01); //启动显示器驱动器,同时将工作方式设置为全局亮度控制、禁止闪烁
send(0x0c,0x00); //位娄型设为设置成驱动7段显示器的模式
Delay(500); //调用延迟
send(0x07,0x00); //退出显示测试
/*----DS12C877初始化,设置DV2、DV1、DV0为010,打开芯片DS12C877内部晶振-----*/
REG_A = REG_A&0xaf; // DV2=DV0=0
REG_A = REG_A|0x20; // DV1=0
// DS_CS = 0;
REG_B = REG_B | 0x80; // SET=1,芯片DS12C887处于设置状态
REG_B = REG_B & 0xfa; // DM=0,二进制数据模式,DSE=0
REG_B = REG_B & 0x7f; // SET=0,芯片DS12C887恢复正常数据更新状态
TMOD=0x01; //TMOD工作于模式1
TH0=0x3c;
TL0=0xb0; //65536-15536=50000=50mS
ET0=1; //允许T0中断
TR0=1; //打开总中断
EA=1; //启动T0开始计数
cv=0; //使显示走时状态,用于显示标志
while(1)
{ unsigned short key;
unsigned long cdfh;
show(); //调用显示
key=keyscan();
switch(key)
{ /* 响声 待按键放开 */
case 0x11:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"1"
case 0x21:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"2"
case 0x41:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"3"
case 0x81:{ Buzzer(1,50);
for(;key==keyscan();)
{ show(); //调用显示
cdfh++;
if(cdfh>=150)
System(); //调用系统设置
} cdfh=0;
}break; //键盘号"A"
case 0x12:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"4"
case 0x22:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"5"
case 0x42:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"6"
case 0x82:{ if(at24c02_A[1]==0x0b)
at24c02_A[1]=0;
else
at24c02_A[1]=0xb;
Buzzer(1,200);
Write24c02(at24c02_A,0,6); //从a2数组首地址;写入24C02的0x10地址开始写入7个字节到24C02中
for(;key==keyscan();){} }break; //键盘号"B"
case 0x14:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"7"
case 0x24:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"8"
case 0x44:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"9"
case 0x84:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"C"
case 0x18:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"*"
case 0x28:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"0"
case 0x48:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"#"
case 0x88:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"D"
}
show(); //调用显示
bbbb(); //调用查闹铃
/*---- 电池低电压检测 ---*/
// if(REG_D==0) //如果DS12887电池电压低就调用Cell()低电池电压检测
// { Buzzer(10,50); //响10声
// Delay(800); //延时
// }
}
}
/*********************** 子函数 *****************************************************************************************************/
/*--- 用于查闹铃时间到了没有 -----*/
/*---------------------------------*/
void bbbb(void)
{
if(at24c02_A[1]==0x0b) //查看闹铃状态有没有开启,如开启就调用查阅Make_loudly();
{
if(SECOND<=0x02) //如果秒小于2秒就做以下工作
{
if(at24c02_A[3]==1) //查第一组闹铃开/闭标志位有没有打开
{ if(HOUR==at24c02_B[0]) //查第一组闹铃时有没有到了?
{ if(MIN==at24c02_B[1]) //查第一组闹铃分有没有到了?
{ bbb=1; //使在闹钟启动后开始用定时中断标志位赋1开始定时中断计时
Make_the_bell(); //时间到调用闹铃函数
}
}
}
if(at24c02_A[4]==1) //查第二组闹铃标志位有没有打开
{ if(HOUR==at24c02_B[2]) //查第二组闹铃时有没有到了?
{ if(MIN==at24c02_B[3]) //查第二组闹铃分有没有到了?
{ bbb=1; //使在闹钟启动后开始用定时中断标志位赋1开始定时中断计时
Make_the_bell(); //时间到调用闹铃函数
}
}
}
if(at24c02_A[5]==1) //查第三组闹铃标志位有没有打开
{ if(HOUR==at24c02_B[4]) //查第三组闹铃时有没有到了?
{ if(MIN==at24c02_B[5]) //查第三组闹铃分有没有到了?
{ bbb=1; //使在闹钟启动后开始用定时中断标志位赋1开始定时中断计时
Make_the_bell(); //时间到调用闹铃函数
}
}
}
}
}
}
/*-------------------------------------------------*/
/*----- 显示程序 --------*/
/*-------------------------------------------------*/
void show(void)
{
if(aa>=8)
{ aa=0;
switch(cv)
{ //用于显示走时
case 0:{
send(0x2e,SECOND&0x0f); //秒个位送到LED6(寄存器6a)
send(0x26,SECOND>>4); //秒十位送到LED5(寄存器6)
send(0x2d,MIN&0x0f); //分个位送到LED4(寄存器5a)
send(0x25,MIN>>4); //分十位送到LED3(寄存器5)
if(at24c02_A[0]==0x0f)
{
send(0x2c,HOUR&0x0f); //时个位送到LED2(寄存器4a)
send(0x24,HOUR>>4); //时十位送到LED1(寄存器4)
}
else
{ if(HOUR>=0x13)
{
send(0x2c,(((HOUR>>4)*10+(HOUR&0x0f))-12)%10 ); //时个位送到LED2(寄存器4a)
send(0x24,(((HOUR>>4)*10+(HOUR&0x0f))-12)/10 ); //时十位送到LED1(寄存器4)
}
else
{ send(0x2c,HOUR&0x0f); //时个位送到LED2(寄存器4a)
send(0x24,HOUR>>4); //时十位送到LED1(寄存器4)
}
}
send(0x20,YEAR>>4); //年十位送到LED9(寄存器0)
send(0x28,YEAR&0x0f); //年个位送到LED10(寄存器0a)
send(0x21,MONTH>>4); //月十位送到LED11(寄存器1)
send(0x29,MONTH&0x0f); //月个位送到LED12(寄存器1a)
send(0x22,DAYOFMONTH>>4); //日十位送到LED13(寄存器2)
send(0x2a,DAYOFMONTH&0x0f); //日个位送到LED14(寄存器2a)
send(0x23,0x0d); //星期个位送到LED15(寄存器3)
if(DAYOFWEEK==7)
send(0x2b,0x08); //星期个位送到LED16(寄存器3a)
else
send(0x2b,DAYOFWEEK); //星期个位送到LED16(寄存器3a)
send(0x27,at24c02_A[0]); //时制位送到LED6(寄存器7)
send(0x2f,at24c02_A[1]); //闹钟位送到LED6(寄存器7a)
}break;
//用于显示进入系统
case 1:{send(0x20,State[0]);
send(0x28,State[1]);
}break;
//用于显示设置系统
case 2:{send(0x20,State[0]); //状态显示
send(0x28,State[1]);
send(0x24,Setup[0]); //设置显示
send(0x2c,Setup[1]);
send(0x25,Setup[2]);
send(0x2d,Setup[3]);
send(0x26,Setup[4]);
send(0x2e,Setup[5]);
send(0x27,Setup[6]);
send(0x2f,Setup[7]);
}break;
//用于显示各组钟时间
case 3:{send(0x20,State[0]); //状态显示
send(0x28,State[1]);
send(0x21,State[2]); //状态显示
send(0x29,State[3]);
send(0x24,Setup[0]); //设置显示
send(0x2c,Setup[1]);
send(0x25,Setup[2]);
send(0x2d,Setup[3]);
send(0x26,Setup[4]);
send(0x2e,Setup[5]);
send(0x27,Setup[6]);
send(0x2f,Setup[7]);
}break;
}
}
}
/*-----------------------------------------------*/
/*----- 系统设置 ----------------------------*/
/*-----------------------------------------------*/
void System(void)
{ unsigned short key;
cc=0; //用于退出一层菜单的延时标志位
cv=1; //使显示系统设置状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x00; //使状态栏显示所赋的值
show(); //调用显示
Buzzer(1,200); //长响一声
for(aab=800;aab>0; )
{ show(); //调用显示
key=keyscan();
switch(key)
{
case 0x11:{Time(); /*调用时间设置*/ }break; //键盘号"1"
case 0x21:{Hour_sytem(); /*时制设置*/ }break; //键盘号"2"
case 0x41:{Calendar(); /*调用日历设置函数*/ }break; //键盘号"3"
case 0x81:{Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"A"
case 0x12:{Alarm_xlock();/*调用闹钟设置*/ }break; //键盘号"4"
case 0x22:{Aswitch(); /*调用三组闹铃开/闭设置*/ }break; //键盘号"5"
case 0x42:{ ies(); /*调用显示三组闹钟*/ }break; //键盘号"6"
case 0x82:{ aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"B"
case 0x14:{ Luminance();/*调用亮度设置*/ }break; //键盘号"7"
case 0x24:{ aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"8"
case 0x44:{ aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"9"
case 0x84:{aab=0; }break; //键盘号"C"
case 0x88:{aab=0; }break; //键盘号"D"
}
}
cv=0; //使显示走时状态
send(0x04,0x21); //使显示走时状态
Buzzer(3,50); //长响一声
}
/*-----------------------------------------------*/
/*-------- 时间设置 -------------------------*/
/*-----------------------------------------------*/
void Time(void)
{ unsigned short key,i=0;
cv=2; //使显示系统设置状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x01; //使状态栏显示
Setup[0]=Setup[1]=Setup[2]=Setup[3]=Setup[4]=Setup[5]=0x0f;
Setup[6]=Setup[7]=0x11; //使不显示
show(); //调用显示
Buzzer(1,200); //长响一声
for(aab=800;aab>0;)
{ show(); //调用显示
key=keyscan();
switch(key)
{ /* 查赋值到了那位 赋值使延时 响声 待按键放开 */
case 0x11:{Setup[i]=1; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"1"
case 0x21:{Setup[i]=2; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"2"
case 0x41:{Setup[i]=3; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"3"
case 0x81:{ aab=800; Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"A"
case 0x12:{Setup[i]=4; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"4"
case 0x22:{Setup[i]=5; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"5"
case 0x42:{Setup[i]=6; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"6"
case 0x82:{ aab=800; Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"B"
case 0x14:{Setup[i]=7; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"7"
case 0x24:{Setup[i]=8; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"8"
case 0x44:{Setup[i]=9; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"9"
case 0x84:{aab=0; cc=1; }break; //键盘号"C"
case 0x18:{ Setup[0]=Setup[1]=Setup[2]=Setup[3]=Setup[4]=Setup[5]=0x0f;
i=0; aab=800; Buzzer(1,200); for(;key==keyscan();){} }break; //键盘号"*"
case 0x28:{ Setup[i]=0; i++; if(i==6)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"0"
case 0x48:{ REG_B = REG_B|0x80; // SET=1,芯片DS12C887处于设置状态
HOUR = (Setup[0]<<4) | Setup[1]; //时
MIN = (Setup[2]<<4) | Setup[3]; //分
SECOND = (Setup[4]<<4) | Setup[5]; //秒
REG_B = REG_B&0x7f; /* SET=0,芯片DS12C887恢复正常数据更新状态*/
aab=800; Buzzer(1,200);
for(;key==keyscan();){} }break; //键盘号"#"
case 0x88:{ aab=0; }break; //键盘号"D"
}
}
cv=1; //使显示走时状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x00; //使状态栏显示所赋的值
/*-- 查是否按了C键做完全退出设置菜单动作 --*/
if(cc==0)
{ Buzzer(3,50); //长响一声
aab=800; //使上一层菜单重新计数延时
}
}
/*-------------------------------------*/
/*----- 时制设置 ------------------*/
/*-------------------------------------*/
void Hour_sytem(void)
{ unsigned short key,i=0;
cv=2; //使显示系统设置状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x02; //使状态栏显示
Setup[0]=0x00;
Setup[1]=0x00;
Setup[2]=Setup[3]=Setup[4]=Setup[5]=Setup[6]=Setup[7]=0x11; //使不显示
show(); //调用显示
Buzzer(1,200); //长响一声
for(aab=800;aab>0; )
{ show(); //调用显示
key=keyscan();
switch(key)
{
case 0x11:{ at24c02_A[0]=0x0a;
Setup[0]=0x01;
Setup[1]=0x02;
Buzzer(1,50);
for(;key==keyscan();){} }break; //键盘号"1"
case 0x21:{ at24c02_A[0]=0x0f;
Setup[0]=0x02;
Setup[1]=0x04;
Buzzer(1,50);
for(;key==keyscan();){} }break; //键盘号"2"
case 0x41:{ Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"3"
case 0x84:{ aab=0; cc=1; }break; //键盘号"C"
case 0x88:{ aab=0; }break; //键盘号"D"
}
}
Write24c02(at24c02_A,0,6); //从a2数组首地址;写入24C02的0x10地址开始写入7个字节到24C02中
cv=1; //使显示走时状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x00; //使状态栏显示所赋的值
/*-- 查是否按了C键做完全退出设置菜单动作 --*/
if(cc==0)
{ Buzzer(3,50); //长响一声
aab=800; //使上一层菜单重新计数延时
}
}
/*日历设置*/
void Calendar(void)
{ unsigned short key,i=0;
cv=2; //使显示系统设置状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x03; //使状态栏显示
Setup[0]=Setup[1]=Setup[2]=Setup[3]=Setup[4]=Setup[5]=Setup[6]=0x0f;
Setup[7]=0x11; //使不显示
show(); //调用显示
Buzzer(1,200); //长响一声
for(aab=800;aab>0; )
{ show(); //调用显示
key=keyscan();
switch(key)
{ /* 响声 待按键放开 */
case 0x11:{Setup[i]=1; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"1"
case 0x21:{Setup[i]=2; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"2"
case 0x41:{Setup[i]=3; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"3"
// case 0x81:{ aab=800; Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"A"
case 0x12:{Setup[i]=4; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"4"
case 0x22:{Setup[i]=5; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"5"
case 0x42:{Setup[i]=6; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"6"
case 0x82:{ aab=800; Buzzer(2,50); for(;key==keyscan();){} }break; //键盘号"B" case 0x14:{Setup[i]=7; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"7"
case 0x24:{Setup[i]=8; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"8"
case 0x44:{Setup[i]=9; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"9"
case 0x84:{ aab=0; cc=1; }break; //键盘号"C"
case 0x18:{ Setup[0]=Setup[1]=Setup[2]=Setup[3]=Setup[4]=Setup[5]=Setup[6]=0x0f; //使显示所赋的值
i=0; aab=800; Buzzer(1,200); for(;key==keyscan();){} }break; //键盘号"*"
case 0x28:{ Setup[i]=0; i++; if(i==7)i=0; aab=800; Buzzer(1,50); for(;key==keyscan();){} }break; //键盘号"0"
case 0x48:{ REG_B = REG_B|0x80; // SET=1,芯片DS12C887处于设置状态
YEAR =(Setup[0]<<4) | Setup[1]; //年
MONTH =(Setup[2]<<4) | Setup[3]; //月
DAYOFMONTH =(Setup[4]<<4) | Setup[5]; //日
DAYOFWEEK = Setup[6]; //星期
REG_B = REG_B&0x7f; /* SET=0,芯片DS12C887恢复正常数据更新状态*/
aab=800; Buzzer(1,200);
for(;key==keyscan();){} }break; //键盘号"#"
case 0x88:{ aab=0; }break; //键盘号"D"
}
}
cv=1; //使显示走时状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x00; //使状态栏显示所赋的值
/*-- 查是否按了C键做完全退出设置菜单动作 --*/
if(cc==0)
{ Buzzer(3,50); //长响一声
aab=800; //使上一层菜单重新计数延时
}
}
/*闹钟设置*/
void Alarm_xlock(void)
{ unsigned short key,i=0;
cv=2; //使显示系统设置状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x04; //使状态栏显示
Setup[0]=0x01;
Setup[1]=0x02;
Setup[2]=0x03;
Setup[3]=Setup[4]=Setup[5]=Setup[6]=Setup[7]=0x11; //使不显示
show(); //调用显示
Buzzer(1,200); //长响一声
for(aab=800;aab>0; )
{ show(); //调用显示
key=keyscan();
switch(key)
{ /* 响声 待按键放开 */
case 0x11:{Alarm_xlock_1(); }break; //键盘号"1"
case 0x21:{Alarm_xlock_2(); }break; //键盘号"2"
case 0x41:{Alarm_xlock_3(); }break; //键盘号"3"
case 0x81:{aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"A"
case 0x12:{aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"4"
// case 0x22:{aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"5"
// case 0x42:{aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"6"
// case 0x82:{aab=800; Buzzer(2,50); for(;key==keyscan();){}}break; //键盘号"B"
case 0x84:{ aab=0; cc=1; }break; //键盘号"C"
case 0x88:{ aab=0; }break; //键盘号"D"
}
}
cv=1; //使显示走时状态
send(0x04,0x21); //使显示走时状态
State[0]=0x0a; State[1]=0x00; //使状态栏显示所赋的值
/*-- 查是否按了C键做完全退出设置菜单动作 --*/
if(cc==0)
{ Buzzer(3,50); //长响一声
aab=800; //使上一层菜单重新计数延时
}
}
|