#include<df.h>
#include<core.h>
#include<at89x51.h>
#include<intrins.h>
void write728x(uc, uc);
uc read728x(uc);
void send_byte(uc);
uc receive_byte(void);
void salarm(void);
void belld();
void addt(void);
void mint(void);
void addc(void);
void minc(void);
void delay(uc);
void delayms(uc);
void delayd(void);
void disp_c(void);
void display(uc,uc);
void disptime(uc);
void init(void);
void init_728x(void);
void init_timer(void);
void init_lcd(void);
void keyp(void);
void waitforenable(void);
void lcdwritedata(char);
void lcdwritecommand(uc,uc) ;
void lcdreset(void) ;
void disponechar(uc,uc,uc) ;
void eputstr(uc x,uc y, uc code*ptr) ;
void putc(uc,uc,uc);
void settime(void);
void deal(void);
void timeinc(void);
code uc szdm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
code char alacstr[]="Alarm";
code char seccstr[]="Timer";
code char clocstr[]="Clock";
code char settstr[]="Deal";
code char beepstr[]="Beep";
code char indechr[]=":";
code char nndechr[]="NOAC";
code char nullstr[]=" ";
uc hour[time_total];
uc min[time_total];
uc sec[time_total];
uc tuni[time_total];
uc soo[time_total-global_dispte+1];
uc stat=noc;
uc current=0;
uc cd=0;
uc beep=0;
uc sgn_g=noc;
void main(void){
stat=noc;
init();
while(1){
salarm();
disp_c();
}
}
void write728x(uc reg_add, uc write_data)
{
send_byte(reg_add);
send_byte(write_data);
}
uc read728x(uc reg_add)
{
send_byte(reg_add|0x80);
return(receive_byte());
}
void send_byte(uc send_byte)
{
uc bit_counter;
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
do
{
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
}while (B7281_DAT);
B7281_CLK=0;
B7281_CLK=1;
while (!B7281_DAT);
for (bit_counter=0;bit_counter<8;bit_counter++)
{
if ((send_byte&0x80)==0)
{
B7281_DAT=0;
}
else
{
B7281_DAT=1;
}
send_byte=send_byte*2;
B7281_CLK=0;
B7281_CLK=0;
B7281_CLK=1;
delay(1);
}
B7281_DAT=1;
}
uc receive_byte(void)
{
uc bit_counter, in_byte;
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
while (B7281_DAT);
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
for (bit_counter=0;bit_counter<8;bit_counter++)
{
delay(1);
in_byte=in_byte*2;
if (B7281_DAT)
{
in_byte=in_byte|0x01;
}
B7281_CLK=0;
B7281_CLK=0;
B7281_CLK=1;
}
return(in_byte);
}
void salarm(){
uc t=global_alarm_s;
for(t;t<=global_alarm_e;t++){
if(soo[t-global_dispte+1]==1){
if((min[0]==0)&&(sec[0]==0)&&(min[t]==59)&&(sec[t]==59)) beep=1;
if((hour[0]==hour[t])&&(min[0]==min[t])&&(sec[0]>=(sec[t]+1))) beep=1;
if(beep==1){soo[t-global_alarm_s]=0;sgn_g=noc;belld();}
//alarm();}
}
}
}
void belld()
{
while(beep==1){
delay(100);
bellb=!bellb;
disp_c();
}
bellb=1;
delayms(50);
}
void addt(void){
if(current==0)
if((hour[time_total-1])>=23) hour[time_total-1]=0;else hour[time_total-1]+=1;
if(current==1)
if((min[time_total-1])>=59) min[time_total-1]=0;else min[time_total-1]+=1;
if(current==2)
if((sec[time_total-1])>=59) sec[time_total-1]=0;else sec[time_total-1]+=1;
}
void mint(void){
if(current==0)
if ((hour[time_total-1])<1) hour[time_total-1]=23;else hour[time_total-1]--;
if(current==1)
if((min[time_total-1])<1) min[time_total-1]=59;else min[time_total-1]--;
if(current==2)
if((sec[time_total-1])<1) sec[time_total-1]=59;else sec[time_total-1]--;
}
void addc(void){
if(stat==set_time) {if(current>1) current=0;else current++;}
else{if(cd>time_total-3) cd=0;else cd++;}
}
void minc(void){
if(stat==set_time) {if(current<1) current=2;else current--;}
else{if(cd<1) cd=(time_total-2);else cd--;}
}
void delay(uc time){
while(time!=0)
time--;
}
void delayms(uc tts){
uc tem;
for(tem=0;tem<tts;tem++){delayd();}
}
void delayd(void)
{uc t=tuni[0];
while((tuni[0]>t)||((tuni[0]==0)&&(t!=0))) {_nop_();}
}
void disp_c(void){
eputstr(5,0,nullstr);
eputstr(6,0,nullstr);
eputstr(15,0,nullstr);
eputstr(4,1,nullstr);
eputstr(5,1,nullstr);
eputstr(6,1,nullstr);
eputstr(7,1,nullstr);
eputstr(10,1,nullstr);
eputstr(11,1,nullstr);
eputstr(14,1,nullstr);
eputstr(15,1,nullstr);
putc(7,0,hour[0]);
eputstr(9,0,indechr);
putc(10,0,min[0]);
eputstr(12,0,indechr);
putc(13,0,sec[0]);
putc(8,1,cd);
if(area_disp){
eputstr(0,0,clocstr);}
if(area_alarm){
eputstr(0,0,alacstr);}
if(area_sec){
eputstr(0,0,seccstr);
putc(12,1,tuni[cd]);}
if(stat==set_time){
eputstr(0,1,settstr);}
if(stat!=set_time){
eputstr(0,1,nndechr);}
if(beep==1){
eputstr(0,1,beepstr);}
if(stat==set_time) disptime(time_total-1);
else disptime(cd);
}
void display(uc ddd,uc btd){
write728x(btd,szdm[ddd]);
}
void disptime(uc tms){
uc tmp;
tmp=hour[tms]/10;
display(tmp,7);
tmp=hour[tms]%10;
display(tmp,6);
display(10,5);
tmp=min[tms]/10;
display(tmp,4);
tmp=min[tms]%10;
display(tmp,3);
display(10,2);
tmp=sec[tms]/10;
display(tmp,1);
tmp=sec[tms]%10;
display(tmp,0);
if(stat==set_time){
if(current==0) tmp=0x3f;
if(current==1) tmp=0xe7;
if(current==2) tmp=0xfc;
write728x(0x10,tmp);
write728x(0x11,0xa0);}
else{write728x(0x10,0xff);}
}
void init(void){
uc tmp;
for(tmp=0;tmp<time_total;tmp++)
{
hour[tmp]=0;
min[tmp]=0;
sec[tmp]=0;
}
for(tmp=0;tmp<(time_total-global_dispte+1);tmp++)
{soo[tmp]=0;}
init_timer();
delayms(20);
init_lcd();
init_728x();
beep=0;
stat=global_dispts;
cd=global_dispts;
}
void init_728x(void){
write728x(0x12,0x98);//write728x(0x12,0x9c);
}
void init_timer(void){
TMOD=17;
TH0=216;
TL0=240;
ET0=1;
ET1=1;
EX1=1;
IT1=0;
TH1=216;
TL1=240;
ET1=1;
DIR=1;
E=0;
EA=1;
TR0=1;
TR1=0;
}
void init_lcd(void){
SW=0;
lcdreset();
}
void keyp(void)interrupt 2
{
sgn_g=read728x(0x13);
deal();
disp_c();
}
void waitforenable(void) {
DataPort=0xff;
RS=0;RW=1;_nop_();Elcm=0;_nop_();_nop_();
while(DataPort&Busy);
Elcm=1;
}
void lcdwritecommand(uc CMD,uc AttribC){
if (AttribC) waitforenable();
RS=0;RW=0;_nop_();Elcm=1;
DataPort=CMD;_nop_();
Elcm=0;_nop_();_nop_();Elcm=1;
}
void lcdwritedata(char dataW){
waitforenable();
RS=1;RW=0;_nop_();Elcm=1;
DataPort=dataW;_nop_();
Elcm=0;_nop_();_nop_();Elcm=1;
}
void lcdreset(void){
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,1);
lcdwritecommand(0x08,1);
lcdwritecommand(0x01,1);
lcdwritecommand(0x06,1);
lcdwritecommand(0x0c,1);
}
void Disp_XY( char posx,char posy) {
uc temp_lcd;
temp_lcd=posx&0x0f;
posy&=0x1;
if (posx>15) temp_lcd |= 0x40;
if (posy==1) temp_lcd |=0x40;
temp_lcd |= 0x80;
lcdwritecommand(temp_lcd,0);
}
void disponechar(uc x,uc y,uc Wdata) {
Disp_XY(x,y);
lcdwritedata(Wdata);
}
void eputstr(uc x,uc y, uc code *ptr) {
uc i_lcd,l_lcd=0;
while (*ptr++ >0){l_lcd++;};
ptr=ptr-(l_lcd+1);
for (i_lcd=0;i_lcd<l_lcd;i_lcd++) { disponechar(x++,y,*ptr++);
if (31==x) {x=0;y^=0;}
}
}
void putc(uc x, uc y, uc d){
uc tmp1;uc tmp2;
tmp1=d/10;
tmp1+=48;
tmp2=d%10;
tmp2+=48;
disponechar(x,y,tmp1);
disponechar((x+1),y,tmp2);
}
void settime(void){
if(sgn_g==key_up){addt();}
if(sgn_g==key_down){mint();}
if(sgn_g==key_left)
{minc();}
if((sgn_g==key_right))
{addc();}
if(sgn_g==key_cancel)
{stat=noc;tuni[cd]=0;}
if(sgn_g==key_ok){
hour[cd]=hour[time_total-1];
min[cd]=min[time_total-1];
sec[cd]=sec[time_total-1];
if((cd-global_dispte+1)>=0)
soo[cd-global_dispte+1]=1;
stat=noc;
tuni[cd]=0;}
}
void deal(void){
if((sgn_g!=noc)&&(beep=1)){beep=0;}
if(stat==set_time)
settime();
else
{if(sgn_g==key_left)
minc();
if(sgn_g==key_right)
addc();
if(sgn_g==key_ok)
{stat=set_time;}
if(sgn_g==key_cancel)if ((area_alarm)||(area_sec)) {soo[cd-global_dispte+1]=0;}
}
sgn_g=noc;
}
void time0(void) interrupt 1//产生10MS精确定时
{
TH0=216;
TL0=240;
timeinc();
}
void timeind(uc r)
{
tuni[r]+=1;
if(100<=tuni[r])
{sec[r]+=1;tuni[r]=0;
if(60<=sec[r])
{min[r]+=1;sec[r]=0;
if(60<=min[r])
{hour[r]+=1;min[r]=0;
if(24<=hour[r])
{hour[r]=0;
}
}
}
}
}
void timeinc(void){
uc tmp=global_dispts;
for(tmp=global_dispts;tmp<(global_dispte+1);tmp++){
timeind(tmp);
}
for(tmp=global_dispte+1;tmp<(time_total-2);tmp++){
if(area_sec)
if(soo[tmp-global_dispte+1]==1)
timeind(tmp);
}
}
#include<core.h>
#include<at89x51.h>
#include<intrins.h>
void write728x(uc, uc);
uc read728x(uc);
void send_byte(uc);
uc receive_byte(void);
void salarm(void);
void belld();
void addt(void);
void mint(void);
void addc(void);
void minc(void);
void delay(uc);
void delayms(uc);
void delayd(void);
void disp_c(void);
void display(uc,uc);
void disptime(uc);
void init(void);
void init_728x(void);
void init_timer(void);
void init_lcd(void);
void keyp(void);
void waitforenable(void);
void lcdwritedata(char);
void lcdwritecommand(uc,uc) ;
void lcdreset(void) ;
void disponechar(uc,uc,uc) ;
void eputstr(uc x,uc y, uc code*ptr) ;
void putc(uc,uc,uc);
void settime(void);
void deal(void);
void timeinc(void);
code uc szdm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
code char alacstr[]="Alarm";
code char seccstr[]="Timer";
code char clocstr[]="Clock";
code char settstr[]="Deal";
code char beepstr[]="Beep";
code char indechr[]=":";
code char nndechr[]="NOAC";
code char nullstr[]=" ";
uc hour[time_total];
uc min[time_total];
uc sec[time_total];
uc tuni[time_total];
uc soo[time_total-global_dispte+1];
uc stat=noc;
uc current=0;
uc cd=0;
uc beep=0;
uc sgn_g=noc;
void main(void){
stat=noc;
init();
while(1){
salarm();
disp_c();
}
}
void write728x(uc reg_add, uc write_data)
{
send_byte(reg_add);
send_byte(write_data);
}
uc read728x(uc reg_add)
{
send_byte(reg_add|0x80);
return(receive_byte());
}
void send_byte(uc send_byte)
{
uc bit_counter;
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
do
{
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
}while (B7281_DAT);
B7281_CLK=0;
B7281_CLK=1;
while (!B7281_DAT);
for (bit_counter=0;bit_counter<8;bit_counter++)
{
if ((send_byte&0x80)==0)
{
B7281_DAT=0;
}
else
{
B7281_DAT=1;
}
send_byte=send_byte*2;
B7281_CLK=0;
B7281_CLK=0;
B7281_CLK=1;
delay(1);
}
B7281_DAT=1;
}
uc receive_byte(void)
{
uc bit_counter, in_byte;
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
while (B7281_DAT);
B7281_CLK=0;
//B7281_CLK=0;
B7281_CLK=1;
for (bit_counter=0;bit_counter<8;bit_counter++)
{
delay(1);
in_byte=in_byte*2;
if (B7281_DAT)
{
in_byte=in_byte|0x01;
}
B7281_CLK=0;
B7281_CLK=0;
B7281_CLK=1;
}
return(in_byte);
}
void salarm(){
uc t=global_alarm_s;
for(t;t<=global_alarm_e;t++){
if(soo[t-global_dispte+1]==1){
if((min[0]==0)&&(sec[0]==0)&&(min[t]==59)&&(sec[t]==59)) beep=1;
if((hour[0]==hour[t])&&(min[0]==min[t])&&(sec[0]>=(sec[t]+1))) beep=1;
if(beep==1){soo[t-global_alarm_s]=0;sgn_g=noc;belld();}
//alarm();}
}
}
}
void belld()
{
while(beep==1){
delay(100);
bellb=!bellb;
disp_c();
}
bellb=1;
delayms(50);
}
void addt(void){
if(current==0)
if((hour[time_total-1])>=23) hour[time_total-1]=0;else hour[time_total-1]+=1;
if(current==1)
if((min[time_total-1])>=59) min[time_total-1]=0;else min[time_total-1]+=1;
if(current==2)
if((sec[time_total-1])>=59) sec[time_total-1]=0;else sec[time_total-1]+=1;
}
void mint(void){
if(current==0)
if ((hour[time_total-1])<1) hour[time_total-1]=23;else hour[time_total-1]--;
if(current==1)
if((min[time_total-1])<1) min[time_total-1]=59;else min[time_total-1]--;
if(current==2)
if((sec[time_total-1])<1) sec[time_total-1]=59;else sec[time_total-1]--;
}
void addc(void){
if(stat==set_time) {if(current>1) current=0;else current++;}
else{if(cd>time_total-3) cd=0;else cd++;}
}
void minc(void){
if(stat==set_time) {if(current<1) current=2;else current--;}
else{if(cd<1) cd=(time_total-2);else cd--;}
}
void delay(uc time){
while(time!=0)
time--;
}
void delayms(uc tts){
uc tem;
for(tem=0;tem<tts;tem++){delayd();}
}
void delayd(void)
{uc t=tuni[0];
while((tuni[0]>t)||((tuni[0]==0)&&(t!=0))) {_nop_();}
}
void disp_c(void){
eputstr(5,0,nullstr);
eputstr(6,0,nullstr);
eputstr(15,0,nullstr);
eputstr(4,1,nullstr);
eputstr(5,1,nullstr);
eputstr(6,1,nullstr);
eputstr(7,1,nullstr);
eputstr(10,1,nullstr);
eputstr(11,1,nullstr);
eputstr(14,1,nullstr);
eputstr(15,1,nullstr);
putc(7,0,hour[0]);
eputstr(9,0,indechr);
putc(10,0,min[0]);
eputstr(12,0,indechr);
putc(13,0,sec[0]);
putc(8,1,cd);
if(area_disp){
eputstr(0,0,clocstr);}
if(area_alarm){
eputstr(0,0,alacstr);}
if(area_sec){
eputstr(0,0,seccstr);
putc(12,1,tuni[cd]);}
if(stat==set_time){
eputstr(0,1,settstr);}
if(stat!=set_time){
eputstr(0,1,nndechr);}
if(beep==1){
eputstr(0,1,beepstr);}
if(stat==set_time) disptime(time_total-1);
else disptime(cd);
}
void display(uc ddd,uc btd){
write728x(btd,szdm[ddd]);
}
void disptime(uc tms){
uc tmp;
tmp=hour[tms]/10;
display(tmp,7);
tmp=hour[tms]%10;
display(tmp,6);
display(10,5);
tmp=min[tms]/10;
display(tmp,4);
tmp=min[tms]%10;
display(tmp,3);
display(10,2);
tmp=sec[tms]/10;
display(tmp,1);
tmp=sec[tms]%10;
display(tmp,0);
if(stat==set_time){
if(current==0) tmp=0x3f;
if(current==1) tmp=0xe7;
if(current==2) tmp=0xfc;
write728x(0x10,tmp);
write728x(0x11,0xa0);}
else{write728x(0x10,0xff);}
}
void init(void){
uc tmp;
for(tmp=0;tmp<time_total;tmp++)
{
hour[tmp]=0;
min[tmp]=0;
sec[tmp]=0;
}
for(tmp=0;tmp<(time_total-global_dispte+1);tmp++)
{soo[tmp]=0;}
init_timer();
delayms(20);
init_lcd();
init_728x();
beep=0;
stat=global_dispts;
cd=global_dispts;
}
void init_728x(void){
write728x(0x12,0x98);//write728x(0x12,0x9c);
}
void init_timer(void){
TMOD=17;
TH0=216;
TL0=240;
ET0=1;
ET1=1;
EX1=1;
IT1=0;
TH1=216;
TL1=240;
ET1=1;
DIR=1;
E=0;
EA=1;
TR0=1;
TR1=0;
}
void init_lcd(void){
SW=0;
lcdreset();
}
void keyp(void)interrupt 2
{
sgn_g=read728x(0x13);
deal();
disp_c();
}
void waitforenable(void) {
DataPort=0xff;
RS=0;RW=1;_nop_();Elcm=0;_nop_();_nop_();
while(DataPort&Busy);
Elcm=1;
}
void lcdwritecommand(uc CMD,uc AttribC){
if (AttribC) waitforenable();
RS=0;RW=0;_nop_();Elcm=1;
DataPort=CMD;_nop_();
Elcm=0;_nop_();_nop_();Elcm=1;
}
void lcdwritedata(char dataW){
waitforenable();
RS=1;RW=0;_nop_();Elcm=1;
DataPort=dataW;_nop_();
Elcm=0;_nop_();_nop_();Elcm=1;
}
void lcdreset(void){
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,0);
delayms(10);
lcdwritecommand(0x38,1);
lcdwritecommand(0x08,1);
lcdwritecommand(0x01,1);
lcdwritecommand(0x06,1);
lcdwritecommand(0x0c,1);
}
void Disp_XY( char posx,char posy) {
uc temp_lcd;
temp_lcd=posx&0x0f;
posy&=0x1;
if (posx>15) temp_lcd |= 0x40;
if (posy==1) temp_lcd |=0x40;
temp_lcd |= 0x80;
lcdwritecommand(temp_lcd,0);
}
void disponechar(uc x,uc y,uc Wdata) {
Disp_XY(x,y);
lcdwritedata(Wdata);
}
void eputstr(uc x,uc y, uc code *ptr) {
uc i_lcd,l_lcd=0;
while (*ptr++ >0){l_lcd++;};
ptr=ptr-(l_lcd+1);
for (i_lcd=0;i_lcd<l_lcd;i_lcd++) { disponechar(x++,y,*ptr++);
if (31==x) {x=0;y^=0;}
}
}
void putc(uc x, uc y, uc d){
uc tmp1;uc tmp2;
tmp1=d/10;
tmp1+=48;
tmp2=d%10;
tmp2+=48;
disponechar(x,y,tmp1);
disponechar((x+1),y,tmp2);
}
void settime(void){
if(sgn_g==key_up){addt();}
if(sgn_g==key_down){mint();}
if(sgn_g==key_left)
{minc();}
if((sgn_g==key_right))
{addc();}
if(sgn_g==key_cancel)
{stat=noc;tuni[cd]=0;}
if(sgn_g==key_ok){
hour[cd]=hour[time_total-1];
min[cd]=min[time_total-1];
sec[cd]=sec[time_total-1];
if((cd-global_dispte+1)>=0)
soo[cd-global_dispte+1]=1;
stat=noc;
tuni[cd]=0;}
}
void deal(void){
if((sgn_g!=noc)&&(beep=1)){beep=0;}
if(stat==set_time)
settime();
else
{if(sgn_g==key_left)
minc();
if(sgn_g==key_right)
addc();
if(sgn_g==key_ok)
{stat=set_time;}
if(sgn_g==key_cancel)if ((area_alarm)||(area_sec)) {soo[cd-global_dispte+1]=0;}
}
sgn_g=noc;
}
void time0(void) interrupt 1//产生10MS精确定时
{
TH0=216;
TL0=240;
timeinc();
}
void timeind(uc r)
{
tuni[r]+=1;
if(100<=tuni[r])
{sec[r]+=1;tuni[r]=0;
if(60<=sec[r])
{min[r]+=1;sec[r]=0;
if(60<=min[r])
{hour[r]+=1;min[r]=0;
if(24<=hour[r])
{hour[r]=0;
}
}
}
}
}
void timeinc(void){
uc tmp=global_dispts;
for(tmp=global_dispts;tmp<(global_dispte+1);tmp++){
timeind(tmp);
}
for(tmp=global_dispte+1;tmp<(time_total-2);tmp++){
if(area_sec)
if(soo[tmp-global_dispte+1]==1)
timeind(tmp);
}
}