Single chip electronic perpetual calendar with lunar calendar display

Publisher:清新心情Latest update time:2020-08-05 Source: 51hei Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

                                                write_nyr(3,nian);

                                         temp=(nian)/10*16+(nian)%10; //Convert decimal into DCB code required by DS1302

                                                   write_1302(0x8e,0x00); //Allow writing, disable write protection

                                                   write_1302(0x8c,temp); //Write the adjusted year data BCD code to the year register 8cH in DS1302

                                                   write_1302(0x8e,0x80); //Open write protection

                                                write_1602com(yh+4);//Because the LCD mode is set to write data, the pointer automatically increases by one, so the cursor needs to return to its original position

                                                break;

                                                               

                                }

                        }

                }

        }

        if((setNZn!=0)&&(setn==0))

        {

                if(add==0) //up key

                {

                        delay(10);

                        if(add==0)

                        {

                                led1=0;

                                collection=0;


                            buzzer=0; //The buzzer beeps once

                            delay(20);

                            buzzer=1;

                                while(!add);

                                switch(setNZn)

                                {

                                        case 3:

                                                nz_miao++; //Press the setting key once to adjust the seconds

                                                if(nz_miao==60)

                                                        nz_miao=0; //When the seconds exceed 59, add 1 and return to zero

                                                write_sfm(14,nz_miao); //Let LCD display "plus" the set seconds in the correct position

                                                write_1602com(er+15);//Because the LCD mode is set to write data, the cursor automatically moves to the right, so you need to specify the return

                                                break;

                                        case 2:

                                                nz_fen++;

                                                if(nz_fen==60)

                                                        nz_fen=0;

                                                write_sfm(11,nz_fen); //Let LCD display the set "plus" data in the correct position

                                                write_1602com(er+12); //Because the LCD mode is set to write data, the pointer automatically increases by one, so here it is written back to the original position

                                                break;

                                        case 1:

                                                nz_shi++;

                                                if(nz_shi==24)

                                                        nz_shi=0;

                                                write_sfm(8,nz_shi); //Let LCD display the set hour data in the correct position

                                                write_1602com(er+9); //Because the LCD mode is set to write data, the pointer automatically increases by one, so the cursor needs to return to its original position

                                                break;

                                }

                        }

       

                }

                //------------------Decrease key dec, refer to the 'add key' comment for each sentence function---------------

                if(dec==0)

                {

                        delay(10); //Adjust delay to eliminate jitter

                        if(dec==0)

                        {

                                led1=0;

                                collection=0;


                            buzzer=0; //The buzzer beeps once

                            delay(20);

                            buzzer=1;

                                while(!dec);

                                switch(setNZn)

                                {

                                        case 3:

                                                nz_miao--;

                                                if(nz_miao==-1)

                                                        nz_miao=59; //When the second data is reduced to -1, it will automatically become 59

                                                write_sfm(14,nz_miao); //Display the new seconds after the change in the correct position of the LCD

                                                write_1602com(er+15);

                                                break;

                                        case 2:

                                                nz_fen--;

                                                if(nz_fen==-1)

                                                        nz_fen=59;

                                                write_sfm(11,nz_fen);

                                                write_1602com(er+12); //Because the LCD mode is set to write data, the pointer automatically increases by one, so here it is written back to the original position

                                                break;

       

                                        case 1:

                                                nz_shi--;

                                                  if(nz_shi==-1)

                                                nz_shi=23;

                                                write_sfm(8,nz_shi);

                                                write_1602com(er+9); //Because the LCD mode is set to write data, the pointer automatically increases by one, so the cursor needs to return to its original position

                                                break;

                                                               

                                }

                        }

                }

        }       

}


//-------------------------------

void init(void) //Timer and counter setting function

{

        TMOD=0x11; //Specify the working mode of the timer/counter as 3

        TH0=0; //The high four bits of timer T0 = 0

        TL0=0; //The lower four bits of timer T0 = 0

        TH1=0x3C;

        TL1=0xB0;

        EA=1; //The system allows open interrupts

        ET0=1; //Enable T0 interrupt

        ET1=1;

//        IT1=1;

//        IT0=0;

        PT1=1;

        PT0=0;

        TR0=1; // Enable interrupt and start timer

        TR1=0;

}



void InitialTimer2(void)

{

        T2CON  = 0x00;                        //16 Bit Auto-Reload Mode

        TH2 = RCAP2H = 0x3C; //Reload value, initial value TL2 = RCAP2L = 0x18;

        TL2 = RCAP2L = 0xB0;

        ET2=1; //Timer 2 interrupt enabled

        TR2 = 0; //Timer 2 starts

}

//*******************Main function***************************

//***************************************************

void main()

{

        ds1302_init(); //Call the DS1302 clock initialization subfunction

        init(); //Call the sub-function to set the timing counter

        lcd_init(); //Call the LCD screen initialization subfunction

        InitialTimer2();

        led=1; //Turn off the LCD backlight power


        while(1) //Infinite loop of the following statements:

        {               

                    keyscan(); //Call the keyboard scan subfunction

                led=led1;               

    }

}



void timer0() interrupt 1 //Get and display calendar and time

{

       

   //Init_DS18B20(); //Temperature sensor DS18b2 initialization subfunction, in the header file

// flag = ReadTemperature(); // Send the function result returned by running the 18b2 header file to the variable FLAG for display


  //Read the seven data of seconds, hours, minutes, days, months and years (the read register and write register of DS1302 are different):

       

    miao = BCD_Decimal(read_1302(0x81));

        fen = BCD_Decimal(read_1302(0x83));

        shi  = BCD_Decimal(read_1302(0x85));

        ri  = BCD_Decimal(read_1302(0x87));

        yue = BCD_Decimal(read_1302(0x89));

        nian=BCD_Decimal(read_1302(0x8d));


        if(NZK==1)

        {

                if((shi==nz_shi)&&(fen==nz_fen)&&(miao==0)) //Alarm time is up

                {

                    TR2=1;

                        timeron=1;

                }

                if((shi==nz_shi)&&(fen==(nz_fen+1)))

                {

                        TR2=0;

                        buzzer=1;

                        timeron=0;

                }

        }

       

        if(ZDK==1)

        {

                if((fen==0x00)&&(miao==0x00)&&(timeron==0))

                {

                        TR1=1;

                        shi = BCD_Decimal(read_1302(0x85));

……………………


[1] [2] [3] [4] [5] [6] [7] [8]
Reference address:Single chip electronic perpetual calendar with lunar calendar display

Previous article:51 MCU Proteus simulation 320x240TFT color screen
Next article:Microcontroller breathing light program and waveform demonstration

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号