機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
用c語言寫的一個時鬧鐘程序
用c語言寫的一個時鬧鐘程序
 更新時間:2008-7-26 16:16:20  點(diǎn)擊數(shù):4
【字體: 字體顏色

 用c語言寫的一個時鬧鐘程序

 單片機(jī)用16F877,主時鐘用20MHz,用32768作定時時間?梢詫(shí)現(xiàn)2路定鬧,每一路都可分別設(shè)置和開關(guān),采用4x4鍵盤,16x2的字符型LCD顯示。連線在程序開頭有說明。
 程序的功能:
 (1)上電后LCD背光打開,并顯示倒計時5秒,然后時鐘開始工作。
 (2)用模式鍵(*)切換模式,如顯示時間、日期、鬧鐘1、鬧鐘2等,并且可以用上、下鍵控制加1、減1或是鬧鐘的On、Off。
 (3)原程序有16個鍵,包括0~9數(shù)字鍵,可以直接輸入要設(shè)置的時間值,但后來將數(shù)字鍵取消了,你仍然可以通過修改程序的部分注釋恢復(fù)此功能。
 (4)鬧鐘有2路,時間到后鬧2分鐘,可按任意鍵取消本次鬧鐘。鬧鐘響時有2種音調(diào),是用PIC的PWM實(shí)現(xiàn)的。
 (5)按任意鍵可打開背光,1分鐘后自動關(guān)閉背光。
 (6)RA0~RA3為按鍵掃描輸入,應(yīng)接下拉電阻。

 

 主程序
 //    FileName:    Main.c
 //    MCU:        Microchip PIC16F877
 //    Tool:        CCS-C compiler
 //    Author:        KingEDA, MSN:kingeda@163.com, skype:kingeda, E-mail:kingeda@163.com
 //                Website: http://www.EDAKING.com
 //    Description:
 //    A timer program
 //    Ver    0.1:    2003-03-31, all clock function with date display, 2 way alarm.
 //    Ver 0.2:    2003-05-05, (1) Alarm default is on,modify alarm1 time to 7:00:00,
 //                            and alarm2 to 13:30:00.
 //                            (2) Backlight will be enabled when alarming.
 //                            (3) Automatic adjust day(28,30,31).
 //                            (4)    Automatic MOVe cursor to next location when set item.
 //    PIN Connection:
 //    RC0~1    :    32768Hz crystal
 //    RC2    :    Buzzer
 //    RC3 :    LCD Back Light,drive a PNP BJT
 //    RD0~RD7    :     to LCD DB0~DB7
 //    RA0~RA3    :     keypad col in
 //    RC4~RC7    :    keypad line out
 //            7    8    9    #
 //            4    5    6    ↑
 //            1    2    3    ↓
 //            0    ←    →    *
 //    RE0    :    LCD RS
 //    RE1    :    LCD    RW
 //    RE2    :    LCD    E

 #include "my16f877.h"
 #device ICD=true
 //#fuses    HS,NOWDT,NOPROTECT,PUT,BROWNOUT
 #use delay(clock = 24000000)
 //#use fast_io(C)
 #use fast_io(E)
 #define lcd_busy (lcd_read_addr()&0x80) == 0x80
 #define time_start_addr 0x80+0x04
 #define time_hourh_addr time_start_addr
 #define time_hourl_addr time_start_addr+1
 #define time_minuteh_addr time_start_addr+3
 #define time_minutel_addr time_start_addr+4
 #define time_secondh_addr time_start_addr+6
 #define time_secondl_addr time_start_addr+7
 #define key_0 0x11
 #define key_1 0x21
 #define key_2 0x22
 #define key_3 0x24
 #define key_4 0x41
 #define key_5 0x42
 #define key_6 0x44
 #define key_7 0x81
 #define key_8 0x82
 #define key_9 0x84
 #define key_left 0x12
 #define key_right 0x14
 #define key_up 0x48
 #define key_down 0x28
 #define key_mode 0x18
 #define key_cancel 0x88

 char StrPower1[]     = " *  Power on  * ";
 char StrSetTime[]    = " * Adjust time* ";
 char StrSetDate[]    = " * Adjust date* ";
 char StrAlarm1[]    = " * Set alarm 1* ";
 char StrAlarm2[]    = " * Set alarm 2* ";
 unsigned char PORTC_MAP;
 #bit    BackLightEn = PORTC_MAP.3
 unsigned char BackLightTimer;
 int1     led;
 #bit    lcd_rs = PORTE.0
 #bit    lcd_rw = PORTE.1
 #bit    lcd_e  = PORTE.2
 #byte    lcd_bus = PORTD
 #byte    lcd_dir = TRISD
 #define    PWM_on    0x0c
 #define    PWM_off    0x00
 #define    PWM_period    200
 #define PWM_DC    100
 unsigned char lcd_addr;
 unsigned char KeyLine;
 unsigned char KeyOld;
 unsigned char KeyNew;

 struct mTime {
    unsigned char hourh;    //    hour,0~23
    unsigned char hourl;
    unsigned char minuteh;    //    minute,0~59
    unsigned char minutel;
    unsigned char secondh;    //    second,0~59
    unsigned char secondl;
    };
 struct mTime CurrentTime = {1,2,0,0,0,0};
 struct mTime AlarmTime1 = {0,7,0,0,0,0};    //    07:00:00
 struct mTime AlarmTime2 = {1,3,3,0,0,0};    //    13:30:00
 unsigned char AlarmStatus;
 #bit Alarm1Enable = AlarmStatus.0
 #bit Alarm2Enable = AlarmStatus.1
 #bit Alarm1Alarm = AlarmStatus.2
 #bit Alarm2Alarm = AlarmStatus.3
 unsigned char Alarm1Cnt;    //    alarm1 second count
 unsigned char Alarm2Cnt;
 unsigned char CurrentMode;
 #define mode_time 0
 #define mode_set_time 1
 #define mode_set_date 2
 #define mode_set_alarm1 3
 #define mode_set_alarm2 4
 unsigned char adjust_item;
 struct mDate {
    unsigned char year1;    //
    unsigned char year2;
    unsigned char year3;
    unsigned char year4;
    unsigned char monthh;
    unsigned char monthl;
    unsigned char dayh;
    unsigned char dayl;
 };
 struct mDate CurrentDate = {2,0,0,3,0,1,0,1};
 unsigned char *pStr;

 //    -------------------------------------------------------
 unsigned char lcd_read_addr()
 {
    unsigned char ch;
    lcd_dir = 0xff;    //    read from lcd
    lcd_rs = 0;
    lcd_rw = 1;    //    inst
    lcd_e = 1;
    #asm
        nop
        nop
        nop
    #endasm
    ch = lcd_bus;
    lcd_e = 0;
    lcd_dir = 0x00; //  set write to lcd
    return ch;
 }

 //    -------------------------------------------------------
 unsigned char lcd_write_data(unsigned char ch)
 {
    while (lcd_busy)
    {    restart_wdt();    }
    lcd_rs = 1;    //    data
    lcd_rw = 0;    //    write
    lcd_bus = ch;    //    write out
    lcd_e = 1;
    #asm
        nop
        nop
        nop
    #endasm
    lcd_e = 0;
    return 'Y';
 }

 //    -------------------------------------------------------
 unsigned char lcd_write_inst(unsigned char ch)
 {
    while (lcd_busy)
    {    restart_wdt();    }
    lcd_rs = 0;    //    inst
    lcd_rw = 0;    //    write
    lcd_bus = ch;
    lcd_e = 1;
    #asm
        nop
        nop
        nop
    #endasm
    lcd_e = 0;
    return 'Y';
 }


 //    -------------------------------------------------------
 unsigned char lcd_read_data()
 {
    unsigned char ch;
    while (lcd_busy)
    {    restart_wdt();    }
    lcd_dir = 0xff;    //    read from lcd
    lcd_rs = 1;    //    data
    lcd_rw = 1;    //    read
    lcd_e = 1;
    #asm
        nop
        nop
        nop
    #endasm
    ch = lcd_bus;    //    read in
    lcd_e = 0;
    lcd_dir = 0x00; //  set write to lcd
    return ch;
 }

 //    -------------------------------------------------------
 void lcd_init()
 {
    unsigned char Tempch;
    lcd_addr = 0;
    delay_ms(100);
    Tempch = 0x38;    //    1-line mode,5x8 dots
    lcd_write_inst(Tempch);    //    Function set
    Tempch = 0x0f;    //    lcd on,cursor on,blink on
    lcd_write_inst(Tempch);    //    Display on/off
    Tempch = 0x06;    //    Increment mode,Entire shift off
    lcd_write_inst(Tempch);
    Tempch = 0x01;    //    clear display
    lcd_write_inst(Tempch);
    delay_ms(3);
 }

 //    -------------------------------------------------------
 //#int_timer1
 //void timer1_interrupt(void)
 #int_ccp2
 void ccp2_interrupt(void)
 {
    //TMR1H = 0x80;
    if (CurrentTime.secondl==9)
    {
        CurrentTime.secondl=0;
        if (CurrentTime.secondh==5)
        {
            CurrentTime.secondh=0;
            if (CurrentTime.minutel==9)
            {
                CurrentTime.minutel=0;
                if (CurrentTime.minuteh==5)
                {
                    CurrentTime.minuteh=0;
                    if (CurrentTime.hourl==9)
                    {
                        CurrentTime.hourl=0;
                        CurrentTime.hourh++;
                    }
                    else if((CurrentTime.hourl==3) && (CurrentTime.hourh==2))
                    {
                        CurrentTime.hourl=0;
                        CurrentTime.hourh=0;
                        if ((((CurrentDate.dayl == 8) || (CurrentDate.dayl == 9)) && (CurrentDate.dayh == 2) && (CurrentDate.monthl == 2) && (CurrentDate.monthh == 0)) ||
                            ((CurrentDate.dayl == 0) && (CurrentDate.dayh == 3) && ((((CurrentDate.monthl == 4) || (CurrentDate.monthl == 6)
                                || (CurrentDate.monthl == 9)) && (CurrentDate.monthh == 0)) || ((CurrentDate.monthl == 1) && (CurrentDate.monthh == 1)))) ||
                            ((CurrentDate.dayl == 1) && (CurrentDate.dayh == 3)))
                        {
                            CurrentDate.dayl=1;
                            CurrentDate.dayh=0;
                            if ((CurrentDate.monthl == 2) && (CurrentDate.monthh == 1))
                            {
                                CurrentDate.monthl = 1;
                                CurrentDate.monthh = 0;
                                if (CurrentDate.year4 == 9)
                                {
                                    CurrentDate.year4 = 0;
                                    if (CurrentDate.year3 == 9)
                                    {
                                        CurrentDate.year3 = 0;
                                        if (CurrentDate.year2 == 9)
                                        {
                                            CurrentDate.year2 = 0;
                                            CurrentDate.year1++;
                                        }
                                        else
                                            CurrentDate.year2++;
                                    }
                                    else
                                        CurrentDate.year3++;
                                }
                                else
                                    CurrentDate.year4++;
                            }
                            else if(CurrentDate.monthl == 9)
                            {
                                CurrentDate.monthl = 0;
                                CurrentDate.monthh++;
                            }
                            else
                                CurrentDate.monthl++;
                        }
                        else if(CurrentDate.dayl == 9)
                        {
                            CurrentDate.dayl=0;
                            CurrentDate.dayh++;
                        }
                        else
                            CurrentDate.dayl++;
                    }
                    else
                        CurrentTime.hourl++;
                }
                else
                    CurrentTime.minuteh++;
            }
            else
                CurrentTime.minutel++;
        }
        else
            CurrentTime.secondh++;
    }
    else
        CurrentTime.secondl++;
    if ((Alarm1Alarm == false) & (Alarm2Alarm == false))
    {
        led = 0;
        CCP1CON = PWM_off;
    }
    else
    {
        if (led == 1)
        {
            led = 0;
            PR2 = PWM_period;    //    set pwm period
            CCPR1L = PWM_DC;    //    set pwm duty cycle
            //CCP1CON = PWM_on;
        }
        else
        {
            led = 1;
            PR2 = PWM_period/2;    //    set pwm period
            CCPR1L = PWM_DC/2;    //    set pwm duty cycle
            //CCP1CON = PWM_off;
        }
    }
    Alarm1Cnt++;
    Alarm2Cnt++;
    if (BackLightEn == 0)
        if (((BackLightTimer++)>=60) & (Alarm1Alarm == false) & (Alarm1Alarm == false))
            BackLightEn = 1;    //    disable backlight
    PORTC = PORTC_MAP;
    //TMR1IF = 0;
    //PIR1 = PIR2 = 0x00;
    CCP2IF = 0;
 }

 //    -------------------------------------------------------
 unsigned char get_key(void)
 {
    unsigned char key_in,tmp;
    TRISC = 0x03;
    KeyLine = 0xf0;
    PORTC = KeyLine | PORTC_MAP;
    #asm
        nop
        nop
        nop
    #endasm
    if ((PORTA & 0x0f) != 0)
    {
        tmp = 0x10;
        for (KeyLine = tmp;KeyLine!=0;KeyLine = tmp)
        {
            PORTC = KeyLine | PORTC_MAP;
            tmp = KeyLine <<1;
            #asm
                nop
                nop
                nop
            #endasm
            key_in = PORTA & 0x0f;
            if (key_in != 0)
            {
                return (key_in | KeyLine);
            }
        }
        return 0;
    }
    else
        return 0;
 }

 //    -------------------------------------------------------
 void set_mode(void)
 {
    if (CurrentMode == mode_set_alarm2)
        CurrentMode = mode_time;
    else
    {
        CurrentMode++;
        adjust_item = 0;
    }
    lcd_write_inst(0x01);    //    clear LCD display
    lcd_write_inst(time_start_addr);    //    set LCD line1
    if (CurrentMode == mode_set_time)
    {
        lcd_write_data(CurrentTime.hourh + '0');
        lcd_write_data(CurrentTime.hourl + '0');
        lcd_write_data(':');
        lcd_write_data(CurrentTime.minuteh + '0');
        lcd_write_data(CurrentTime.minutel + '0');
        lcd_write_data(':');
        lcd_write_data(CurrentTime.secondh + '0');
        lcd_write_data(CurrentTime.secondl + '0');
        pStr = StrSetTime;
    }
    else if(CurrentMode == mode_set_date)
    {
        lcd_write_data(CurrentDate.year1 + '0');
        lcd_write_data(CurrentDate.year2 + '0');
        lcd_write_data(CurrentDate.year3 + '0');
        lcd_write_data(CurrentDate.year4 + '0');
        lcd_write_data('/');
        lcd_write_data(CurrentDate.monthh + '0');
        lcd_write_data(CurrentDate.monthl + '0');
        lcd_write_data('/');
        lcd_write_data(CurrentDate.dayh + '0');
        lcd_write_data(CurrentDate.dayl + '0');
        pStr = StrSetDate;
    }
    else if(CurrentMode == mode_set_alarm1)
    {
        lcd_write_data(AlarmTime1.hourh + '0');
        lcd_write_data(AlarmTime1.hourl + '0');
        lcd_write_data(':');
        lcd_write_data(AlarmTime1.minuteh + '0');
        lcd_write_data(AlarmTime1.minutel + '0');
        lcd_write_data(':');
        lcd_write_data(AlarmTime1.secondh + '0');
        lcd_write_data(AlarmTime1.secondl + '0');
        lcd_write_data(' ');
        lcd_write_data('O');
        if (Alarm1Enable)
        {
            lcd_write_data('n');
        }
        else
        {
            lcd_write_data('f');
            lcd_write_data('f');
        }
        pStr = StrAlarm1;
        Alarm1Cnt =0;
    }
    else if(CurrentMode == mode_set_alarm2)
    {
        lcd_write_data(AlarmTime2.hourh + '0');
        lcd_write_data(AlarmTime2.hourl + '0');
        lcd_write_data(':');
        lcd_write_data(AlarmTime2.minuteh + '0');
        lcd_write_data(AlarmTime2.minutel + '0');
        lcd_write_data(':');
        lcd_write_data(AlarmTime2.secondh + '0');
        lcd_write_data(AlarmTime2.secondl + '0');
        lcd_write_data(' ');
        lcd_write_data('O');
        if (Alarm2Enable)
        {
            lcd_write_data('n');
        }
        else
        {
            lcd_write_data('f');
            lcd_write_data('f');
        }
        pStr = StrAlarm2;
        Alarm2Cnt = 0;
    }
    lcd_write_inst(0xc0);    //    set LCD line2
    if (CurrentMode != mode_time)
    {
        for (;*pStr!=0;pStr++)
        {                        //    write hint message
            lcd_write_data(*pStr);
        }
        lcd_write_inst(0x0f);    //    LCD cursor on
        lcd_write_inst(time_start_addr);    //    MOVe cursor to start
    }
    else    //    time mode,write date to second line
    {
        lcd_write_inst(0x0c);        //    LCD sursor off
 /*        lcd_write_inst(0xc0 + 3);    //    set date start address
        lcd_write_data(CurrentDate.year1 + '0');
        lcd_write_data(CurrentDate.year2 + '0');
        lcd_write_data(CurrentDate.year3 + '0');
        lcd_write_data(CurrentDate.year4 + '0');
        lcd_write_data('/');
        lcd_write_data(CurrentDate.monthh + '0');
        lcd_write_data(CurrentDate.monthl + '0');
        lcd_write_data('/');
        lcd_write_data(CurrentDate.dayh + '0');
        lcd_write_data(CurrentDate.dayl + '0');
 */  }
    if (CurrentMode == mode_set_time)
    {
        lcd_write_inst(time_start_addr);    //    MOVe cursor to start
    }
    else if (CurrentMode == mode_set_date)
    {
        lcd_write_inst(time_start_addr);    //    MOVe cursor to start
    }
    else if (CurrentMode == mode_set_alarm1)
    {
        lcd_write_inst(time_secondl_addr+3);
        adjust_item = 6;
    }
    else if (CurrentMode == mode_set_alarm2)
    {
        lcd_write_inst(time_secondl_addr+3);
        adjust_item = 6;
    }
    else
    {
        lcd_write_inst(0x0c);    //    LCD cursor off
    }
 }


 //    -------------------------------------------------------
 void set_date(void)
 {
    if (adjust_item == 0)    //    adjust year
    {
        if ((KeyNew >=0) & (KeyNew <= 9))
        {
            CurrentDate.year1 = KeyNew;
            lcd_write_data(CurrentDate.year1 + '0');
            //lcd_write_inst(time_start_addr);
            adjust_item ++;
        }
        else if (KeyNew == key_left)
        {
            adjust_item = 7;
            lcd_write_inst(time_start_addr + 9);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 1);
        }
    }
    else if(adjust_item == 1)
    {
        if ((KeyNew >=0) & (KeyNew <= 9))
        {
            CurrentDate.year2 = KeyNew;
            lcd_write_data(CurrentDate.year2 + '0');
            //lcd_write_inst(time_start_addr + 1);
            adjust_item ++;
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 0);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 2);
        }
    }
    else if(adjust_item == 2)
    {
        if ((KeyNew >=0) & (KeyNew <= 9))
        {
            CurrentDate.year3 = KeyNew;
            lcd_write_data(CurrentDate.year3 + '0');
            //lcd_write_inst(time_start_addr + 2);
            adjust_item ++;
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 1);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 3);
        }
    }
    else if(adjust_item == 3)
    {
        if ((KeyNew >=0) & (KeyNew <= 9))
        {
            CurrentDate.year4 = KeyNew;
            lcd_write_data(CurrentDate.year4 + '0');
            //lcd_write_inst(time_start_addr + 3);
            adjust_item ++;
            lcd_write_inst(time_start_addr + 5);
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 2);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 5);
        }
    }
    else if(adjust_item == 4)
    {
        if (((CurrentDate.monthl>2) & (KeyNew == 0)) | ((CurrentDate.monthl == 0) & (KeyNew == 1))
            | (((CurrentDate.monthl == 1) | (CurrentDate.monthl == 2)) & (KeyNew <2)))
        {
            CurrentDate.monthh = KeyNew;
            lcd_write_data(CurrentDate.monthh + '0');
            //lcd_write_inst(time_start_addr + 5);
            adjust_item ++;
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 3);
        }
        else if (KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 6);
        }
    }
    else if(adjust_item == 5)
    {
        if (((CurrentDate.monthh == 3) & (KeyNew <2)) | ((CurrentDate.monthh != 3) & (KeyNew >=0) & (KeyNew <=9)))
        {
            CurrentDate.monthl = KeyNew;
            lcd_write_data(CurrentDate.monthl + '0');
            //lcd_write_inst(time_start_addr + 6);
            adjust_item ++;
            lcd_write_inst(time_start_addr + 8);
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 5);
        }
        else if (KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 8);
        }
    }
    else if(adjust_item == 6)
    {
        if (((CurrentDate.dayl>1) & ((KeyNew == 1) | (KeyNew == 2))) | ((CurrentDate.dayl == 0) & (KeyNew >0) & (KeyNew<4))
            | ((CurrentDate.dayl == 1) & (KeyNew <4)))
        {
            CurrentDate.dayh = KeyNew;
            lcd_write_data(CurrentDate.dayh + '0');
            //lcd_write_inst(time_start_addr + 8);
            adjust_item ++;
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 6);
        }
        else if (KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_start_addr + 9);
        }
    }
    else if(adjust_item == 7)
    {
        if (((CurrentDate.dayh == 3) & (KeyNew <2)) | ((CurrentDate.dayh != 3) & (KeyNew >=0) & (KeyNew <=9)))
        {
            CurrentDate.dayl = KeyNew;
            lcd_write_data(CurrentDate.dayl + '0');
            //lcd_write_inst(time_start_addr + 9);
            adjust_item ++;
            lcd_write_inst(time_start_addr + 0);
        }
        else if (KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_start_addr + 8);
        }
        else if (KeyNew == key_right)
        {
            adjust_item = 0;
            lcd_write_inst(time_start_addr + 0);
        }
    }
 }

 //    -------------------------------------------------------
 void set_time(void)
 {
    if (adjust_item == 0)    //    set hourh
    {
        if (((CurrentTime.hourl <4) & (KeyNew < 3)) | ((CurrentTime.hourl >3) & (KeyNew <2)))
        {
            CurrentTime.hourh = KeyNew;
            lcd_write_data(CurrentTime.hourh + '0');    //    refresh hourh
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item = 5;
            lcd_write_inst(time_secondl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_hourl_addr);
        }
    }
    else if (adjust_item == 1) //    set hourl
    {
        if (((CurrentTime.hourh == 2) & (KeyNew < 4)) | ((CurrentTime.hourh < 2) & (KeyNew <=9)))
        {
            CurrentTime.hourl = KeyNew;
            lcd_write_data(CurrentTime.hourl + '0');    //    refresh hourl
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
    }
    else if (adjust_item == 2)    //    set minuteh
    {
        if (KeyNew <6)
        {
            CurrentTime.minuteh = KeyNew;
            lcd_write_data(CurrentTime.minuteh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minutel_addr);
        }
    }
    else if (adjust_item == 3)    //    set minutel
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            CurrentTime.minutel = KeyNew;
            lcd_write_data(CurrentTime.minutel + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
    }
    else if (adjust_item == 4)    //    set secondh
    {
        if (KeyNew <6)
        {
            CurrentTime.secondh = KeyNew;
            lcd_write_data(CurrentTime.secondh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
  &nb, sp;         lcd_write_inst(time_minutel_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondl_addr);
        }
    }
    else if (adjust_item == 5)    //    set secondl
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            CurrentTime.secondl = KeyNew;
            lcd_write_data(CurrentTime.secondl + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
        }
    }
 }

 //    -------------------------------------------------------
 void set_alarm1(void)
 {
    if (adjust_item == 0)    //    set hourh
    {
        if (((AlarmTime1.hourl <4) & (KeyNew < 3)) | ((AlarmTime1.hourl >3) & (KeyNew <2)))
        {
            AlarmTime1.hourh = KeyNew;
            lcd_write_data(AlarmTime1.hourh + '0');    //    refresh hourh
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item = 6;
            lcd_write_inst(time_secondl_addr + 3);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_hourl_addr);
        }
    }
    else if (adjust_item == 1) //    set hourl
    {
        if (((AlarmTime1.hourh == 2) & (KeyNew < 4)) | ((AlarmTime1.hourh < 2) & (KeyNew <=9)))
        {
            AlarmTime1.hourl = KeyNew;
            lcd_write_data(AlarmTime1.hourl + '0');    //    refresh hourl
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
    }
    else if (adjust_item == 2)    //    set minuteh
    {
        if (KeyNew <6)
        {
            AlarmTime1.minuteh = KeyNew;
            lcd_write_data(AlarmTime1.minuteh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minutel_addr);
        }
    }
    else if (adjust_item == 3)    //    set minutel
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            AlarmTime1.minutel = KeyNew;
            lcd_write_data(AlarmTime1.minutel + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
    }
    else if (adjust_item == 4)    //    set secondh
    {
        if (KeyNew <6)
        {
            AlarmTime1.secondh = KeyNew;
            lcd_write_data(AlarmTime1.secondh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_minutel_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondl_addr);
        }
    }
    else if (adjust_item == 5)    //    set secondl
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            AlarmTime1.secondl = KeyNew;
            lcd_write_data(AlarmTime1.secondl + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_secondl_addr+3);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondl_addr+3);
        }
    }
    else if (adjust_item == 6)    //    set on/off
    {
        if ((KeyNew == key_up) | (KeyNew == key_down))
        {
            if (Alarm1Enable)
            {
                Alarm1Enable =false;    //    disable alarm1
                lcd_write_data('f');
                lcd_write_data('f');
            }
            else
            {
                Alarm1Enable =true;        //    enable alarm1
                lcd_write_data('n');
                lcd_write_data(' ');
            }
            //lcd_write_inst(time_secondl_addr+3);
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
            Alarm1Cnt = 0;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_secondl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
        }
    }

 }

 //    -------------------------------------------------------
 void set_alarm2(void)
 {
    if (adjust_item == 0)    //    set hourh
    {
        if (((AlarmTime2.hourl <4) & (KeyNew < 3)) | ((AlarmTime2.hourl >3) & (KeyNew <2)))
        {
            AlarmTime2.hourh = KeyNew;
            lcd_write_data(AlarmTime2.hourh + '0');    //    refresh hourh
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item = 6;
            lcd_write_inst(time_secondl_addr+3);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_hourl_addr);
        }
    }
    else if (adjust_item == 1) //    set hourl
    {
        if (((AlarmTime2.hourh == 2) & (KeyNew < 4)) | ((AlarmTime2.hourh < 2) & (KeyNew <=9)))
        {
            AlarmTime2.hourl = KeyNew;
            lcd_write_data(AlarmTime2.hourl + '0');    //    refresh hourl
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minuteh_addr);
        }
    }
    else if (adjust_item == 2)    //    set minuteh
    {
        if (KeyNew <6)
        {
            AlarmTime2.minuteh = KeyNew;
            lcd_write_data(AlarmTime2.minuteh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_hourl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_minutel_addr);
        }
    }
    else if (adjust_item == 3)    //    set minutel
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            AlarmTime2.minutel = KeyNew;
            lcd_write_data(AlarmTime2.minutel + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_minuteh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondh_addr);
        }
    }
    else if (adjust_item == 4)    //    set secondh
    {
        if (KeyNew <6)
        {
            AlarmTime2.secondh = KeyNew;
            lcd_write_data(AlarmTime2.secondh + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_minutel_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondl_addr);
        }
    }
    else if (adjust_item == 5)    //    set secondl
    {
        if ((KeyNew >=0) & (KeyNew <=9))
        {
            AlarmTime2.secondl = KeyNew;
            lcd_write_data(AlarmTime2.secondl + '0');
            //lcd_write_inst(0x10);    //    MOVe cursor back
            adjust_item ++;
            lcd_write_inst(time_secondl_addr+3);
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_secondh_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item ++;
            lcd_write_inst(time_secondl_addr+3);
        }
    }
    else if (adjust_item == 6)    //    set on/off
    {
        if ((KeyNew == key_up) | (KeyNew == key_down))
        {
            if (Alarm2Enable)
            {
                Alarm2Enable =false;    //    disable alarm2
                lcd_write_data('f');
                lcd_write_data('f');
            }
            else
            {
                Alarm2Enable =true;        //    enable alarm2
                lcd_write_data('n');
                lcd_write_data(' ');
            }
            //lcd_write_inst(time_secondl_addr+3);
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
            Alarm2Cnt = 0;
        }
        else if(KeyNew == key_left)
        {
            adjust_item --;
            lcd_write_inst(time_secondl_addr);
        }
        else if(KeyNew == key_right)
        {
            adjust_item = 0;
            lcd_write_inst(time_hourh_addr);
        }
    }

 }

 //    -------------------------------------------------------
 void main(void)
 {
    unsigned char cnt;
    TRISC = 0x03;    //    PORTC.3 drive led,low active
    PORTC_MAP = 0x00;
    led = 0;
    BackLightEn = 0;
    BackLightTimer = 0;
    PORTC = PORTC_MAP;
    TRISA = 0xff;    //    low half byte as keyscan in
    TRISE = 0x00;
    ADCON0 = 0x00;
    ADCON1 = 0x06;    //    all digital I/Os
    lcd_init();
    INTCON = 0x00;
    lcd_write_inst(0x80);    //    set lcd ddram address
    for (pStr = StrPower1;*pStr!=0;pStr++)
    {
        lcd_write_data(*pStr);
    }
    lcd_write_inst(0x0c);        //    LCD cursor off
    PIR1 = PIR2 = 0x00;
    T1CON = 0x0f;    //    T1CON:    -- T1CKPS1 T1CPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
    TMR1H = 0x80;
    TMR1L = 0x00;
    TMR1IF = 0;
    CCPR2H = 0x7f;
    CCPR2L = 0xff;
    CCP2CON = 0x0b;    //    compare mode,set ccp2if,reset tmr1
    CCP2IF = 0;
    for (cnt=5;cnt>0;cnt--)    //    test for 5sec.
    {
        lcd_write_inst(0xc0+8);    //    set LCD adress
        lcd_write_data(cnt + '0');
        while (CCP2IF == 0)    //    wait for timer1 overflow
        {
            restart_wdt();
        }
        //TMR1H = 0x80;
        CCP2IF = 0;
    }
    //    write current date to lcd line 2
    lcd_write_inst(0x01);        //    clear LCD display
    lcd_write_inst(0xc0+3);        //    set LCD line2
    lcd_write_data(CurrentDate.year1 + '0');
    lcd_write_data(CurrentDate.year2 + '0');
    lcd_write_data(CurrentDate.year3 + '0');
    lcd_write_data(CurrentDate.year4 + '0');
    lcd_write_data('/');
    lcd_write_data(CurrentDate.monthh + '0');
    lcd_write_data(CurrentDate.monthl + '0');
    lcd_write_data('/');
    lcd_write_data(CurrentDate.dayh + '0');
    lcd_write_data(CurrentDate.dayl + '0');
    Alarm1Enable = true;    //false;
    Alarm2Enable = true;    //false;
    INTCON = 0xc0;    //    set GIE & PEIE
    //TMR1IE = 1;        //    enable timer1 interrupt
    CCP2IE = 1;            //    enable ccp2 interrupt
    CurrentMode = mode_time;
    Alarm1Cnt = Alarm2Cnt = 0;
    T2CON = 0x07;    //    T2CON: - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
                    //    timer2 enable,prescaler = 16
    PR2 = PWM_period;    //    set pwm period
    CCPR1L = PWM_DC;    //    set pwm duty cycle
    CCP1CON = PWM_off;
    while(1)
    {
        restart_wdt();
        KeyOld = get_key();
        delay_ms(20);
        KeyNew = get_key();
        if (((KeyNew & 0x0f) != 0x00) & (KeyNew == KeyOld))
        {                            //    some key pressed
            if (BackLightEn == 1)    //    back light not on
            {
                BackLightEn = 0;        //    enable back-light
                BackLightTimer = 0;        //    start delay counter
            }
            else
            {
                if (KeyNew == key_0)
                    KeyNew = 0;
                else if(KeyNew == key_1)
                    KeyNew = 1;
                else if(KeyNew == key_2)
                    KeyNew = 2;
                else if(KeyNew == key_3)
                    KeyNew = 3;
                else if(KeyNew == key_4)
                    KeyNew = 4;
                else if(KeyNew == key_5)
                    KeyNew = 5;
                else if(KeyNew == key_6)
                    KeyNew = 6;
                else if(KeyNew == key_7)
                    KeyNew = 7;
                else if(KeyNew == key_8)
                    KeyNew = 8;
                else if(KeyNew == key_9)
                    KeyNew = 9;
                else if (KeyNew == key_mode)        //    MODE key pressed
                    set_mode();
                else if (KeyNew == key_cancel)        //    cancel buzzy
                {
                    led = 0;
                    CCP1CON = PWM_off;
                    BackLightEn = 1;
                    BackLightTimer = 0;
                }
                if (CurrentMode == mode_set_time)
                {
                    set_time();
                }
                else if (CurrentMode == mode_set_date)
                {
                    set_date();
                }
                else if (CurrentMode == mode_set_alarm1)
                {
                    set_alarm1();
                }
                else if (CurrentMode == mode_set_alarm2)
                {
                    set_alarm2();
                }
            }
            do        //    wait for key released
            {
                delay_ms(30);
                KeyNew = get_key();
                restart_wdt();
                BackLightTimer = 0;        //    key pressed yet
            }while ((KeyNew& 0x0f) != 0x00);
            KeyOld = KeyNew = 0x00;
        }
        if ((CurrentMode == mode_set_time) | (CurrentMode == mode_time))
        {    //    refresh time display,bacause int_timer1 dosn't do this
            lcd_addr = lcd_read_addr() & 0x7f;    //    save cursor location
               lcd_write_inst(time_start_addr);    //    set LCD line1
            lcd_write_data(CurrentTime.hourh + '0');
            lcd_write_data(CurrentTime.hourl + '0');
            lcd_write_data(':');
            lcd_write_data(CurrentTime.minuteh + '0');
            lcd_write_data(CurrentTime.minutel + '0');
            lcd_write_data(':');
            lcd_write_data(CurrentTime.secondh + '0');
            lcd_write_data(CurrentTime.secondl + '0');
            lcd_write_inst(lcd_addr | 0x80);            //    resume cursor location
        }
        if (CurrentMode == mode_time)
        {    //    refresh date display
            lcd_addr = lcd_read_addr() & 0x7f;    //    save cursor location
            lcd_write_inst(0xc0 + 3);            //    set LCD line2
            lcd_write_data(CurrentDate.year1 + '0');
            lcd_write_data(CurrentDate.year2 + '0');
            lcd_write_data(CurrentDate.year3 + '0');
            lcd_write_data(CurrentDate.year4 + '0');
            lcd_write_data('/');
            lcd_write_data(CurrentDate.monthh + '0');
            lcd_write_data(CurrentDate.monthl + '0');
            lcd_write_data('/');
            lcd_write_data(CurrentDate.dayh + '0');
            lcd_write_data(CurrentDate.dayl + '0');
            lcd_write_inst(lcd_addr | 0x80);            //    resume cursor location
        }
        if (Alarm1Enable)
        {
            if  ((AlarmTime1.hourh == CurrentTime.hourh) & (AlarmTime1.hourl == CurrentTime.hourl)
                 & (AlarmTime1.minuteh == CurrentTime.minuteh) & (AlarmTime1.minutel == CurrentTime.minutel)
                 & (AlarmTime1.secondh == CurrentTime.secondh) & (AlarmTime1.secondl == CurrentTime.secondl))
             {
                 Alarm1Alarm = true;
                 CCP1CON = PWM_on;
                 BackLightEn = 0;
             }
            if (Alarm1Cnt > 120)    //    two minutes
            {
                Alarm1Alarm = false;
                Alarm1Cnt = 0;
                BackLightEn = 1;
                BackLightTimer = 0;
            }
        }
        else
        {
            Alarm1Alarm = false;
            Alarm1Cnt = 0;
        }
        if (Alarm2Enable)
        {
            if  ((AlarmTime2.hourh == CurrentTime.hourh) & (AlarmTime2.hourl == CurrentTime.hourl)
                 & (AlarmTime2.minuteh == CurrentTime.minuteh) & (AlarmTime2.minutel == CurrentTime.minutel)
                 & (AlarmTime2.secondh == CurrentTime.secondh) & (AlarmTime2.secondl == CurrentTime.secondl))
             {
                 Alarm2Alarm = true;
                 CCP1CON = PWM_on;
                 BackLightEn = 0;
             }
             if (Alarm2Cnt > 120)    //    two minutes
             {
                 Alarm2Alarm = false;
                 Alarm2Cnt = 0;
                 BackLightEn = 1;
                 BackLightTimer = 0;
             }
         }
        else
        {
            Alarm2Alarm = false;
            Alarm2Cnt = 0;
        }
    }
 }

  • 上一篇: PIC16C71/PIC16C84單片機(jī)應(yīng)用中問題和對策
  • 下一篇: pic單片機(jī)軟件解碼
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1