📄 pcf8563.c
字号:
else if(count==6)
{
rbuf[0]=rbuf[0]&0x7f;
gw=rbuf[0]&0x0f;
sw=(rbuf[0]>>4)&0x0f;
if(gw==0x0)
{ if(sw==0x0)
{sw=5;
gw=9;
}
else
{gw=9;
sw-=1;
}
}
else
gw-=1;
rbuf[0]=(sw<<4)+gw;
SetPCF8563(minute,rbuf[0]);
}
else
break;
break;
case 10: EnterCount=0;
lcd_init();
switch(AlarmCount)
{case 0:lcd_display(0x40,AlarmMinute);break;
case 1:lcd_display(0x40,AlarmHour);break;
case 2:lcd_display(0x40,AlarmDay); break;
case 3:lcd_display(0x40,AlarmWeek);break;
default:break;
}
AlarmCount+=1;
if(AlarmCount>4)
AlarmCount=0;
break;
case 11: EnterCount++; //确认键,按下1次表示确定设定类型
lcd_init();
if(EnterCount==1)
{
AlarmCount--;
if(AlarmCount<0)
AlarmCount=0;
if(AlarmCount==0)
lcd_display(0x40,TimeM);
else if(AlarmCount==1)
lcd_display(0x40,TimeH);
else if(AlarmCount==2)
lcd_display(0x40,TimeD);
else
{AlarmCount=3;
lcd_display(0x40,TimeW);
}
GetPCF8563(minAlarm,4,abuf);//把相应寄存器中的报警数据读出
alarm_display(abuf);
}
else if(EnterCount==2) //按下第二次表示发送报警数据
{
ddata=(data1<<4)+data2;
if(AlarmCount==0)
{if((ddata>0x59)||(ddata<0x00))
{
lcd_display(0x40,Error);
EnterCount=0;
}
else
{
lcd_display(0x40,TestOk);
}
}
else if(AlarmCount==1)
{if(ddata>0x23||ddata<0x00)
{
lcd_display(0x40,Error);
EnterCount=0;
}
else
{
lcd_display(0x40,TestOk);
}
}
else if(AlarmCount==2)
{if(ddata>0x31||ddata<0x01)
{
lcd_display(0x40,Error);
EnterCount=0;
}
else
{
lcd_display(0x40,TestOk);
}
}
else
{ AlarmCount=3;
if(ddata>0x6||ddata<0x00)
{
lcd_display(0x40,Error);
EnterCount=0;
}
else
{
lcd_display(0x40,TestOk);
}
}
}
else if(EnterCount==3) //按下第3次表示发送报警数据
{EnterCount=0;
SetPCF8563(ctrl2,0x02); //把AIE设置为1,AF设置为0
abuf[AlarmCount]=(ddata&0x7f);//把AE设定为0
SetPCF8563(minAlarm+AlarmCount,abuf[AlarmCount]);//报警设置完毕
lcd_display(0x40,AlarmFinish);
//显示闹钟符号
}
else
EnterCount=0;
break;
break;
case 0: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x00;char_display(0x42,0x30);}
else if(DataCount==2)
{data2=0x00;char_display(0x43,0x30);DataCount=0;}
}
break;
case 1: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x01;char_display(0x42,0x31);}
else if(DataCount==2)
{data2=0x01;char_display(0x43,0x31);DataCount=0;}
}
else if(EnterCount==0)
{ lcd_init();
CloseCount=1;
}
break;
case 2: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x02;char_display(0x42,0x32);}
else if(DataCount==2)
{data2=0x02;char_display(0x43,0x32);DataCount=0;}
}
break;
case 3: LightCount++;
if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x03;char_display(0x42,0x33);}
else if(DataCount==2)
{data2=0x03;char_display(0x43,0x33);DataCount=0;}
}
if(LightCount==0)
light=0;
else if(LightCount==1)
light=1;
else
light=0;
break;
case 4: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x04;char_display(0x42,0x34);}
else if(DataCount==2)
{data2=0x04;char_display(0x43,0x34);DataCount=0;}
}
else if(EnterCount==0)
{
SetPCF8563(minAlarm,0x80); //清除AE标志位
lcd_init();
lcd_display(0x02,CloseMinAlarm);
lcd_display(0x45,AlarmClosed);
delay(1500);
lcd_init();
}
break;
case 5: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x05;char_display(0x42,0x35);}
else if(DataCount==2)
{data2=0x05;char_display(0x43,0x35);DataCount=0;}
}
else if(EnterCount==0)
{
SetPCF8563(hourAlarm,0x80); //清除AE标志位
lcd_init();
lcd_display(0x03,CloseHourAlarm);
lcd_display(0x45,AlarmClosed);
delay(1500);
lcd_init();
}
break;
case 6: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x06;char_display(0x42,0x36);}
else if(DataCount==2)
{data2=0x06;char_display(0x43,0x36);DataCount=0;}
}
else if(EnterCount==0)
{
SetPCF8563(dayAlarm,0x80); //清除AE标志位
lcd_init();
lcd_display(0x03,CloseDayAlarm);
lcd_display(0x45,AlarmClosed);
delay(1500);
lcd_init();
}
break;
case 7: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x07;char_display(0x42,0x37);}
else if(DataCount==2)
{data2=0x07;char_display(0x43,0x37);DataCount=0;}
}
else if(EnterCount==0)
{
SetPCF8563(weekAlarm,0x80); //清除AE标志位
lcd_init();
lcd_display(0x03,CloseWeekAlarm);
lcd_display(0x45,AlarmClosed);
delay(1500);
lcd_init();
}
break;
case 8: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x08;char_display(0x42,0x38);}
else if(DataCount==2)
{data2=0x08;char_display(0x43,0x38);DataCount=0;}
}
break;
case 9: if(EnterCount==1)
{ DataCount++;
if(DataCount==1)
{data1=0x09;char_display(0x42,0x39);}
else if(DataCount==2)
{data2=0x09;char_display(0x43,0x39);DataCount=0;}
}
break;
default: break;
}
}
/********************* 时钟关闭程序**********************/
void clkscan(void)
{uint key;
key=getch();
delay(50);
switch(key)
{case 2: lcd_init();
CloseCount=0;
break;
default:break;
}
}
/********************* 中断服务程序**********************/
void ISR_int0(void) interrupt 0 using 0
{ uint t;
lcd_init();
for(t=10;t>=0;t--)
{lcd_display(0x05,ALARM);
beep=1;
light=1;
delay(100);
}
light=0;
beep=0;
lcd_init();
SetPCF8563(ctrl2,0x02);//把AIE设置为1,AF设置为0,清空闹钟标志位
}
//定时器中断服务程序,实现1s的定时
/*void timer0(void) interrupt 1 using 1
{
TH0 = 0x3C; //定时器赋予初值
TL0 = 0xAF;
//一秒累加
rSecondCount++;//秒计时+1
if (40 == rSecondCount) //1sec到,50ms*20
{
GetPCF8563(minute,6,rbuf);
test = 1;
rSecondCount = 0;
}
else
{
test = 0;
}
}
*/
//---------------------------------主函数------------------------------------------
void main()
{ IT0=0; //系统开外部0中断
//ET0 = 1; //允许定时器0中断
EA=1; //开总中断
EX0=1;
//TMOD = 0x01; //定时器工作方式选择
//TH0 = 0x3C; //定时器赋予初值
//TL0 = 0xAF;
//IE = 0x82; // 使能timer0中断
//TR0 = 1; //启动定时器
lcd_init(); // 初始化LCD
pcf8563start(); //启动pcf8563
SetPCF8563(ctrl2,0x02);
setime(); //出始时间设定
while(1)
{
switch(CloseCount)
{case 0:
GetPCF8563(minute,6,rbuf);
time_display(rbuf);
keyscan();
break;
case 1:
lcd_display(0x01,Close);
clkscan();
break;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -