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

QQ登錄

只需一步,快速開始

搜索
查看: 4083|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)12864時(shí)鐘制作資料下載 代碼注釋詳細(xì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
12864時(shí)鐘資料包(附件中可下載完整版的代碼 而且注釋非常詳細(xì)):


單片機(jī)源程序如下:
  1. #include         "Initial.h"
  2. #include         "ds1302.h"
  3. #include         "12864.h"
  4. #include        "IC.h"
  5. #include        "HongWai.h"
  6. #include        "Alarm.h"

  7. /**********************************************************
  8.         函數(shù)名:         Initial()
  9.         函數(shù)功能:        用于單片機(jī)開機(jī)后的第一次初始化
  10.         入口參數(shù):無(wú)
  11.         出口參數(shù):無(wú)
  12. **********************************************************/



  13. void Initial()
  14. {
  15.         Initial_12864();                                 //12864的初始化
  16.         Write_12864_DS1302_Constant();         //寫12864的固定部分
  17.        
  18.         g_Alarm_min  = Read_Add_24c02(1); //首次從24C02中讀取數(shù)據(jù) 鬧鐘的時(shí)分
  19.         g_Alarm_hour = Read_Add_24c02(2);

  20.         Initial_IIC();                                         //24c02的初始化
  21.                   
  22.     Initial_HW_Time();                                 //初始化紅外的定時(shí)器
  23.        
  24.         g_Alarm_Flag1             = 0;
  25.         g_Alarm_Flag2            = 0;
  26.         g_HongWai_Work_Flag = 0;
  27.         g_Uart_Work_Flag    = 0;
  28. ……………………

  29. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

紅外遙控部分:
  1. /***************************************************************
  2.         文件說(shuō)明:本文件主要處理紅外因定時(shí)器與串口有重合
  3.                           的部分,故定時(shí)器0中采用判斷與標(biāo)志位處理
  4.                           在調(diào)用本模塊時(shí)只需修改  Ir_work(void)
  5.                           并在主函數(shù)中調(diào)用        IRR_Work()以便讓整個(gè)C文件工作
  6. **************************************************************/

  7. #include                 "HongWai.h"
  8. #include                "Control.h"
  9. #include                "ds1302.h"
  10. #include                "12864.h"
  11. #include                "Initial.h"
  12. #include                "Uart.h"
  13. #include                "Alarm.h"

  14. bit                                g_HongWai_Work_Flag;        //紅外是否工作標(biāo)志位的標(biāo)志位
  15. uchar                        T0_Count;                                //T0的計(jì)數(shù)變量主要用于在串口工作時(shí)統(tǒng)計(jì)5s的時(shí)間
  16. /**********************************************
  17.         以下是紅外的變量
  18. ***********************************************/
  19. uchar                          irtime;               
  20. bit                         irpro_ok,irok;
  21. uchar                         IRcord[4];
  22. uchar                         irdata[33];
  23. /*********************************************
  24.         函數(shù)名:        Initial_HW_Time()
  25.         函數(shù)功能:        初始化紅外的定時(shí)器
  26.         入口參數(shù):  無(wú)
  27.         出口參數(shù):  無(wú)
  28.         備    注:
  29. *********************************************/

  30. void        Initial_HW_Time()               
  31. {
  32.     /*  因與顯示的頻率有一定的沖突故將備份如下
  33.         TMOD = 0x12;                                //定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
  34.         TH0  = 0x00;                                 //重載值
  35.         TL0  = 0x00;                                 //初始化值
  36.         ET0  = 1;                                    //開中斷
  37.         TR0  = 1;                                   //開定時(shí)器0
  38.         IT0  = 1;                                   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  39.     EX0  = 1;                                   //使能外部中斷
  40.     TH1  = 0x3c;                //50ms  12MHZ晶振
  41.     TL1  = 0xB0;
  42.     ET1  = 1;                   //使能T1
  43.     TR1  = 1;
  44.     EA   = 1;                                    //開總中斷
  45.     ***************************************/
  46.     TMOD = 0x02;                                //定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
  47.         TH0  = 0x00;                                 //重載值
  48.         TL0  = 0x00;                                 //初始化值
  49.         ET0  = 1;                                    //開中斷
  50.         TR0  = 1;                                   //開定時(shí)器0
  51.         IT0  = 1;                                   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  52.     EX0  = 1;                                   //使能外部中斷
  53.     EA   = 1;                                    //開總中斷
  54. }

  55. /*********************************************
  56.         函數(shù)名:         T0_Time(void) interrupt 1
  57.         函數(shù)功能:        定時(shí)器0中斷處理
  58.         入口參數(shù);   無(wú)
  59.         出口參數(shù):  無(wú)
  60.         備    注:  因定時(shí)器處理與串口重疊
  61.                                 本函數(shù)利用標(biāo)志位g_Uart_Work_Flag
  62.                                 把兩者分開
  63. *********************************************/
  64. void         T0_Time (void) interrupt 1 using 1
  65. {
  66.         static Count_5S = 0;
  67.         if(g_Uart_Work_Flag == 0)        //如果沒(méi)有串口工作則計(jì)紅外的時(shí)間
  68.         {
  69.                 irtime++;          //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
  70.         }
  71.         else                                        //否則統(tǒng)計(jì)5s的時(shí)間
  72.         {
  73.                 TH0 = 0x3c;                        //定時(shí)50ms 12M晶振
  74.                 TL0 = 0xB0;
  75.                 T0_Count ++;
  76.                 if(T0_Count >= 20)
  77.                 {
  78.                         T0_Count = 0;
  79.                         g_Run_Time_Uart_Flag = 1;
  80.                         Count_5S ++;
  81.                         if(Count_5S >= 5)
  82.                         {
  83.                                 Count_5S = 0;
  84.                                 g_Send_Uart_Flag = 1;
  85.                         }
  86.                 }
  87.         }
  88. }
  89. /*******************************************
  90.         函數(shù)名:        EX0_Ser(void) interrupt 0
  91.         函數(shù)功能:        外部中斷0服務(wù)函數(shù)
  92.         入口參數(shù):  無(wú)
  93.         出口參數(shù):  無(wú)
  94. ********************************************/
  95. void         EX0_Ser(void) interrupt 0                
  96. {
  97.         static unsigned char  i;             //接收紅外信號(hào)處理
  98.         static bit startflag;                //是否開始處理標(biāo)志位

  99.         if(startflag)                        
  100.         {
  101.                 if(irtime < 65 &&irtime >= 33 )//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
  102.                 {
  103.                         i = 0;
  104.                 }
  105.                 irdata[i] = irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
  106.                 irtime = 0;
  107.                 i++;
  108.                 if(i == 33)
  109.                 {
  110.                         irok = 1;
  111.                         i = 0;
  112.                 }
  113.         }
  114.         else
  115.         {
  116.                 irtime = 0;
  117.                 startflag = 1;
  118.         }

  119. }


  120. /****************************************************
  121.         函數(shù)名:        Ir_work(void)
  122.         函數(shù)功能:        兼鍵值處理函數(shù)
  123.         入口參數(shù):  無(wú)
  124.         出口參數(shù):  無(wú)
  125.         備    注:        本函數(shù)主要用于處理按下遙控后的處理
  126.                                 處理操作標(biāo)志位,是本文件中很核心的一個(gè)函數(shù)
  127. *****************************************************/
  128. void        Ir_work(void)                                               
  129. {
  130.         switch(IRcord[2])                                        //判斷第三個(gè)數(shù)碼值
  131.         {
  132.             case 0x0c:                                                //1 功能位置增加 顯示相應(yīng)的按鍵值                                       
  133.                 {
  134.                         g_HongWai_Work_Flag = !g_HongWai_Work_Flag;//對(duì)紅外的標(biāo)志位進(jìn)行取反
  135.                         g_Alarm_Flag1 = 0;                                                        //對(duì)鬧鐘的兩個(gè)標(biāo)志位清零,讓程序穩(wěn)定
  136.                         g_Alarm_Flag2 = 0;
  137.             g_Turn_Poem_Flag = 0;
  138.                         Initial_12864();                        //12864的初始化
  139.                         if(g_HongWai_Work_Flag == 0)
  140.                         {
  141.                                 Write_12864_DS1302_Constant();        //寫12864的固定部分
  142.                         }
  143.                 }
  144.         /**********************************************************
  145.                     case 0x18:        DataPort = table[1];        break;//2
  146.             case 0x5e:        DataPort = table[2];        break;//3
  147.             case 0x08:        DataPort = table[3];        break;//4
  148.             case 0x1c:        DataPort = table[4];        break;//5
  149.             case 0x5a:        DataPort = table[5];        break;//6
  150.             case 0x42:        DataPort = table[6];        break;//7
  151.             case 0x52:        DataPort = table[7];        break;//8
  152.             case 0x4a:        DataPort = table[8];        break;//9
  153.                 case 0x0d:  DataPort = table[9];    break;//200++
  154.                 case 0x09:  DataPort = table[0];        break;//EQ 顯示相應(yīng)的按鍵值
  155.                 case 0x45:  DataPort = 0x00;        break;//CH-
  156.                 case 0x46:  DataPort = 0xff;        break;//CH
  157.                 case 0x47:  DataPort = 0x00;        break;//CH+
  158.                 case 0x44:  DataPort = 0xff;        break;//后退
  159.                 case 0x40:  DataPort = 0x00;        break;//前進(jìn)
  160.                 case 0x43:  DataPort = 0x02;        break;//暫停
  161.                 case 0x07:  DataPort = 0x00;        break;//-
  162.                 case 0x15:  DataPort = 0xff;        break;//+
  163.                 case 0x16:  DataPort = 0xff;        break;//0
  164.                 case 0x19:  DataPort = 0xf0;        break;//100+
  165.             default:        break;
  166.         **************************************************************/
  167.         }
  168.    irpro_ok = 0;        //處理完成標(biāo)志
  169.        
  170. }
  171. /***************************************************
  172.         函數(shù)名:        Ircordpro(void)
  173.         函數(shù)功能:        紅外碼值處理函數(shù) 紅外碼值處理
  174.         入口參數(shù):  無(wú)
  175.         出口參數(shù):  無(wú)
  176.     備  注  :
  177. ****************************************************/   
  178. void        Ircordpro(void)
  179. {
  180.         uchar i, j, k;
  181.         uchar cord,value;

  182.         k = 1;
  183.         for(i = 0;i < 4;i++)      //處理4個(gè)字節(jié)
  184.         {
  185.                 for(j = 1;j <= 8;j++) //處理1個(gè)字節(jié)8位
  186.                 {
  187.                         cord = irdata[k];
  188.                         if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
  189.                         {
  190.                                 value |= 0x80;
  191.                         }
  192.                         if(j<8)
  193.                         {
  194.                                 value >>= 1;
  195.                         }
  196.                                 k++;
  197.                 }
  198.                 IRcord[i] = value;
  199.             value = 0;     
  200.         }
  201.         irpro_ok = 1;        //處理完畢標(biāo)志位置1
  202. }
  203. /******************************************************
  204.         函數(shù)名:        IRR_Work(void)
  205.         函數(shù)功能:  調(diào)用整個(gè)c文件        以便讓整個(gè)文件函數(shù)工作
  206.         入口參數(shù):  無(wú)
  207.     出口參數(shù):  無(wú)
  208.     備    注:
  209. ******************************************************/
  210. void        IRR_Work()
  211. ……………………

  212. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

串口:
  1. /***********************************************************
  2.                 本文件主要用來(lái)寫串口通信
  3.                 注:統(tǒng)計(jì)5s時(shí)間的函數(shù)寫在紅外里面了
  4.             若調(diào)用本文件的定時(shí)器  定期寫在最后 在工程中我把
  5.             定時(shí)器屏蔽掉
  6. ***********************************************************/
  7. #include        "Uart.h"
  8. #include        "ds1302.h"
  9. #include        "HongWai.h"
  10. #include        "12864.h"
  11. #include        "Alarm.h"

  12. bit                        g_Recieve_Flag;
  13. bit                        g_Run_Time_Uart_Flag;        //串口調(diào)試的時(shí)候時(shí)間走動(dòng)的時(shí)候標(biāo)志位
  14. bit                        g_Send_Uart_Flag;                //串口發(fā)送給電腦的標(biāo)志位

  15. uchar                Recieve_Time_Data;                //接受的時(shí)間數(shù)據(jù)
  16. uchar                g_Num_Uart;                                //統(tǒng)計(jì)串口接收的次數(shù)
  17. /*********************************************************
  18.         函數(shù)名: Initial_Uart()
  19.         函數(shù)功能:初始化串口
  20.         入口參數(shù):無(wú)
  21.         出口參數(shù):無(wú)
  22.         備    注: 12M晶振 600bps
  23. *********************************************************/
  24. void                Initial_Uart()        //初始化串口
  25. {
  26.         TMOD = 0x21;                                //串行口通信時(shí)要把定時(shí)器打開,設(shè)置定時(shí)器工作方式
  27.         TH0  = (65536 - 45872) / 256;//裝初值
  28.         TL0  = (65536 - 45872) % 256;
  29.         TH1  = 0xcc;                                 //自動(dòng)重裝波特率為600bps 12M晶振
  30.         TL1  = 0x98;
  31.         TR1  = 1;                                        //打開定時(shí)器1

  32.         ET0  = 1;                                        //
  33.         SM0  = 0;                                        //設(shè)置串行口工作方式1,要與TMOD相對(duì)應(yīng)
  34.         SM1  = 1;
  35.         EA   = 1;                                        //打開總中斷
  36.         ES   = 1;                                        //打開串行口中斷
  37.         REN  = 1;                                        //允許串行口接受,當(dāng)TMOD = 0x21時(shí)要在設(shè)置好SM0,SM1后再寫
  38. }
  39. /****************************************************************
  40.         函數(shù)名稱:        Ser_Uart()
  41.         函數(shù)功能:        主要用于串口的中斷服務(wù)       
  42.         入口參數(shù):        無(wú)
  43.         出口參數(shù):        無(wú)
  44.         備          注:        進(jìn)入計(jì)算機(jī)通信中斷后設(shè)定標(biāo)志位
  45. *****************************************************************/
  46. void        Ser_Uart()                interrupt 4
  47. {        
  48.         RI          = 0;
  49.         Recieve_Time_Data    = SBUF;                //把接收的數(shù)據(jù)給時(shí)間標(biāo)志位
  50.            
  51.     if(Recieve_Time_Data == 'r')
  52.     {
  53.         g_Num_Uart = 0;
  54.     }
  55.         else
  56.     {
  57.         Recieve_Time_Data   = Recieve_Time_Data - '0';
  58.         g_Num_Uart ++;

  59.     }
  60.         g_Recieve_Flag = 1;                                //串口服務(wù)的標(biāo)志主要用于接收
  61.        
  62. }

  63. /***********************************************************
  64.         函數(shù)名稱:        Uart_Process()
  65.         函數(shù)功能:        串口處理
  66.         入口參數(shù):        無(wú)
  67.         出口參數(shù):        無(wú)
  68.         備    注:        本函數(shù)主要通過(guò)處理g_Recieve_Flag  g_Send_Uart_Flag
  69.                                 g_Run_Time_Uart_Flag來(lái)達(dá)到執(zhí)行相應(yīng)函數(shù)的目的
  70. ***********************************************************/
  71. void                Uart_Process()
  72. {
  73.         if(g_Recieve_Flag        ==  1)                        //如果出現(xiàn)標(biāo)志位置1 則進(jìn)行接收的處理
  74.         {
  75.                 g_Recieve_Flag = 0;
  76.                 ES                           = 0;
  77.                 TI                           = 1;
  78.                
  79.                 switch(g_Num_Uart)                                                //通過(guò)判斷串口發(fā)送的次數(shù)來(lái)進(jìn)行相應(yīng)的處理
  80.                 {
  81.                         case 1:                break;
  82.                         case 2:                break;
  83.                         case 3:                g_year  = Recieve_Time_Data * 10;                break;
  84.                         case 4:                g_year  = Recieve_Time_Data + g_year;        break;                               
  85.                         case 5:                g_month = Recieve_Time_Data * 10;                break;               
  86.                         case 6:                g_month = Recieve_Time_Data + g_month;        break;                                                                               
  87.                         case 7:                g_date  = Recieve_Time_Data * 10;                break;       
  88.                         case 8:                g_date  = Recieve_Time_Data + g_date;        break;
  89.                         case 9:                g_hour  = Recieve_Time_Data * 10;                break;
  90.                         case 10:        g_hour  = Recieve_Time_Data + g_hour;        break;
  91.                         case 11:        g_min   = Recieve_Time_Data * 10;                break;
  92.                         case 12:        g_min   = Recieve_Time_Data + g_min;        break;
  93.                         case 13:        g_sec   = Recieve_Time_Data * 10;                break;
  94.                         case 14:                                                        //對(duì)數(shù)據(jù)進(jìn)行最后一次處理并退出串口中斷服務(wù)
  95.                                         {
  96.                                                 g_sec = Recieve_Time_Data  + g_sec;
  97.                                                 Write_sfm(6,g_sec);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  98.                                                 Locate_pos(2,2);                        //顯示位置重新回到調(diào)節(jié)處
  99.                                
  100.                                                 g_Num_Uart         = 0;
  101.                                                 g_Uart_Work_Flag   = 0;                        //串口工作的標(biāo)志位清零退出串口工作
  102.                         g_Set_DS1302_Num  = 0;
  103.                                                 Write_1302_Date   ();                        //把數(shù)據(jù)寫進(jìn)DS1302
  104.                                                 Write_12864_DS1302_Constant();        //把顯示DS1302時(shí)間的固定部分寫在液晶上
  105.                                                 Initial_HW_Time   ();                          //初始化紅外的定時(shí)器
  106.                                                 break;
  107.                                         }
  108.                         default:                                                        //為了讓程序穩(wěn)定        對(duì)一些標(biāo)志位繼續(xù)處理       
  109.                                         {
  110.                                                 g_Num_Uart         = 0;
  111.                                                 g_Uart_Work_Flag   = 0;                //串口工作的標(biāo)志位清零退出串口工作
  112.                         g_Set_DS1302_Num   = 0;
  113.                                                 Write_1302_Date   ();                        //把數(shù)據(jù)寫進(jìn)DS1302
  114.                                                 Write_12864_DS1302_Constant();        //把顯示DS1302時(shí)間的固定部分寫在液晶上
  115.                                                 Initial_HW_Time   ();                          //初始化紅外的定時(shí)器

  116.                                         }
  117.                        
  118.                 }
  119.        
  120.                 if(g_Num_Uart >= 15)                                        //增加程序的穩(wěn)定性                       
  121.                 {
  122.                         g_Num_Uart = 0;
  123.                 }

  124.                 while(!TI);
  125.                 TI = 0;
  126.                 ES = 1;
  127.         }
  128.        
  129.         if(g_Send_Uart_Flag      ==  1)                        //進(jìn)行發(fā)送給電腦數(shù)據(jù)的處理        發(fā)送后DS1302便會(huì)更改
  130.         {
  131.                 g_Send_Uart_Flag = 0;
  132.                 ES                  = 0;
  133.                 TI                  = 1;
  134.                 printf("\n\n\n                              現(xiàn)在時(shí)間是\n");
  135.                 printf("\n                     20%c%c年%c%c月%c%c日        %c%c時(shí)%c%c分%c%c秒\n",
  136.                                         g_year  / 10 + '0', g_year  % 10 + '0',
  137.                                         g_month / 10 + '0', g_month % 10 + '0',
  138.                                         g_date  / 10 + '0', g_date  % 10 + '0',
  139.                                         g_hour  / 10 + '0', g_hour  % 10 + '0',
  140.                                         g_min   / 10 + '0', g_min   % 10 + '0',
  141.                                         g_sec   / 10 + '0', g_sec   % 10 + '0');
  142.                
  143.                 while(!TI);
  144.                 TI                  = 0;
  145.                 ES                  = 1;
  146.         }
  147.        
  148.         if(g_Run_Time_Uart_Flag  ==  1)                        //到達(dá)一秒的時(shí)間對(duì)DS1302的時(shí)間進(jìn)行讀取更新
  149.         {
  150.                 g_Run_Time_Uart_Flag = 0;
  151.                 Read_All_DS1302_Date();                                //讀取DS1302的所有數(shù)據(jù)
  152.                 Display_DS1302_Time();                                //把讀取的數(shù)據(jù)顯示在液晶上
  153.         }


  154. }

  155. /*******************************************************

  156.     函數(shù)名:    T0_Time (void) interrupt 1 using 1
  157.     函數(shù)功能:  定時(shí)器0的中斷處理
  158.     入口參數(shù):  無(wú)
  159.     出口參數(shù):  無(wú)
  160. void         T0_Time (void) interrupt 1 using 1
  161. ……………………

  162. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
  1. /*******************************************************
  2.         文件說(shuō)明:本文件主要用來(lái)寫DS1302與鬧鈴相應(yīng)
  3.                           的按鍵按下之后對(duì)相應(yīng)的數(shù)值進(jìn)行處理的函數(shù)
  4. ********************************************************/


  5. #include        "Control.h"
  6. #include        "Delay.h"
  7. #include        "ds1302.h"
  8. #include        "12864.h"
  9. #include        "IC.h"
  10. #include        "Alarm.h"


  11. /**************************************************
  12.         函數(shù)名:   Di()
  13.         函數(shù)功能: 制造蜂鳴器的聲音
  14.         入口參數(shù): 無(wú)
  15.         出口參數(shù): 無(wú)
  16.         備          注:
  17. *************************************************/
  18. void    Di()
  19. {
  20.         uint        i;
  21.         for(i = 1;i < 50; i ++)
  22.         {
  23.                 beep = 0;
  24.                 DelayUs2x(i * 10);
  25.                 beep = 1;
  26.                 DelayUs2x( ( 50 - i) * 5);
  27.         }
  28.     for(i = 1;i < 50; i++)
  29.     {
  30.                 beep = 1;
  31.                 DelayUs2x(i * 10);
  32.                 beep = 0;
  33.                 DelayUs2x( ( 50 - i) * 5);
  34.     }
  35. }


  36. /*************************************************
  37.         函數(shù)名:        Locate_DS1302()
  38.         函數(shù)功能:        用于調(diào)整DS1302時(shí)間時(shí)  定位游標(biāo)
  39.                                 與提示改變的項(xiàng)目
  40.         入口參數(shù):  無(wú)
  41.         出口參數(shù):        無(wú)
  42.         備          注:
  43.        
  44. *************************************************/
  45. void         Locate_DS1302()                               
  46. {                       
  47.         Remind_DS1302_Exchange(g_Set_DS1302_Num);        //提示DS1302改變的項(xiàng)目
  48.         switch(g_Set_DS1302_Num)                                        //定位光標(biāo)
  49.         {
  50.                 case 1:        Locate_pos(2,6);        break;        //第一次按下光標(biāo)到秒位置
  51.                 case 2: Locate_pos(2,4);        break;        //第二次按下光標(biāo)到分鐘位置
  52.                 case 3:        Locate_pos(2,2);        break;        //第三次按下光標(biāo)到小時(shí)位置
  53.                 case 4: Locate_pos(2,1);        break;        //第四次按下光標(biāo)到星期位置
  54.                 case 5:        Locate_pos(1,6);        break;        //第五次按下光標(biāo)到日位置
  55.                 case 6:        Locate_pos(1,4);        break;        //第六次按下光標(biāo)到月位置
  56.                 case 7: Locate_pos(1,2);        break;        //第七次按下光標(biāo)到年位置
  57.                 default:                                                        //返回界面并對(duì)標(biāo)志位進(jìn)行處理
  58.                         {
  59.                                 g_Set_DS1302_Num = 0;
  60.                                 Initial_12864();
  61.                                 Initial_12864();                                 //初始化12864
  62.                                 Write_12864_DS1302_Constant();        //寫12864固定的部分
  63.                                 Write_1302_Date();                                //寫入 存儲(chǔ)數(shù)據(jù)
  64.                                 g_Alarm_Flag1 = 0;
  65.                                 g_Alarm_Flag2 = 0;
  66.                         }
  67.         }

  68.         if(g_Set_DS1302_Num >= 8)                                        //增加程序的穩(wěn)定性                                               
  69.         {
  70.                 g_Set_DS1302_Num = 0;
  71.         }

  72. }



  73. /************************************************
  74.         函數(shù)名:        Increase_DS1302()
  75.         函數(shù)功能:   用于處理調(diào)整DS1302的數(shù)值之時(shí)
  76.                                 對(duì)調(diào)整的項(xiàng)目進(jìn)行數(shù)值增加
  77.         入口參數(shù):無(wú)
  78.         出口參數(shù):無(wú)
  79.         備    注:
  80. ************************************************/
  81. void         Increase_DS1302()                                                               
  82. {
  83.         Remind_DS1302_Exchange(g_Set_DS1302_Num);                                //提示改變的項(xiàng)目

  84.         switch(g_Set_DS1302_Num)
  85.         {
  86.                 case 1:                                                        //增大調(diào)整秒
  87.                 {
  88.                         g_sec ++;
  89.                         if(g_sec >= 60)                                //到達(dá)一分鐘的時(shí)間               
  90.                         {
  91.                                 g_sec = 0;
  92.                         }
  93.                         Write_sfm(6,g_sec);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  94.                         Locate_pos(2,6);                        //顯示位置重新回到調(diào)節(jié)處
  95.                         break;
  96.                 }
  97.                 case 2:                                                        //增大調(diào)整分鐘
  98.                 {
  99.                         g_min ++;
  100.                         if(g_min >= 60)                        //到達(dá)一小時(shí)的時(shí)間
  101.                         {
  102.                                 g_min = 0;       
  103.                         }                               
  104.                         Write_sfm(4,g_min);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  105.                         Locate_pos(2,4);                        //顯示位置重新回到調(diào)節(jié)處
  106.                
  107.                         break;
  108.                 }
  109.                 case 3:                                                        //增大調(diào)整小時(shí)
  110.                 {
  111.                         g_hour ++;
  112.                         if(g_hour >= 24)
  113.                         {
  114.                                 g_hour = 0;
  115.                         }
  116.                         Write_sfm(2,g_hour);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  117.                         Locate_pos(2,2);                        //顯示位置重新回到調(diào)節(jié)處
  118.                         break;
  119.                        
  120.                 }
  121.                 case 4:                                                        //增大調(diào)整星期
  122.                 {
  123.                         g_week ++;
  124.                         if(g_week >= 8)
  125.                         {
  126.                                 g_week = 1;
  127.                         }
  128.                         Write_week(g_week);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  129.                         Locate_pos(2,1);                        //顯示位置重新回到調(diào)節(jié)處
  130.                         break;
  131.                 }
  132.                 case 5:                                                    //增大調(diào)整日期
  133.                 {
  134.                         g_date ++;
  135.                         if(g_date >= 31)
  136.                         {
  137.                                 g_date = 1;
  138.                                 g_month ++;
  139.                                 if(g_month >= 13)//到達(dá)一年的時(shí)間
  140.                                 {
  141.                                         g_month = 1;
  142.                                         g_year++;
  143.                                         if(g_year >= 20)
  144.                                         {
  145.                                                 g_year = 9;
  146.                                         }
  147.                                 }

  148.                         }
  149.                         Write_nyr(6,g_date);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  150.                         Locate_pos(1,6);                        //顯示位置重新回到調(diào)節(jié)處
  151.                         break;
  152.                 }
  153.                 case 6:                                                        //增大調(diào)整月份
  154.                 {
  155.                         g_month ++;
  156.                         if(g_month >= 12)
  157.                         {
  158.                                 g_month = 1;
  159.                                 g_year ++;
  160.                                 if(g_year >= 20)
  161.                                 {
  162.                                         g_year = 9;
  163.                                 }
  164.                         }
  165.                         Write_nyr(4,g_month);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  166.                         Locate_pos(1,4);                        //顯示位置重新回到調(diào)節(jié)處
  167.                         break;
  168.                 }
  169.                 case 7:                                                        //增大調(diào)整年
  170.                 {
  171.                         g_year ++;
  172.                         if(g_year >= 20)
  173.                         {
  174.                                 g_year = 9;
  175.                         }
  176.                         Write_nyr(2,g_year);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  177.                         Locate_pos(1,2);                        //顯示位置重新回到調(diào)節(jié)處
  178.                         break;
  179.                 }
  180.                

  181.         }
  182. }


  183. /***********************************************
  184.         函數(shù)名:        Decrease_DS1302()
  185.         函數(shù)功能:   用于處理調(diào)整DS1302的數(shù)值之時(shí)
  186.                                 對(duì)調(diào)整的項(xiàng)目進(jìn)行數(shù)值減小
  187.         入口參數(shù):無(wú)
  188.         出口參數(shù):無(wú)
  189.         備          注:
  190. /***********************************************/
  191. void         Decrease_DS1302()                                                               
  192. {
  193.         switch(g_Set_DS1302_Num)
  194.         {
  195.                 case 1:                                                        //減小調(diào)整秒
  196.                 {
  197.                         g_sec --;
  198.                         if(g_sec <= 0)
  199.                         {
  200.                                 g_sec = 59;
  201.                         }
  202.                        
  203.                         Write_sfm(6,g_sec);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  204.                         Locate_pos(2,6);                        //顯示位置重新回到調(diào)節(jié)處
  205.                         break;
  206.                 }
  207.                 case 2:                                                        //減小調(diào)整分鐘
  208.                 {
  209.                         g_min --;
  210.                         if(g_min <= 0)
  211.                         {
  212.                                 g_min = 59;       
  213.                         }                               
  214.                         Write_sfm(4,g_min);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  215.                         Locate_pos(2,4);                        //顯示位置重新回到調(diào)節(jié)處
  216.                         break;
  217.                 }
  218.                 case 3:                                                        //減小調(diào)整小時(shí)
  219.                 {
  220.                         g_hour --;
  221.                         if(g_hour <= 0)
  222.                         {
  223.                                 g_hour = 23;
  224.                         }
  225.                         Write_sfm(2,g_hour);                        //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  226.                         Locate_pos(2,2);                        //顯示位置重新回到調(diào)節(jié)處
  227.                         break;
  228.                        
  229.                 }
  230.                 case 4:                                                        //減小調(diào)整星期
  231.                 {
  232.                         g_week --;
  233.                         if(g_week <= 0)
  234.                         {
  235.                                 g_week = 7;
  236.                         }
  237.                         Write_week(g_week);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  238.                         Locate_pos(2,1);                        //顯示位置重新回到調(diào)節(jié)處
  239.                         break;
  240.                 }
  241.                 case 5:                                                        //減小調(diào)整日期
  242.                 {
  243.                         g_date --;
  244.                         if(g_date <= 0)
  245.                         {
  246.                                 g_date = 31;
  247.                         }

  248.                         Write_nyr(6,g_date);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  249.                         Locate_pos(1,6);                        //顯示位置重新回到調(diào)節(jié)處
  250.                         break;
  251.                 }
  252.                 case 6:                                                        //減小調(diào)整月份
  253.                 {
  254.                         g_month --;
  255.                         if(g_month <= 0)
  256.                         {
  257.                                 g_month = 12;
  258.                                 g_year --;
  259.                                 if(g_year <= 8)
  260.                                 {
  261.                                         g_year = 20;
  262.                                 }

  263.                         }
  264.                         Write_nyr(4,g_month);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  265.                         Locate_pos(1,4);                        //顯示位置重新回到調(diào)節(jié)處
  266.                         break;
  267.                 }
  268.                 case 7:                                                        //減小調(diào)整年
  269.                 {
  270.                         g_year --;
  271.                         if(g_year <= 8)
  272.                         {
  273.                                 g_year = 20;
  274.                         }
  275.                         Write_nyr(2,g_year);                //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
  276.                         Locate_pos(1,2);                        //顯示位置重新回到調(diào)節(jié)處
  277.                         break;
  278.                 }
  279.                
  280.         }
  281. }
  282. /************************************************
  283.         函數(shù)名:        void Locate_A()
  284.         函數(shù)功能:        給變項(xiàng)目時(shí)對(duì)鬧鐘的調(diào)整項(xiàng)目進(jìn)行提示
  285.                                 并定位改變的項(xiàng)目
  286.         入口參數(shù):無(wú)
  287.         出口參數(shù):無(wú)
  288.         備          注:
  289. ************************************************/
  290. void        Locate_A()                                               
  291. {
  292.         switch(g_Set_Alarm_Num)
  293.         {
  294.                 case 1:     Write_Remind_Alarm_Time(1);       break;         //設(shè)置分鐘
  295.                                                        
  296.                 case 2:          Write_Remind_Alarm_Time(2);                  break;                //定位小時(shí)
  297.         }
  298. }
  299. /************************************************
  300.         函數(shù)名:        void A_Increase()
  301.         函數(shù)功能:  在調(diào)整鬧鈴的數(shù)值時(shí)對(duì)相應(yīng)的時(shí)分
  302.                                 進(jìn)行增加
  303.         入口參數(shù):        無(wú)
  304.         出口參數(shù):  無(wú)
  305.         備          注:
  306. ************************************************/
  307. void        A_Increase()
  308. {
  309.         switch(g_Set_Alarm_Num)
  310.         {
  311.                 case 1:                                                        //增加鬧鐘分鐘的時(shí)間                                          
  312.                 {
  313.                         g_Alarm_min ++;
  314.                         if(g_Alarm_min >= 60)
  315.                         {
  316.                                 g_Alarm_min = 0;
  317.                         }
  318.                         Write_Remind_Alarm_Time        (1);                                //讀取設(shè)置后的鬧鈴時(shí)間
  319.                         Write_Add_24c02                        (1,g_Alarm_min);                //24C02存數(shù)據(jù)

  320.                         break;
  321.                 }
  322.                 case 2:                                                        //增加鬧鐘小時(shí)的時(shí)間                                          
  323.                 {
  324.                         g_Alarm_hour ++;
  325.                         if(g_Alarm_hour >= 24)
  326.                         {
  327.                                 g_Alarm_hour = 0;
  328.                         }
  329.                         Write_Remind_Alarm_Time        (2);                        //讀取設(shè)置后的鬧鈴時(shí)間
  330.                         Write_Add_24c02                        (2,g_Alarm_hour);        //24C02存數(shù)據(jù)
  331.                         break;
  332.                 }
  333.         }
  334. }
  335. /************************************************
  336.         函數(shù)名:        A_Decrease()
  337.         函數(shù)功能:        調(diào)整鬧鈴時(shí)對(duì)鬧鈴的小時(shí)與分鐘進(jìn)行
  338.                                 減小
  339. ……………………

  340. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載(完整源碼打包):
我的超級(jí)時(shí)鐘.zip (163.52 KB, 下載次數(shù): 97)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:112693 發(fā)表于 2017-5-28 22:03 | 只看該作者
不錯(cuò),值得學(xué)習(xí)。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:46943 發(fā)表于 2017-6-16 08:13 | 只看該作者
好東西值得收藏
回復(fù)

使用道具 舉報(bào)

地板
ID:447482 發(fā)表于 2019-1-6 10:00 | 只看該作者
12864是帶字庫(kù)的嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:109763 發(fā)表于 2019-1-6 15:43 | 只看該作者
這就是我一直想要找的,好東西啊
回復(fù)

使用道具 舉報(bào)

6#
ID:242298 發(fā)表于 2019-10-11 06:15 | 只看該作者
不錯(cuò),值得學(xué)習(xí)。。
回復(fù)

使用道具 舉報(bào)

7#
ID:242298 發(fā)表于 2019-10-11 06:32 | 只看該作者
沒(méi)有電路圖。。!
回復(fù)

使用道具 舉報(bào)

8#
ID:340655 發(fā)表于 2019-10-11 14:09 | 只看該作者
代碼很棒,值得學(xué)習(xí),謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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