久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4051|回復: 7
打印 上一主題 下一主題
收起左側

單片機12864時鐘制作資料下載 代碼注釋詳細

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


單片機源程序如下:
  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.         函數名:         Initial()
  9.         函數功能:        用于單片機開機后的第一次初始化
  10.         入口參數:無
  11.         出口參數:無
  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中讀取數據 鬧鐘的時分
  19.         g_Alarm_hour = Read_Add_24c02(2);

  20.         Initial_IIC();                                         //24c02的初始化
  21.                   
  22.     Initial_HW_Time();                                 //初始化紅外的定時器
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

紅外遙控部分:
  1. /***************************************************************
  2.         文件說明:本文件主要處理紅外因定時器與串口有重合
  3.                           的部分,故定時器0中采用判斷與標志位處理
  4.                           在調用本模塊時只需修改  Ir_work(void)
  5.                           并在主函數中調用        IRR_Work()以便讓整個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;        //紅外是否工作標志位的標志位
  15. uchar                        T0_Count;                                //T0的計數變量主要用于在串口工作時統計5s的時間
  16. /**********************************************
  17.         以下是紅外的變量
  18. ***********************************************/
  19. uchar                          irtime;               
  20. bit                         irpro_ok,irok;
  21. uchar                         IRcord[4];
  22. uchar                         irdata[33];
  23. /*********************************************
  24.         函數名:        Initial_HW_Time()
  25.         函數功能:        初始化紅外的定時器
  26.         入口參數:  無
  27.         出口參數:  無
  28.         備    注:
  29. *********************************************/

  30. void        Initial_HW_Time()               
  31. {
  32.     /*  因與顯示的頻率有一定的沖突故將備份如下
  33.         TMOD = 0x12;                                //定時器0工作方式2,TH0是重裝值,TL0是初值
  34.         TH0  = 0x00;                                 //重載值
  35.         TL0  = 0x00;                                 //初始化值
  36.         ET0  = 1;                                    //開中斷
  37.         TR0  = 1;                                   //開定時器0
  38.         IT0  = 1;                                   //指定外部中斷0下降沿觸發,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;                                //定時器0工作方式2,TH0是重裝值,TL0是初值
  47.         TH0  = 0x00;                                 //重載值
  48.         TL0  = 0x00;                                 //初始化值
  49.         ET0  = 1;                                    //開中斷
  50.         TR0  = 1;                                   //開定時器0
  51.         IT0  = 1;                                   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  52.     EX0  = 1;                                   //使能外部中斷
  53.     EA   = 1;                                    //開總中斷
  54. }

  55. /*********************************************
  56.         函數名:         T0_Time(void) interrupt 1
  57.         函數功能:        定時器0中斷處理
  58.         入口參數;   無
  59.         出口參數:  無
  60.         備    注:  因定時器處理與串口重疊
  61.                                 本函數利用標志位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)        //如果沒有串口工作則計紅外的時間
  68.         {
  69.                 irtime++;          //用于計數2個下降沿之間的時間
  70.         }
  71.         else                                        //否則統計5s的時間
  72.         {
  73.                 TH0 = 0x3c;                        //定時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.         函數名:        EX0_Ser(void) interrupt 0
  91.         函數功能:        外部中斷0服務函數
  92.         入口參數:  無
  93.         出口參數:  無
  94. ********************************************/
  95. void         EX0_Ser(void) interrupt 0                
  96. {
  97.         static unsigned char  i;             //接收紅外信號處理
  98.         static bit startflag;                //是否開始處理標志位

  99.         if(startflag)                        
  100.         {
  101.                 if(irtime < 65 &&irtime >= 33 )//引導碼 TC9012的頭碼,9ms+4.5ms
  102.                 {
  103.                         i = 0;
  104.                 }
  105.                 irdata[i] = irtime;//存儲每個電平的持續時間,用于以后判斷是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.         函數名:        Ir_work(void)
  122.         函數功能:        兼鍵值處理函數
  123.         入口參數:  無
  124.         出口參數:  無
  125.         備    注:        本函數主要用于處理按下遙控后的處理
  126.                                 處理操作標志位,是本文件中很核心的一個函數
  127. *****************************************************/
  128. void        Ir_work(void)                                               
  129. {
  130.         switch(IRcord[2])                                        //判斷第三個數碼值
  131.         {
  132.             case 0x0c:                                                //1 功能位置增加 顯示相應的按鍵值                                       
  133.                 {
  134.                         g_HongWai_Work_Flag = !g_HongWai_Work_Flag;//對紅外的標志位進行取反
  135.                         g_Alarm_Flag1 = 0;                                                        //對鬧鐘的兩個標志位清零,讓程序穩定
  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 顯示相應的按鍵值
  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;//前進
  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;        //處理完成標志
  169.        
  170. }
  171. /***************************************************
  172.         函數名:        Ircordpro(void)
  173.         函數功能:        紅外碼值處理函數 紅外碼值處理
  174.         入口參數:  無
  175.         出口參數:  無
  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個字節
  184.         {
  185.                 for(j = 1;j <= 8;j++) //處理1個字節8位
  186.                 {
  187.                         cord = irdata[k];
  188.                         if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
  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;        //處理完畢標志位置1
  202. }
  203. /******************************************************
  204.         函數名:        IRR_Work(void)
  205.         函數功能:  調用整個c文件        以便讓整個文件函數工作
  206.         入口參數:  無
  207.     出口參數:  無
  208.     備    注:
  209. ******************************************************/
  210. void        IRR_Work()
  211. ……………………

  212. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

串口:
  1. /***********************************************************
  2.                 本文件主要用來寫串口通信
  3.                 注:統計5s時間的函數寫在紅外里面了
  4.             若調用本文件的定時器  定期寫在最后 在工程中我把
  5.             定時器屏蔽掉
  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;        //串口調試的時候時間走動的時候標志位
  14. bit                        g_Send_Uart_Flag;                //串口發送給電腦的標志位

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

  32.         ET0  = 1;                                        //
  33.         SM0  = 0;                                        //設置串行口工作方式1,要與TMOD相對應
  34.         SM1  = 1;
  35.         EA   = 1;                                        //打開總中斷
  36.         ES   = 1;                                        //打開串行口中斷
  37.         REN  = 1;                                        //允許串行口接受,當TMOD = 0x21時要在設置好SM0,SM1后再寫
  38. }
  39. /****************************************************************
  40.         函數名稱:        Ser_Uart()
  41.         函數功能:        主要用于串口的中斷服務       
  42.         入口參數:        無
  43.         出口參數:        無
  44.         備          注:        進入計算機通信中斷后設定標志位
  45. *****************************************************************/
  46. void        Ser_Uart()                interrupt 4
  47. {        
  48.         RI          = 0;
  49.         Recieve_Time_Data    = SBUF;                //把接收的數據給時間標志位
  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;                                //串口服務的標志主要用于接收
  61.        
  62. }

  63. /***********************************************************
  64.         函數名稱:        Uart_Process()
  65.         函數功能:        串口處理
  66.         入口參數:        無
  67.         出口參數:        無
  68.         備    注:        本函數主要通過處理g_Recieve_Flag  g_Send_Uart_Flag
  69.                                 g_Run_Time_Uart_Flag來達到執行相應函數的目的
  70. ***********************************************************/
  71. void                Uart_Process()
  72. {
  73.         if(g_Recieve_Flag        ==  1)                        //如果出現標志位置1 則進行接收的處理
  74.         {
  75.                 g_Recieve_Flag = 0;
  76.                 ES                           = 0;
  77.                 TI                           = 1;
  78.                
  79.                 switch(g_Num_Uart)                                                //通過判斷串口發送的次數來進行相應的處理
  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:                                                        //對數據進行最后一次處理并退出串口中斷服務
  95.                                         {
  96.                                                 g_sec = Recieve_Time_Data  + g_sec;
  97.                                                 Write_sfm(6,g_sec);                        //把調節的數據寫在液晶屏上
  98.                                                 Locate_pos(2,2);                        //顯示位置重新回到調節處
  99.                                
  100.                                                 g_Num_Uart         = 0;
  101.                                                 g_Uart_Work_Flag   = 0;                        //串口工作的標志位清零退出串口工作
  102.                         g_Set_DS1302_Num  = 0;
  103.                                                 Write_1302_Date   ();                        //把數據寫進DS1302
  104.                                                 Write_12864_DS1302_Constant();        //把顯示DS1302時間的固定部分寫在液晶上
  105.                                                 Initial_HW_Time   ();                          //初始化紅外的定時器
  106.                                                 break;
  107.                                         }
  108.                         default:                                                        //為了讓程序穩定        對一些標志位繼續處理       
  109.                                         {
  110.                                                 g_Num_Uart         = 0;
  111.                                                 g_Uart_Work_Flag   = 0;                //串口工作的標志位清零退出串口工作
  112.                         g_Set_DS1302_Num   = 0;
  113.                                                 Write_1302_Date   ();                        //把數據寫進DS1302
  114.                                                 Write_12864_DS1302_Constant();        //把顯示DS1302時間的固定部分寫在液晶上
  115.                                                 Initial_HW_Time   ();                          //初始化紅外的定時器

  116.                                         }
  117.                        
  118.                 }
  119.        
  120.                 if(g_Num_Uart >= 15)                                        //增加程序的穩定性                       
  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)                        //進行發送給電腦數據的處理        發送后DS1302便會更改
  130.         {
  131.                 g_Send_Uart_Flag = 0;
  132.                 ES                  = 0;
  133.                 TI                  = 1;
  134.                 printf("\n\n\n                              現在時間是\n");
  135.                 printf("\n                     20%c%c年%c%c月%c%c日        %c%c時%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)                        //到達一秒的時間對DS1302的時間進行讀取更新
  149.         {
  150.                 g_Run_Time_Uart_Flag = 0;
  151.                 Read_All_DS1302_Date();                                //讀取DS1302的所有數據
  152.                 Display_DS1302_Time();                                //把讀取的數據顯示在液晶上
  153.         }


  154. }

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

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

  162. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
  1. /*******************************************************
  2.         文件說明:本文件主要用來寫DS1302與鬧鈴相應
  3.                           的按鍵按下之后對相應的數值進行處理的函數
  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.         函數名:   Di()
  13.         函數功能: 制造蜂鳴器的聲音
  14.         入口參數: 無
  15.         出口參數: 無
  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.         函數名:        Locate_DS1302()
  38.         函數功能:        用于調整DS1302時間時  定位游標
  39.                                 與提示改變的項目
  40.         入口參數:  無
  41.         出口參數:        無
  42.         備          注:
  43.        
  44. *************************************************/
  45. void         Locate_DS1302()                               
  46. {                       
  47.         Remind_DS1302_Exchange(g_Set_DS1302_Num);        //提示DS1302改變的項目
  48.         switch(g_Set_DS1302_Num)                                        //定位光標
  49.         {
  50.                 case 1:        Locate_pos(2,6);        break;        //第一次按下光標到秒位置
  51.                 case 2: Locate_pos(2,4);        break;        //第二次按下光標到分鐘位置
  52.                 case 3:        Locate_pos(2,2);        break;        //第三次按下光標到小時位置
  53.                 case 4: Locate_pos(2,1);        break;        //第四次按下光標到星期位置
  54.                 case 5:        Locate_pos(1,6);        break;        //第五次按下光標到日位置
  55.                 case 6:        Locate_pos(1,4);        break;        //第六次按下光標到月位置
  56.                 case 7: Locate_pos(1,2);        break;        //第七次按下光標到年位置
  57.                 default:                                                        //返回界面并對標志位進行處理
  58.                         {
  59.                                 g_Set_DS1302_Num = 0;
  60.                                 Initial_12864();
  61.                                 Initial_12864();                                 //初始化12864
  62.                                 Write_12864_DS1302_Constant();        //寫12864固定的部分
  63.                                 Write_1302_Date();                                //寫入 存儲數據
  64.                                 g_Alarm_Flag1 = 0;
  65.                                 g_Alarm_Flag2 = 0;
  66.                         }
  67.         }

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

  72. }



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

  84.         switch(g_Set_DS1302_Num)
  85.         {
  86.                 case 1:                                                        //增大調整秒
  87.                 {
  88.                         g_sec ++;
  89.                         if(g_sec >= 60)                                //到達一分鐘的時間               
  90.                         {
  91.                                 g_sec = 0;
  92.                         }
  93.                         Write_sfm(6,g_sec);                        //把調節的數據寫在液晶屏上
  94.                         Locate_pos(2,6);                        //顯示位置重新回到調節處
  95.                         break;
  96.                 }
  97.                 case 2:                                                        //增大調整分鐘
  98.                 {
  99.                         g_min ++;
  100.                         if(g_min >= 60)                        //到達一小時的時間
  101.                         {
  102.                                 g_min = 0;       
  103.                         }                               
  104.                         Write_sfm(4,g_min);                        //把調節的數據寫在液晶屏上
  105.                         Locate_pos(2,4);                        //顯示位置重新回到調節處
  106.                
  107.                         break;
  108.                 }
  109.                 case 3:                                                        //增大調整小時
  110.                 {
  111.                         g_hour ++;
  112.                         if(g_hour >= 24)
  113.                         {
  114.                                 g_hour = 0;
  115.                         }
  116.                         Write_sfm(2,g_hour);                        //把調節的數據寫在液晶屏上
  117.                         Locate_pos(2,2);                        //顯示位置重新回到調節處
  118.                         break;
  119.                        
  120.                 }
  121.                 case 4:                                                        //增大調整星期
  122.                 {
  123.                         g_week ++;
  124.                         if(g_week >= 8)
  125.                         {
  126.                                 g_week = 1;
  127.                         }
  128.                         Write_week(g_week);                //把調節的數據寫在液晶屏上
  129.                         Locate_pos(2,1);                        //顯示位置重新回到調節處
  130.                         break;
  131.                 }
  132.                 case 5:                                                    //增大調整日期
  133.                 {
  134.                         g_date ++;
  135.                         if(g_date >= 31)
  136.                         {
  137.                                 g_date = 1;
  138.                                 g_month ++;
  139.                                 if(g_month >= 13)//到達一年的時間
  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);                //把調節的數據寫在液晶屏上
  150.                         Locate_pos(1,6);                        //顯示位置重新回到調節處
  151.                         break;
  152.                 }
  153.                 case 6:                                                        //增大調整月份
  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);                //把調節的數據寫在液晶屏上
  166.                         Locate_pos(1,4);                        //顯示位置重新回到調節處
  167.                         break;
  168.                 }
  169.                 case 7:                                                        //增大調整年
  170.                 {
  171.                         g_year ++;
  172.                         if(g_year >= 20)
  173.                         {
  174.                                 g_year = 9;
  175.                         }
  176.                         Write_nyr(2,g_year);                //把調節的數據寫在液晶屏上
  177.                         Locate_pos(1,2);                        //顯示位置重新回到調節處
  178.                         break;
  179.                 }
  180.                

  181.         }
  182. }


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

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

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

  340. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:112693 發表于 2017-5-28 22:03 | 只看該作者
不錯,值得學習!!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

6#
ID:242298 發表于 2019-10-11 06:15 | 只看該作者
不錯,值得學習。!
回復

使用道具 舉報

7#
ID:242298 發表于 2019-10-11 06:32 | 只看該作者
沒有電路圖。。!
回復

使用道具 舉報

8#
ID:340655 發表于 2019-10-11 14:09 | 只看該作者
代碼很棒,值得學習,謝謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区 | 亚洲色图在线观看 | 欧美一区二区三区在线看 | 四虎永久在线精品免费一区二 | 九九热精品视频 | 麻豆成人在线视频 | 天天射中文 | 亚洲成人在线免费 | 亚洲一区免费视频 | 久久网亚洲 | wwww.xxxx免费 | 精品国产不卡一区二区三区 | a黄在线观看 | 亚洲精品一区在线观看 | 奇米av | 精品视频一区二区 | 中文字幕一级 | 亚洲精品在线观看网站 | 国产成人99久久亚洲综合精品 | 欧美aaaaa | 日韩精品a在线观看图片 | 久久久久久免费免费 | 久久er99热精品一区二区 | 日本免费小视频 | 欧美日韩一区精品 | www.9191.com | 日韩在线精品视频 | 欧美成人黄色小说 | 亚洲欧美精品 | 日本一区二区三区在线观看 | 在线a视频 | 国产一在线观看 | 一区二区日韩精品 | 亚洲欧洲激情 | 久久a久久 | 免费在线观看黄网站 | 欧美日韩亚洲在线 | 亚洲国产一区在线 | 中文字幕一区二区三区精彩视频 | www.国产视频 | 中文字幕亚洲在线 |