找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3494|回复: 7
收起左侧

单片机12864时钟制作资料下载 代码注释详细

[复制链接]
ID:203086 发表于 2017-5-28 00:57 | 显示全部楼层 |阅读模式
12864时钟资料包(附件中可下载完整版的代码 而且注释非常详细):
0.png

单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:112693 发表于 2017-5-28 22:03 | 显示全部楼层
不错,值得学习!!!
回复

使用道具 举报

ID:46943 发表于 2017-6-16 08:13 | 显示全部楼层
好东西值得收藏
回复

使用道具 举报

ID:447482 发表于 2019-1-6 10:00 | 显示全部楼层
12864是带字库的吗
回复

使用道具 举报

ID:109763 发表于 2019-1-6 15:43 | 显示全部楼层
这就是我一直想要找的,好东西啊
回复

使用道具 举报

ID:242298 发表于 2019-10-11 06:15 | 显示全部楼层
不错,值得学习!!!
回复

使用道具 举报

ID:242298 发表于 2019-10-11 06:32 | 显示全部楼层
没有电路图啊!!!
回复

使用道具 举报

ID:340655 发表于 2019-10-11 14:09 | 显示全部楼层
代码很棒,值得学习,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表