找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2861|回復(fù): 0
收起左側(cè)

單片機(jī)萬(wàn)年歷+DS3231+ds18b20溫度傳感器+有字庫(kù)12864液晶顯示

[復(fù)制鏈接]
ID:400245 發(fā)表于 2020-5-9 15:05 | 顯示全部樓層 |閱讀模式
/*---------------------------------------------------------------------------

        
/*-------------------------------頭文件---------------------------------------*/
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
#include "LCD12864.h"
#include "DS3231.h"
#include "nongli.h"
#include "displaytime.h"
#include "dashuzi.h"
const char chHex[16] = "0123456789ABCDEF";
/********************************************************************************************************************
  以下為GPS部分定義 (如果純?yōu)轱@示GPS信息只需要定義變量RsBuf[80]就夠了,兩個(gè)結(jié)構(gòu)體可以不要,邊解析邊顯示  )
********************************************************************************************************************/
//串口中斷需要的變量
uchar seg_count;             /**  逗號(hào)計(jì)數(shù)器 **/
uchar byte_count;            /**  位數(shù)計(jì)數(shù)器 **/
uchar mode;                  /**  0:結(jié)束模式,1:命令模式,2:數(shù)據(jù)模式  **/
uchar buf_full;              /**  1:整句接收完成,相應(yīng)數(shù)據(jù)有效。0:緩存數(shù)據(jù)無(wú)效  **/
typedef xdata struct
{
    uchar TIME[10];
    uchar VA[2];  
    uchar WD[11];
    uchar WDNS[2];
    uchar JD[12];
    uchar JDWE[2];
    uchar DATE[9];   
} GPS_GPRMC;
GPS_GPRMC  gps;
typedef xdata struct    /** 作時(shí)區(qū)轉(zhuǎn)換時(shí)需要用到年、月、日進(jìn)一 **/
{
    uchar Hour;
    uchar Min;
    uchar Sec;
    uchar Day;
    uchar Mon;
    uchar Year;
} TIMER;
TIMER Timer;
char idata RsBuf[80];     /**  全局變量 **/
void InitBps();      /**  串口初始化 **/
void UTCToLocal(TIMER *GPS_DataTmp);
/****   以上為GPS部分定義  ***************************************************/
/*--------------------定義按鍵-----------------------------------------------*/
sbit K1  = P1 ^ 6; //K1-進(jìn)入設(shè)置;GPS模式下為強(qiáng)制校時(shí)
sbit K2  = P1 ^ 5; //K2-調(diào)時(shí)模式下為 加
sbit K3  = P1 ^ 3; //K3-調(diào)時(shí)模式下為 減;運(yùn)行模式下為背景燈控制
sbit K4  = P1 ^ 4; //K4-調(diào)時(shí)模式下為 確認(rèn)、返回  ;運(yùn)行模式下為DS3231與GPS運(yùn)行界面切換
sbit BLK = P2 ^ 3; //液晶背光控制輸出,低電平有效,PNP三極管控制。
sbit Bell_Out  = P1 ^ 7;
/*---------------------函數(shù)聲明------------------------------*/
void DelayM(uint);
void Delay(int);
void ds_w(void);
void GetDS3231(void);
void Conver_week(uchar year, uchar month, uchar day);
/*-----------------------------定義全局變量------------------------------*/
bit q = 0, w = 0; //調(diào)時(shí)標(biāo)志位
uchar yy, mo, dd, xq, hh, mm, ss, month_moon, day_moon, week, tiangan, dizhi, moontemp1, moontemp2; //定義時(shí)間映射全局變量(專(zhuān)用寄存器)
signed char address, item, max, mini;
/*-----------------------------延時(shí)函數(shù) 1MS/次-------------------------------*/
void DelayM(uint a)
{
    uchar i;
    while( --a != 0)
    {
        for(i = 0; i < 125; i++);
    }
}
/*-----------------------------日期、時(shí)間設(shè)置函數(shù)-----------------------------*/
void tiaozheng(void)
{
    yy = read_random(DS3231_YEAR);  
    mo = read_random(DS3231_MONTH);
    dd = read_random(DS3231_DAY);
    week = read_random(DS3231_WEEK);
    lcm_w_test(0, 0x80);
    lcm_w_word("20");           //顯示內(nèi)容字符20
    lcm_w_test(1, yy / 10 + 0x30);  //函數(shù)參數(shù)1,代表本行寫(xiě)數(shù)據(jù),YY/10+0X30得出年十位數(shù)字的顯示碼地址,送顯示
    lcm_w_test(1, yy % 10 + 0x30);  
    lcm_w_word("年");
    lcm_w_test(1, mo / 10 + 0x30);
    lcm_w_test(1, mo % 10 + 0x30);   
    lcm_w_word("月");             //調(diào)用字符顯示函數(shù),顯示文字 月
    lcm_w_test(1, dd / 10 + 0x30);
    lcm_w_test(1, dd % 10 + 0x30);  
    lcm_w_word("日");           //顯示字符 日
    if(read_random(DS3231_HOUR) != hh)   //如果程序中的小時(shí)與1302芯片中的不同,
    {
        hh = read_random(DS3231_HOUR);   //刷新程序中的小時(shí)數(shù)據(jù)
    }
    lcm_w_test(0, 0x91);         //第一個(gè)參數(shù)0,表示本行寫(xiě)入LCM的是指令,指定顯示位置88H(第三行左端)
    lcm_w_test(1, (hh / 10) + 0x30); //顯示十位
    lcm_w_test(1, hh % 10 + 0x30);  //顯示個(gè)位
    lcm_w_word("時(shí)");
    if(read_random(DS3231_MINUTE) != mm)   //如果1302芯片中的分鐘數(shù)據(jù)與程序中的分鐘變量不相等
    {
        mm = read_random(DS3231_MINUTE) ;  //刷新程序中的分鐘數(shù)據(jù)
    }
    lcm_w_test(1, (mm / 10) + 0x30);  //向液晶寫(xiě)數(shù)據(jù),顯示分鐘的十位數(shù)
    lcm_w_test(1, mm % 10 + 0x30);   //向液晶寫(xiě)數(shù)據(jù),顯示分鐘的個(gè)位數(shù)
    lcm_w_word("分");
    if(read_random(DS3231_SECOND) != ss)    //如果1302芯片中的分鐘數(shù)據(jù)與程序中的秒鐘變量不相等
    {
        ss = read_random(DS3231_SECOND);   //刷新程序中的秒鐘數(shù)據(jù)
    }
    lcm_w_test(1, (ss / 10) + 0x30);  //向液晶寫(xiě)數(shù)據(jù),顯示分鐘的十位數(shù)
    lcm_w_test(1, ss % 10 + 0x30);   //向液晶寫(xiě)數(shù)據(jù),顯示分鐘的個(gè)位數(shù)
    lcm_w_word("秒");
}
/**********************************************************************************************************/
//調(diào)整時(shí)間子函數(shù),設(shè)置鍵、數(shù)據(jù)范圍、上調(diào)加一,下調(diào)減一功能。
void Set_time(unsigned char sel)  //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫(xiě)入DS1302,函數(shù)參數(shù)是按動(dòng)設(shè)置鍵的次數(shù)
{
    write_com(0x30);
    write_com(0x06);
    lcm_w_test(0, 0x98); //第一參數(shù)0表示本行寫(xiě)入指令,指定下面行的 調(diào)整 顯示起始位置為9AH
    lcm_w_word("★調(diào)整");//調(diào)用字符顯示函數(shù),顯示 調(diào)整字樣
    if(sel == 5)
    {
        lcm_w_word("秒鐘");
        address = DS3231_SECOND;
        max = 59;
        mini = 0;
        tiaozheng();  //調(diào)用日期、時(shí)間調(diào)整函數(shù)
        ds_w();    //被調(diào)數(shù)據(jù)加一或減一函數(shù)
        tiaozheng();
    } //秒7,按動(dòng)7次顯示 調(diào)整秒鐘
    //并指定秒鐘數(shù)據(jù)寫(xiě)入1302芯片的地址是0x82,秒鐘數(shù)據(jù)的最大值是59,最小值是0
    if(sel == 4)
    {
        lcm_w_word("分鐘");
        address = DS3231_MINUTE;
        max = 59;
        mini = 0;
        tiaozheng();
        ds_w();
        tiaozheng();
    } //分鐘6,按動(dòng)6次顯示 調(diào)整分鐘
    //并指定分鐘數(shù)據(jù)寫(xiě)入1302芯片的地址是0x82,分鐘數(shù)據(jù)的最大值是59,最小值是0
    if(sel == 3)
    {
        lcm_w_word("小時(shí)");
        address = DS3231_HOUR;
        max = 23;
        mini = 0;
        tiaozheng();
        ds_w();
        tiaozheng();
    } //小時(shí)5,按動(dòng)5次顯示 調(diào)整小時(shí)
    //規(guī)定小時(shí)數(shù)據(jù)寫(xiě)入1302芯片的位置是0x84,小時(shí)數(shù)據(jù)最大值23,最小值是0
    if(sel == 2)
    {
        lcm_w_word("日期");
        address = DS3231_DAY;
        mo = read_random(DS3231_MONTH);//讀月數(shù)據(jù)
        yy = read_random(DS3231_YEAR);//讀年數(shù)據(jù)
        if(mo == 2 && yy % 4 != 0)
        {
            max = 28;    //平年2月28天
            mini = 1;
        }
        if(mo == 2 && yy % 4 == 0)
        {
            max = 29;    //閏年2月29天
            mini = 1;
        }
        if(mo == 1 || mo == 3 || mo == 5 || mo == 7 || mo == 8 || mo == 10 || mo == 12)
        {
            max = 31;    //31天的月份
            mini = 1;
        }
        if(mo == 4 || mo == 6 || mo == 9 || mo == 11)
        {
            max = 30;    //30天的月份
            mini = 1;
        }
        tiaozheng();
        ds_w();
        tiaozheng(); //調(diào)用日期、時(shí)間調(diào)整函數(shù)
    } //日3,按動(dòng)3次顯示 調(diào)整日期
    //規(guī)定日期數(shù)據(jù)寫(xiě)入1302的位置地址是0x86,日期最大值31,最小值是1
    if(sel == 1)
    {
        lcm_w_word("月份");
        address = DS3231_MONTH;
        max = 12;
        mini = 1;
        tiaozheng();
        ds_w();
        tiaozheng();
    } //月2,按動(dòng)2次顯示 調(diào)整月份
    //規(guī)定月份寫(xiě)入1302的位置地址是0x88,月份最大值12,最小值1
    if(sel == 0)
    {
        lcm_w_word("年份");
        address = DS3231_YEAR;
        max = 99;
        mini = 0;
        tiaozheng();
        ds_w();  //被調(diào)數(shù)據(jù)加一或減一函數(shù)
        tiaozheng(); //調(diào)用日期、時(shí)間調(diào)整函數(shù)
    } //年1,按動(dòng)1次顯示 調(diào)整年份,
    //規(guī)定年份寫(xiě)入1302的地址是0x8c,年份的最大值99,最小值0
}
/*****************************************************************************/
//被調(diào)數(shù)據(jù)加一或減一,并檢查數(shù)據(jù)范圍,寫(xiě)入1302指定地址保存
void ds_w(void)
{
    item = read_random(address);
    if(K2 == 0) //如果按動(dòng)上調(diào)鍵
    {
        item++;//數(shù)加 1
    }
    if(K3 == 0) //如果按動(dòng)下調(diào)鍵
    {
        item--;//數(shù)減 1
    }
    if(item > max) item = mini;  //查看數(shù)值是否在有效范圍之內(nèi)
    if(item < mini) item = max;  //如果數(shù)值小于最小值,則自動(dòng)等于最大值
    ModifyTime(address, item);
}
//=================================BEEP驅(qū)動(dòng)===========================================//
//需要定義Delay,輸出Bell_Out引腳
/********************************************************************************************/
void beep ( unsigned char a, unsigned char b,
            unsigned char c, unsigned char d)
{
    for(; a > 0; a--) //第一個(gè)聲音的長(zhǎng)度
    {
        Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
        Delay(b);//音調(diào)設(shè)置延時(shí)
    }
    for(; c > 0; c--) //同上
    {
        Bell_Out = ~Bell_Out;
        Delay(d);//
    }
    Bell_Out = 1;
}

void Beep_y(void)
{
    beep(50, 100, 100, 50);    //BELL
}
//--------------------------------------------揚(yáng)聲器--無(wú)效音
//void Beep_n(void){beep(50,80,100,100); }//BELL
void Delay(int num)//延時(shí)函數(shù)
{
    while(num--) ;
}
/********************************************************************************************************************
  以下為GPS部分
********************************************************************************************************************/
void InitBps()
{
    //T2設(shè)置

#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;            //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;            //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;            //9-bit variable UART, parity bit initial to 0
#endif
    TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule = 0xD9;
    TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;    // = 0xFF;
    T2CON = 0x34;  //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2   //串口工作模式1,接收使能
    ET2 = 0;
    ES = 1; //串口中斷允許
    PS = 1; //串口中斷優(yōu)先
    EA = 1; //總中斷
    Delay(500);
}
uchar Checksum(char *s)      /** gps原生校驗(yàn) **/
{
    uchar Sum, i;
    char chck[3] = {0};
    uint length=0;
    length = strlen(s);
    if(length < 38 || s[0] != '$' || s[length - 3] != '*')   /** 非完整語(yǔ)句 **/
        return 0;
    Sum = s[1];
    for(i = 2; i < length - 3 && s[i] != '*'; i++)  /** 求校驗(yàn)和 **/
    {
        Sum ^= s[i];
    }

    if(chHex[ (unsigned int)Sum / 16]== s[length - 2] && chHex[ (unsigned int)Sum % 16] == s[length - 1] )
        return 1;   
    else
        return 0;  
}
void FormatString(char *p)    /** gps數(shù)據(jù)長(zhǎng)度不定,不能用固定位截取。把分隔符 ',' 轉(zhuǎn)換為'\0'自動(dòng)變換為相應(yīng)的信息段 **/
{
    uint i, j, k;
    uchar q[12];
    uint len = strlen(p) ;
    for(i = 0; i < len; i++)
    {
        if(p[i] == ',')
            p[i] = '\0';
    }
len-=6;
    for(i = 0, j = 0, k = 0; i < len; i++)
    {
        q[j++] = p[i];
        if(p[i] == '\0')
        {
            switch(k)
            {
            case 1:
                strcpy(gps.TIME,q);
                break;
            case 2:
                strcpy(gps.VA,q);
                break;
            case 3:
    strcpy(gps.WD,q);
                break;
            case 4:
    strcpy(gps.WDNS,q);
                break;
            case 5:
    strcpy(gps.JD, q);
                break;
            case 6:
    strcpy(gps.JDWE, q);
                break;
            case 9:
    strcpy(gps.DATE, q);
                break;
            default:
                break;
            }
            k++;
            j = 0;
        }
    }
    strcpy(q, gps.TIME);
    q[2] = '\0';
    Timer.Hour = atoi(q);
    strcpy(q, &gps.TIME[2]);
    q[2] = '\0';
    Timer.Min = atoi(q);
    strcpy(q, &gps.TIME[4]);
    q[2] = '\0';
    Timer.Sec = atoi(q);
    strcpy(q, gps.DATE);
    q[2] = '\0';
    Timer.Day = atoi(q);
    strcpy(q, &gps.DATE[2]);
    q[2] = '\0';
    Timer.Mon = atoi(q);
    strcpy(q, &gps.DATE[4]);
    q[2] = '\0';
    Timer.Year = atoi(q);
    UTCToLocal(&Timer);
}
void UTCToLocal(TIMER *GPS_DataTmp)     /** 時(shí)區(qū)變換 **/
{
    GPS_DataTmp->Hour += TIME_AREA;
    if( GPS_DataTmp->Hour >= 24)    //如果小時(shí)數(shù)大于24
    {
        GPS_DataTmp->Hour -= 24;      //小時(shí)數(shù)減24
        GPS_DataTmp->Day++;           //日期數(shù)加1
        switch(GPS_DataTmp->Day)   //判斷日期
        {
        case 29: //普通年的2月份
            if((!((GPS_DataTmp->Year % 400 == 0) || ((GPS_DataTmp->Year % 4 == 0) && (GPS_DataTmp->Year % 100 != 0))) && (GPS_DataTmp->Mon == 2)))
            {
                GPS_DataTmp->Day = 1;
                GPS_DataTmp->Mon++;
            }
            break;
        case 30:      //如果是閏年的2月     
            if(((GPS_DataTmp->Year % 400 == 0) || ((GPS_DataTmp->Year % 4 == 0) && (GPS_DataTmp->Year % 100 != 0))) && (GPS_DataTmp->Mon == 2))
            {            /** 閏年:四年一閏,百年不潤(rùn),四百年再閏 **/
                GPS_DataTmp->Day = 1;
                GPS_DataTmp->Mon++;
            }
            break;
        case 31:           /**  小月  **/
            if((GPS_DataTmp->Mon == 4) || (GPS_DataTmp->Mon == 6) || (GPS_DataTmp->Mon == 9) || (GPS_DataTmp->Mon == 11))
            {
                GPS_DataTmp->Day = 1;
                GPS_DataTmp->Mon++;
            }
            break;
        case 32:         /**  大月,12月需年加一  **/
            GPS_DataTmp->Day = 1;
            GPS_DataTmp->Mon++;
            if(GPS_DataTmp->Mon >= 13)
            {
                GPS_DataTmp->Year++;
                GPS_DataTmp->Mon = 1;
            }
            break;
        }
    }
}
void GetRs232_Data() interrupt 4     /** GPS信息采集 **/
{
    uchar tmp;
    if(RI)
    {
        tmp = SBUF;
        switch(tmp)
        {
        case '$':
            mode = 1;                //接收命令模式
            byte_count = 0;          //接收位數(shù)清空
   memset(RsBuf,0,80);
            RsBuf[byte_count++] = tmp;
            break;
        case '\r':       /**  亦可用換行符'\n',見(jiàn)到幾乎所有的gps C51程序都是用‘*’作標(biāo)志尾!! 原生的校驗(yàn)為何不用?? **/            
            if(mode == 2)
                buf_full = 1;
            else
                buf_full = 0;
   mode = 0;
   RsBuf[byte_count] = '\0';
            break;
        default:
            if(mode == 1)
            {
                //命令種類(lèi)判斷
                RsBuf[byte_count] = tmp;                //接收字符放入類(lèi)型緩存
                if(byte_count == 5)                     //如果類(lèi)型數(shù)據(jù)接收完畢,判斷類(lèi)型
                {
                    if(RsBuf[1] == 'G' && RsBuf[2] == 'P' && RsBuf[3] == 'R')
                    {
                        if(RsBuf[4] == 'M' && RsBuf[5] == 'C')
                        {
                            mode = 2;   /** 獲取標(biāo)志頭 $GPRMC 緩存可以接收后續(xù)字符 **/
                        }
                        else
                        {
                            mode = 0;
                            byte_count = 0;
                        }
                    }
                    else
                    {
                        mode = 0;
                        byte_count = 0;
                    }
                }
                byte_count++;
            }
            else if(mode == 2)
            {
                RsBuf[byte_count] = tmp;
                byte_count++;
            }
            if(byte_count > 73)  /** 接收數(shù)據(jù)過(guò)長(zhǎng),超過(guò)73Byte還沒(méi)標(biāo)志尾拋棄 **/
            {
                mode = 0;
                byte_count = 0;
    memset(RsBuf,0,80);
            }
            break;
        }
        if(buf_full && byte_count > 36 && Checksum(RsBuf))  /*** 標(biāo)志頭尾齊全、至少有時(shí)間數(shù)據(jù)、驗(yàn)證碼無(wú)誤,才能解析數(shù)據(jù) ***/
        {
    FormatString(RsBuf);
             buf_full = 0;
        }
    }
    RI = 0;
}
void ShowGPS(void)     /** 顯示GPS時(shí)間、定位信息界面 **/
{
  uchar i = 0;
    if(gps.DATE[0] >= '0' && gps.DATE[0] <= '9')
    {
  lcm_w_test(0,0x30);
  lcm_w_test(0,0x06);
        write_com(0x81);
        write_data(0x32);      /**  補(bǔ)年號(hào) 20** **/
        write_data(0x30);
        write_data(Timer.Year / 10 + '0');  
        write_data(Timer.Year % 10 + '0');
        write_data('-');
        write_data(Timer.Mon / 10 + '0');
        write_data(Timer.Mon % 10 + '0');
        write_data('-');
        write_data(Timer.Day / 10 + '0');
        write_data(Timer.Day % 10 + '0');
        write_com(0x91);
        write_data(Timer.Hour / 10 + '0');
        write_data(Timer.Hour % 10 + '0');
        write_data(':');
        write_data(Timer.Min / 10 + '0');
        write_data(Timer.Min % 10 + '0');
        write_data(':');
        write_data(Timer.Sec / 10 + '0');
        write_data(Timer.Sec % 10 + '0');
  
        if(gps.VA[0] == 'A')    /**  GPS定位有效則顯示定位,否則提示 定位中 **/
        {
            write_com(0x88);
            if(gps.JDWE[0] == 'E')
                lcm_w_word("東經(jīng):");
            if(gps.JDWE[0] == 'W')
                lcm_w_word("西經(jīng):");
            for(i = 0; i < 3; i++)   
                write_data(gps.JD[i]);
            write_data('.');
            for(i = 3; i < 8; i++)
                write_data(gps.JD[i]);
            write_com(0x98);
            if(gps.WDNS[0] == 'N')
                lcm_w_word("北緯: ");
            if(gps.WDNS[0] == 'S')
                lcm_w_word("南緯:");
            for(i = 0; i < 2; i++)  
                write_data(gps.WD[i]);
            write_data('.');
            for(i = 2; i < 7; i++)
                write_data(gps.WD[i]);
        }
        else
        {
            write_com(0x88);
            lcm_w_word("定位中........");
            write_com(0x98);
            lcm_w_word("按MOD 鍵強(qiáng)制校時(shí)");   
        }  
    }
else
{
  lcm_w_test(0,0x30);
  lcm_w_test(0,0x06);
        write_com(0x88);
        lcm_w_word("  編程實(shí)現(xiàn)樂(lè)趣。");
        write_com(0x98);
        lcm_w_word("  算法改變世界。");  
}
}
void GPS_JS(void)   /** GPS自動(dòng)校時(shí) **/
{
if(Timer.Year<14) //低于2014無(wú)效
   return;
GetDS3231();
if(Timer.Year!=year)  
     ModifyTime(DS3231_YEAR,Timer.Year); //寫(xiě)入3231   
   
if(Timer.Mon!=month)
     ModifyTime(DS3231_MONTH,Timer.Mon);
   
if(Timer.Day!=day)
     ModifyTime(DS3231_DAY,Timer.Day);

if(Timer.Hour!=hour)
     ModifyTime(DS3231_HOUR,Timer.Hour);
if(Timer.Min!=min)
     ModifyTime(DS3231_MINUTE,Timer.Min);
   
Timer.Sec++;//gps接收處理耽擱約0.5s,在此處修正1s
if(Timer.Sec!=sec)
     ModifyTime(DS3231_SECOND,Timer.Sec);
Conver_week(Timer.Year,Timer.Mon,Timer.Day);//調(diào)用公歷換算星期子函數(shù)
if(week==0)  //DS3231 中用 1-7 代表周一至周日
     week=7;
ModifyTime(DS3231_WEEK,week);
  
}
/********************************************************************************************************************
  以上為GPS部分
********************************************************************************************************************/
void GetDS3231() //獲取當(dāng)前日期和時(shí)間
{
year = read_random(DS3231_YEAR); //年
month = read_random(DS3231_MONTH); //月
day  = read_random(DS3231_DAY); //日
hour = read_random(DS3231_HOUR); //時(shí)  
min = read_random(DS3231_MINUTE); //分
sec = read_random(DS3231_SECOND); //秒
}
/*主函數(shù)---------------------------------------------------------------------*/
void main()
{
    uchar e = 0;
uint cc=0;//計(jì)時(shí)5min
uchar sc=0;//sec
bit s = 0;   /**  翻頁(yè)用 **/
bit js = 1;   /**  gps校時(shí)用,在GPS界面校時(shí)一次就行了 **/
    K1 = 1;
    K2 = 1;
    K3 = 1;
    K4 = 1;
    BLK = 0;
InitBps();
mode = 0;
InitBps();
    lcm_init();   //液晶初始化
    welcome();      //調(diào)用歡迎信息
    DelayM(1000);   //延時(shí)
    lcm_clr();            //清屏
    Clean_12864_GDRAM();  //清屏
    while(1)
    {
        
  if (w == 0)    //正常走時(shí)
        {            
   if(s)
   {
      if(sc!=Timer.Sec)
      {
          ShowGPS();
       if(gps.VA[0] == 'A')
         cc++;
       else
          cc=0 ;
       sc=Timer.Sec;
      }
      if( cc>=300 && js && Timer.Sec<59)  /** 出現(xiàn)定位數(shù)據(jù)5分鐘以上表明時(shí)間一定有效。 在定位界面只需校時(shí)一次。<59 有含義,自己體會(huì)! **/
      {         
        GPS_JS();
        js=0;
      }
      /*12小時(shí)自動(dòng)校時(shí)一次,應(yīng)一壇友要求加的該功能。其實(shí)完全無(wú)必要,如果GPS一直掛著就直接用 GPS+12864 程序!*/
      if(js==0 && Timer.Hour%12==0 && Timer.Min==0 && Timer.Sec==0)  
      {
         GPS_JS();
      }
   }
   else
   {
    GetDS3231();
    if(sc!=sec) //秒有更新才刷新lcd
    {
      displaydate();  //顯示日期
               displaynl();  //顯示農(nóng)歷
   
               displaytime();  //顯示時(shí)間               
               displayxq();  //顯示星期
      displaytemp();
      sc=sec;
    }
    js=1;
   }   
            /*液晶背光控制,按一下亮,再按一下滅----------------------------------------*/
            if(K3 == 0)
            {
                DelayM(20);
                q = ~q;      //標(biāo)志位取反
                if(q)
                {
                    BLK = BLK | 1;
                }
                else
                {
                    BLK = BLK & 0;
                }
                while(K3 == 0);
            }
        }
        else
  {}            //否則啟動(dòng)調(diào)時(shí)
        /*----------------------------設(shè)置時(shí)間--------------------------------------*/
        if (K1 == 0)
        {
            DelayM(20);                //按鍵消抖
   if(K1 == 0 && s && Timer.Sec<59)   //如果GPS模式強(qiáng)制校時(shí)
   {
      GPS_JS();
      while(! K1 );
       Beep_y();      
   }
   else
   {
              if(K1 == 0 && w == 1)      //當(dāng)是調(diào)時(shí)狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
              {
                  e++;
                  if (e >= 7 )
                  {
                      e = 0;
                  }
                  while(! K1 );            //等待鍵松開(kāi)
                  Set_time(e);            //調(diào)整
              }
              if(K1 == 0 && w == 0)       //當(dāng)是正常狀態(tài)時(shí)就進(jìn)入調(diào)時(shí)狀態(tài)
              {
                  lcm_clr();
                  Clean_12864_GDRAM();    //清屏
                  w = 1;               //進(jìn)入調(diào)時(shí)
                  Set_time(e);
              }
   }
            while(K1 == 0);            //等待鍵松開(kāi)
        }
        /*--------------------------------------------------------------------------*/
        if (K4 == 0)                   // 當(dāng)在調(diào)時(shí)狀態(tài)時(shí)就退出調(diào)時(shí)
        {
            DelayM(20);
            if(K4 == 0 && w == 0)  
            {
                lcm_clr();
                Clean_12864_GDRAM();
                write_com(0x30);
                write_com(0x06);
                welcome();
      DelayM(2000);
    s=~s;       /**  運(yùn)行模式中 K2 作界面切換鍵  **/
    if(s)    /**  進(jìn)入GPS界面即重新獲取定位信息,防止GPS斷開(kāi)后保留的最后一次時(shí)間給校時(shí)用了  **/
     gps.VA[0] = 'V';
    cc=0 ;//重新進(jìn)行有效計(jì)時(shí)
                while(K4 == 0);
            }
            if(K4 == 0 && w == 1)    /** 和前個(gè)if 切勿顛倒 **/
            {
                w = 0;                //退出調(diào)時(shí)
                e = 0;             //"下一項(xiàng)"計(jì)數(shù)器清0
            }
            lcm_clr();
            Clean_12864_GDRAM();
            while(K4 == 0);
            Beep_y();
        }
        /*加調(diào)整--------------------------------------------------------------------*/
        if (K2 == 0 && w == 1)
        {
            DelayM(20);
            if(K2 == 0 && w == 1)
            {
                Set_time(e);
            }
            while(! K2 );
        }
        /*減調(diào)整--------------------------------------------------------------------*/
        if (K3 == 0 && w == 1)
        {
            DelayM(20);
            if(K3 == 0 && w == 1)
            {
                Set_time(e);
            }

            while(! K3 );
        }
    }
}
/*結(jié)束----------------------------------------------------------------------*/

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表