找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9933|回复: 22
收起左侧

16*64LED点阵时钟(移动+翻页显示)单片机源程序+proteus仿真

  [复制链接]
ID:140489 发表于 2018-4-19 13:14 | 显示全部楼层 |阅读模式
16*64LED点阵翻页时钟制作资料分享给大家,移动显示+翻页显示,带农历、温度,附件里有完整的源文件+仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
QQ截图20180419130415.jpg

单片机源码:
  1. /***********************************************************            
  2. 名称:                16*64点阵         
  3. MCU:                STC89C52
  4. 晶振:                22.1184M
  5. 时间:               
  6. 外部器件:        16*64点阵,ds1302
  7. 接线:                见DS1302.h,DS18B20.h和本主文件   
  8.    
  9. ***********************************************************/

  10. #include <REGX52.H>
  11. #include "DS1302.h"
  12. #include "DS18B20.h"
  13. #include "nongli.h"
  14. #include "zimo.h"

  15. #define H_PORT P0       //ABCD P1

  16. sbit RData         =         P2^0; //RData=P2^0,GData=P2^1
  17. sbit GData  =   P2^1;
  18. sbit L_CLK        =         P2^2;        
  19. sbit L_STB         =         P2^3;
  20. sbit R_OE   =         P2^4;  //R EN=P2^4,G EN=P2^5
  21. sbit G_OE   =   P2^5;

  22. //sbit Data=P2^1;         //RData=P2^0,GData=P2^1
  23. //sbit OE=P2^6;        //R EN=P2^5,G EN=P2^6
  24.                                                                   
  25. sbit key_add=P3^1;
  26. sbit key_dec=P3^2;
  27. sbit key_adj=P3^0;
  28. sbit key_esc=P3^3;

  29. /*
  30. //自己的家里的接线
  31. sbit H_CLK         =         P2^5;
  32. sbit H_D         =         P2^4;
  33. sbit L_CLK        =         P2^0; **
  34. sbit L_D         =         P2^2; **        
  35. sbit L_STB         =         P2^1;  **
  36. sbit L_OE   =         P2^6; **

  37. sbit key_add=        P3^7;
  38. sbit key_dec=        P3^5;
  39. sbit key_adj=   P3^6;
  40. sbit key_esc=   P3^4;        */

  41. #define FESTIVAL_MAX 9                        //定义农历节日数
  42. #define KEY_VAL 5               //定义按键手感

  43. /*#define DISP_EN()     
  44. {
  45.         R_OE=1     //4094高电平输出使能
  46.         G_OE=1
  47. }
  48. #define DISP_DIS()   
  49. {
  50.         R_OE=0;
  51.         G_OE=0;
  52. }  */

  53. SYSTEMTIME CurrentTime;
  54. unsigned char status=0;                        //按键状态
  55. unsigned char disp_mode=0;                //显示状态  
  56. unsigned char offset=0;                           //移动显示用的变量
  57. unsigned char disrow=0;                        //当前扫描行
  58. unsigned char k=0;                                //往buff中填的字
  59. unsigned int  t_counter=0,stop_counter=0,stop_time=0;
  60. unsigned char f1=18,f2=18,f3=18,f4=18,f5=18,f6=18;  //18就不会出现刚开始全部翻页的情况了.
  61. bit switch_flag=0,stop_bit=0;
  62. bit one_sec_flag=0,half_sec_flag;
  63. bit nongli_flag=0,nongli_change_flag=0,festival_flag=0;
  64. unsigned char T_int,T_dec;                //计算温度用
  65. unsigned char temp_time[6];     //翻页钟用到
  66. unsigned char festival_num;                //节日计数

  67. bit add_flag=0;
  68. bit dec_flag=0;
  69. bit adj_flag=0;
  70. bit esc_flag=0;

  71. unsigned char ka=0,kb=0,kc=0,kd=0;  //按键用


  72. unsigned char alarm_hour,alarm_min;
  73. bit alarm_enable=0,alarm_flag=0;

  74. unsigned char code mode[4]={0,1,7,8}; //几种显示模式的排列,依次为
  75.                                      //0:流动显示年月日+固定一段时间翻页钟
  76.                                      //1:翻页钟
  77.                                      //7:全部流动显示
  78.                                      //8:温度
  79. unsigned char date[53]=
  80. {
  81.         10,10,10,10,10,10,10,10,                 //开头8个空格
  82.         2,0,                                                         //21世纪
  83.         0,9,                                                         //年数据        No.10,11
  84.         49,50,                                                        //“年”
  85.         0,1,                                                        //月数据         No.14,15
  86.         51,52,                                                        //“月”
  87.         0,1,                                                        //日数据        No.18,19
  88.         53,54,                                                        //“日”
  89.         
  90.         10,                                                 //空格
  91.         
  92.         55,56,57,58,                                        //“星期”
  93.         25,26,                                                        //星期几        No.27,28
  94.         
  95.         10,                                                                //空格
  96.         
  97.         0,0,                                                          //小时数据         No.30,31
  98.         11,                                                        // :                  No.32
  99.         0,0,                                                          //分钟数据         No.33,34
  100.         11,                                                            // :                No.35
  101.         0,0,                                                           //秒数据         No.36,37
  102.         
  103.         10,                                                                //空格
  104.         
  105.         10,10,12,10,13,14,                            //温度                 No.39,40,42
  106.                                        
  107.     10,10,10,10,10,10,10,10,       //MAX       No.52                                                                          
  108. };


  109. unsigned char code moon_date[48]=
  110. {
  111.     10,10,10,10,10,10,10,10,                 //开头8个空格
  112.     10,10,                          //No.8,9
  113.     10,10,                          //No.10,11
  114.     49,50,                          //“年”
  115.     10,10,                          //No.14,15
  116.     10,10,                          //No.16,17
  117.     51,52,                          //“月”
  118.     10,10,                          //No.20,21
  119.     10,10,                          //No.22,23
  120.     10,10,10,10,10,10,10,10,                 //开头8个空格
  121.     10,10,10,10,10,10,10,10,                 //开头8个空格
  122.     10,10,10,10,10,10,10,10,       //开头8个空格
  123. };
  124. unsigned char code init_date[]=
  125. {
  126.         10,10,10,10,10,10,10,10,                 //开头8个空格
  127.         2,0,                                                         //21世纪
  128.         0,9,                                                         //年数据        No.10,11
  129.         49,50,                                                        //“年”
  130.         0,1,                                                        //月数据         No.14,15
  131.         51,52,                                                        //“月”
  132.         0,1,                                                        //日数据        No.18,19
  133.         53,54,                                                        //“日”
  134.         
  135.         10,                                                 //空格
  136.         
  137.         55,56,57,58,                                        //“星期”
  138.         25,26,                                                        //星期几        No.27,28
  139.         
  140.         10,                                                                //空格
  141.         
  142.         0,0,                                                          //小时数据         No.30,31
  143.         11,                                                        // :                 No.32
  144.         0,0,                                                          //分钟数据         No.33,34
  145.         11,                                                            // :                No.35
  146.         0,0,                                                           //秒数据         No.36,37
  147.         
  148.         10,                                                                //空格
  149.         
  150.         10,10,12,10,13,14,                            //温度                 No.39,40,42
  151.                                        
  152.     10,10,10,10,10,10,10,10,       //MAX       No.52         
  153. };
  154. unsigned char code week_data[]={00,25,27,29,31,33,35,53};  //一二三四五六日
  155. unsigned char code moon_data1[]={45,43,47,29};        //初十廿三
  156. unsigned char code festival_table[][2]=
  157. {
  158.         {1,1},                //0 春节
  159.         {1,15},                //1 元宵
  160.         {44,44},        //2 清明    阳历的难以确定
  161.         {5,5},                //3 端午
  162.         {7,15},                //4 中元
  163.         {8,15},                //5 中秋
  164.         {9,9},                //6 重阳
  165.         {11,7},                //7 冬至
  166.         {12,30},        //8 除夕
  167. };
  168. unsigned char code qingming_table[6]=
  169. {
  170.     0x77,    //2000~2007
  171.     0x33,    //2008~2015
  172.     0x33,    //2016~2023
  173.     0x33,    //2024~2031
  174.     0x33,    //2032~2039
  175.     0x33,    //2040~2047
  176. };
  177. /*-----------线性排布,不需查表---------
  178. unsigned char code festival_data[]=
  179. {
  180. }
  181. -------------------------------------*/        

  182. void delay_nms(unsigned int count);
  183. void set_row(unsigned char row);
  184. void sendRbyte(unsigned char wdata);                                       
  185. void sendR2byte(unsigned char wdata,unsigned char n);        
  186. void Timer_init(void);
  187. void time_to_buff(void);
  188. void time_to_buff_all(void);
  189. void update_buff(void);
  190. void key_scan(void);
  191. void display(unsigned char mode);
  192. void get_temp(void);
  193. void shutter_clock(void);
  194. void festival_check(void);
  195. void alarm_check(void);
  196. void alarm(void);

  197. void main(void)
  198. {
  199.         Initial_DS1302();
  200.         time_to_buff_all();
  201.         
  202.         Timer_init();

  203.         while(1)
  204.         {
  205.         update_buff();
  206.         
  207.                  for(disrow=0;disrow<16;disrow++)                  //disrow,当前扫描的行
  208.                 {                        
  209.                         L_STB=0;
  210.                         set_row(disrow);                //行595的输出.依次点亮1~16行.
  211.                         display(disp_mode);
  212.                         L_STB=0;                        
  213.                         L_STB=1;                              
  214.                         R_OE=0;                   //列595输出
  215.                         G_OE=0;
  216.                         delay_nms(1);  //此处延时,请根据点阵闪烁状况加以调整,仿真时候无法仿真闪烁.这里延时可以调流动速度
  217.                         R_OE=1;        
  218.                         G_OE=1;
  219. /*************************************************        原始代码********************************************************/
  220. /*                    display(disp_mode);        
  221.             DISP_DIS();
  222.             set_row(disrow);                //行4094的输出.依次点亮1~16行.
  223.             L_STB=1;                                             
  224.                         DISP_EN();                    
  225.                         delay_nms(1);       //此处延时,请根据点阵闪烁状况加以调整,仿真时候无法仿真闪烁.         
  226. /*****************************************************        原始代码**************************************************/                                
  227.                 }        
  228.                 if(stop_counter>stop_time)
  229.                 {
  230.                         disp_mode=0;
  231.                         offset++;
  232.                         stop_counter=0;
  233.                         stop_bit=0;
  234.                 }
  235.         if(stop_bit==0) offset++;
  236.                 if(disp_mode==1)
  237.                 {
  238.                         if(f1<200) f1++;
  239.                         if(f2<200) f2++;
  240.                         if(f3<200) f3++;
  241.                         if(f4<200) f4++;
  242.                         if(f5<200) f5++;
  243.                         if(f6<200) f6++;
  244.                 }
  245.                 if(nongli_flag==0) key_scan();  //显示农历时调整会出现错误,图省力屏蔽了
  246.         }
  247. }

  248. void Timer_init(void)                                        //12.5ms中断一次
  249. {
  250.         EA=0;
  251.     ET0=1;      //开定时器中断   
  252.     TMOD=0x01;        //定时器0模式1
  253.     TH0=(65536-50000)/256;      //22.1184M晶振用这个
  254.     TL0=(65536-50000)%256;
  255.     //TH0=(65536-46080)/256;
  256.     //TL0=(65536-46080)%256;
  257.     TR0=1;                //开定时器运行
  258.     EA=1;        
  259. }

  260. void T0_ISP(void) interrupt 1 using 3        //定时器中断
  261. {        
  262.     TH0=(65536-50000)/256;
  263.     TL0=(65536-50000)%256;
  264.     //TH0=(65536-46080)/256;    //22.1184M晶振用这个
  265.     //TL0=(65536-46080)%256;
  266.         t_counter++;
  267.     if(t_counter==20) half_sec_flag=1;
  268.     if(t_counter==40) {t_counter=0;one_sec_flag=1;}
  269.         if(stop_bit==1) stop_counter++;
  270.    
  271.     if(ka!=0)
  272.         {   
  273.         ka--;
  274.         if(ka==0 && key_add==0) add_flag=1;
  275.     }         
  276.         else if(key_add==0)ka=KEY_VAL;
  277.    
  278.     if(kb!=0)
  279.         {   
  280.         kb--;
  281.         if(kb==0 && key_dec==0) dec_flag=1;
  282.     }         
  283.         else if(key_dec==0)kb=KEY_VAL;
  284.    
  285.     if(kc!=0)
  286.         {   
  287.         kc--;
  288.         if(kc==0 && key_adj==0) adj_flag=1;
  289.     }         
  290.         else if(key_adj==0)kc=KEY_VAL;
  291.    
  292.     if(kd!=0)
  293.         {   
  294.         kd--;
  295.         if(kd==0 && key_esc==0) esc_flag=1;
  296.     }         
  297.         else if(key_esc==0)kd=KEY_VAL;   
  298. }

  299. void update_buff(void)
  300. {
  301.     unsigned char i;
  302.     if(nongli_change_flag==1)
  303.     {
  304.         if(nongli_flag==1)
  305.         {
  306.             for(i=0;i<46;i++)
  307.                 date[i]=moon_date[i];
  308.                
  309.             DS1302_GetTime_ALL(&CurrentTime);
  310.             nongliCONV();

  311.             date[8]= (CurrentTime.Year+100-84)%10*2+59;   //从"甲"开始
  312.             date[9]= (CurrentTime.Year+100-84)%10*2+60;
  313.             date[10]=(CurrentTime.Year+100-84)%12*2+79;   //从"子"开始
  314.             date[11]=(CurrentTime.Year+100-84)%12*2+80;  
  315.                         
  316.             if(CurrentTime.Month<11)    //不显示为“零一月”
  317.             {   
  318.                                 if(CurrentTime.Month==1)
  319.                                 {
  320.                                         date[14]=108;                //"正"
  321.                                         date[15]=109;
  322.                                 }
  323.                                 else if(CurrentTime.Month==10)
  324.                 {
  325.                     date[14]=43;                //"十"
  326.                                         date[15]=44;
  327.                 }
  328.                 else
  329.                                 {
  330.                                         date[14]=CurrentTime.Month%10*2+23;     //月个位
  331.                                         date[15]=CurrentTime.Month%10*2+24;     //
  332.                                 }
  333.                 date[16]=51;
  334.                 date[17]=52;                            //"月"
  335.             
  336.                 switch(CurrentTime.Day)
  337.                 {
  338.                     case 10:
  339.                     date[18]=45;                        //"初"
  340.                     date[19]=46;
  341.                     date[20]=43;                        //"十"
  342.                     date[21]=44;
  343.                     break;
  344.                     
  345.                     case 20:
  346.                     date[18]=27;                        //"二"
  347.                     date[19]=28;
  348.                     date[20]=43;                        //"十"
  349.                     date[21]=44;
  350.                     break;
  351.                     
  352.                     case 30:
  353.                     date[18]=29;                        //"三"
  354.                     date[19]=30;
  355.                     date[20]=43;                        //"十"
  356.                     date[21]=44;
  357.                     break;                    
  358.                     
  359.                     default:                                 
  360.                     date[18]=moon_data1[CurrentTime.Day/10];     //日十位
  361.                     date[19]=moon_data1[CurrentTime.Day/10]+1;   //
  362.                     date[20]=CurrentTime.Day%10*2+23;     //日个位
  363.                     date[21]=CurrentTime.Day%10*2+24;     //
  364.                     break;
  365.                 }
  366.                 date[22]=10;
  367.                 date[23]=10;
  368.             }
  369.             else
  370.             {
  371.                 date[14]=43;                          //"十"
  372.                 date[15]=44;                          //           
  373.                 date[16]=CurrentTime.Month%10*2+23;   //月个位
  374.                 date[17]=CurrentTime.Month%10*2+24;   //  
  375.                 switch(CurrentTime.Day)
  376.                 {
  377.                     case 10:
  378.                     date[20]=45;                        //"初"
  379.                     date[21]=46;
  380.                     date[22]=43;                        //"十"
  381.                     date[23]=44;
  382.                     break;
  383.                     
  384.                     case 20:
  385.                     date[20]=27;                        //"二"
  386.                     date[21]=28;
  387.                     date[22]=43;                        //"十"
  388.                     date[23]=44;
  389.                     break;
  390.                     
  391.                     case 30:
  392.                     date[20]=29;                        //"三"
  393.                     date[21]=30;
  394.                     date[22]=43;                        //"十"
  395.                     date[23]=44;
  396.                     break;                    
  397.                     
  398.                     default:                                 
  399.                     date[20]=moon_data1[CurrentTime.Day/10];     //日十位
  400.                     date[21]=moon_data1[CurrentTime.Day/10]+1;   //
  401.                     date[22]=CurrentTime.Day%10*2+23;     //日个位
  402.                     date[23]=CurrentTime.Day%10*2+24;     //
  403.                     break;
  404.                 }
  405.             }
  406.             if(festival_flag==1)
  407.                         {
  408.                                 for(i=0;i<4;i++)
  409.                                 {
  410.                                         date[26+i]=110+4*festival_num+i;
  411.                                 }
  412.                         }
  413.             nongli_change_flag=0;
  414.         }
  415.         else
  416.         {
  417.             for(i=0;i<48;i++)
  418.                 date[i]=init_date[i];   
  419.                
  420.             time_to_buff_all();
  421.             nongli_change_flag=0;   
  422.         }
  423.     }   
  424.    
  425.         if(half_sec_flag==1&&nongli_flag==0)     //0.5S
  426.         {   
  427.         half_sec_flag=0;
  428. //                date[32]=10;           //秒点 闪烁
  429. //                date[35]=10;           //秒点 闪烁
  430.         time_to_buff();
  431.                 switch(status)
  432.                 {
  433.                         case 0:
  434.                         break;
  435.                         case 1:
  436.                         date[10]=103,date[11]=103;
  437.                         break;
  438.                         case 2:
  439.                         date[14]=103,date[15]=103;
  440.                         break;
  441.                         case 3:
  442.                         date[18]=103,date[19]=103;
  443.                         break;
  444.                         case 4:
  445.                         date[27]=103,date[28]=103;
  446.                         break;
  447.                         case 5:
  448.                         date[30]=103,date[31]=103;
  449.                         break;
  450.                         case 6:
  451.                         date[33]=103,date[34]=103;
  452.                         break;
  453.                         case 7:
  454.                         date[36]=103,date[37]=103;
  455.                         break;               
  456.             default:
  457.             break;
  458.                 }        
  459.         }                 
  460.         if(one_sec_flag==1&&nongli_flag==0)      //1.0S
  461.         {   
  462.                 one_sec_flag=0;
  463.         
  464.         if((disp_mode==8||k==0)&&nongli_flag==0) get_temp();
  465.         if(alarm_flag==1) alarm();
  466.                 date[32]=11;
  467.         date[35]=11;
  468.                 if(status!=0) time_to_buff_all();
  469.                 else time_to_buff();
  470.         }
  471. }

  472. void get_temp(void)                                                //读取温度
  473. {   
  474.         ReadTemperature();
  475.         date[39]=T_int/10;
  476.         date[40]=T_int%10;
  477.         date[42]=T_dec;
  478. }

  479. void festival_check(void)                                //判断是否节日
  480. {
  481.         unsigned char i;
  482.    
  483.     if(qingming_table[CurrentTime.Year>>3]&(0x80>>(CurrentTime.Year%8)))    //查清明节的表
  484.     i=1;
  485.     else i=0;
  486.    
  487.     if( (CurrentTime.Month==4) &&(CurrentTime.Day==(0x04+i)) )
  488.     {
  489.         festival_flag=1;
  490.                 festival_num=2;
  491.     }
  492.     else
  493.     {   
  494.         nongliCONV();
  495.         for(i=0;i<FESTIVAL_MAX;i++)
  496.         {
  497.             if((CurrentTime.Month==festival_table[i][0])&&(CurrentTime.Day==festival_table[i][1]))
  498.             {
  499.                 festival_flag=1;
  500.                 festival_num=i;
  501.                 break;
  502.             }
  503.             else festival_flag=0;
  504.         }
  505.     }        
  506. }

  507. void alarm_check(void)                  //判断是否闹铃
  508. {
  509.         if(alarm_enable==1)
  510.         {
  511.                 if(CurrentTime.Hour==alarm_hour&&CurrentTime.Minute==alarm_min)
  512.                         alarm_flag=1;
  513.         }
  514. }

  515. void alarm(void)                        //响闹铃
  516. {
  517.    
  518. }

  519. void display(unsigned char mode)                //送显示数据
  520. {
  521.         unsigned char i;
  522.         switch(mode)
  523.         {
  524.                 case 0:                    //流动暂停显示
  525.                 if(switch_flag==1)        {k=0;switch_flag=0;}
  526.                 for(i=0;i<8;i++)                  //送往8个4094的数据.
  527.                         sendRbyte(a[date[k+i]][disrow]);        
  528.                 sendR2byte(a[date[k+8]][disrow],offset);
  529.                 if(offset==8)
  530.                 {
  531.                         offset=0;k++;
  532.                         if(k==30&&nongli_flag==0) {stop_bit=1,stop_time=900,disp_mode=1;}//到了时间的时候停一下。
  533.                         if(k==39&&nongli_flag==0) {stop_bit=1,stop_time=40;}        //温度也停一下下。
  534.                         if(k>44&&nongli_flag==0)
  535.             {
  536.                 k=0;
  537.                 nongli_flag=~nongli_flag;
  538.                 nongli_change_flag=1;
  539.             }
  540.             if(k>24&&festival_flag==0&&nongli_flag==1)
  541.             {
  542.                 k=0;
  543.                 nongli_flag=~nongli_flag;
  544.                 nongli_change_flag=1;
  545.             }
  546.                         else if(k>30&&festival_flag==1&&nongli_flag==1)
  547.                         {
  548.                 k=0;
  549.                 nongli_flag=~nongli_flag;
  550.                 nongli_change_flag=1;
  551.             }
  552.                 }
  553.                 break;
  554.         
  555.         case 7:             //全部流动显示
  556.         if(switch_flag==1)        {k=0;switch_flag=0;}
  557.                 for(i=0;i<8;i++)                  //送往8个4094的数据.
  558.                         sendRbyte(a[date[k+i]][disrow]);        
  559.                 sendR2byte(a[date[k+8]][disrow],offset);
  560.                 if(offset==8)
  561.                 {
  562.                         offset=0;k++;
  563.                         if(nongli_flag==0&&k>44)
  564.             {
  565.                 k=0;
  566.                 nongli_flag=~nongli_flag;
  567.                 nongli_change_flag=1;
  568.             }
  569.             if(k>24&&festival_flag==0&&nongli_flag==1)
  570.             {
  571.                 k=0;
  572.                 nongli_flag=~nongli_flag;
  573.                 nongli_change_flag=1;
  574.             }
  575.                         else if(k>30&&festival_flag==1&&nongli_flag==1)
  576.                         {
  577.                 k=0;
  578.                 nongli_flag=~nongli_flag;
  579.                 nongli_change_flag=1;
  580.             }
  581.                 }
  582.         break;
  583.         
  584.         case 8:         //固定显示温度
  585.         for(i=0;i<8;i++)                  //送往8个4094的数据.
  586.                         sendRbyte(a[date[39+i]][disrow]);        
  587.         break;        
  588.         
  589.                 case 1:                        //翻页钟显示
  590.                 shutter_clock();
  591.                 break;
  592.                
  593.                 case 2:                                           //显示时间
  594.                 if(switch_flag==1)        {/*k=23;*/switch_flag=0;}
  595.                 if(k<30)
  596.                 {
  597.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  598.                                 sendRbyte(a[date[k+i]][disrow]);        
  599.                         sendR2byte(a[date[k+8]][disrow],offset);
  600.                         if(offset==8)
  601.                         {
  602.                                 offset=0;k++;
  603.                         }
  604.                 }
  605.                 if(k==30)
  606.                 {
  607.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  608.                                 sendRbyte(a[date[30+i]][disrow]);        
  609.                 }
  610.                 break;
  611.                         
  612.                 case 3:                                           //显示年               
  613.                 if(switch_flag==1)        {k=0;switch_flag=0;}
  614.                 if(k<10)
  615.                 {
  616.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  617.                                 sendRbyte(a[date[k+i]][disrow]);        
  618.                         sendR2byte(a[date[k+8]][disrow],offset);
  619.                         if(offset==8)
  620.                         {
  621.                                 offset=0;k++;
  622.                         }
  623.                 }
  624.                 if(k==10)
  625.                 {
  626.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  627.                                 sendRbyte(a[date[10+i]][disrow]);        
  628.                 }
  629.                 break;
  630.                
  631.                 case 4:                                           //显示月
  632.                 if(switch_flag==1)        {k=10;switch_flag=0;}
  633.                 if(k<14)
  634.                 {
  635.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  636.                                 sendRbyte(a[date[k+i]][disrow]);        
  637.                         sendR2byte(a[date[k+8]][disrow],offset);
  638.                         if(offset==8)
  639.                         {
  640.                                 offset=0;k++;
  641.                         }
  642.                 }
  643.                 if(k==14)
  644.                 {
  645.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  646.                                 sendRbyte(a[date[14+i]][disrow]);        
  647.                 }
  648.                 break;
  649.                
  650.                 case 5:                                           //显示日
  651.                 if(switch_flag==1)        {k=14;switch_flag=0;}               
  652.                 if(k<18)
  653.                 {
  654.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  655.                                 sendRbyte(a[date[k+i]][disrow]);        
  656.                         sendR2byte(a[date[k+8]][disrow],offset);
  657.                         if(offset==8)
  658.                         {
  659.                                 offset=0;k++;
  660.                         }
  661.                 }
  662.                 if(k==18)
  663.                 {
  664.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  665.                                 sendRbyte(a[date[18+i]][disrow]);        
  666.                 }
  667.                 break;

  668.                 case 6:                                           //显示星期
  669.                 if(switch_flag==1)        {k=18;switch_flag=0;}
  670.                 if(k<23)
  671.                 {
  672.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  673.                                 sendRbyte(a[date[k+i]][disrow]);        
  674.                         sendR2byte(a[date[k+8]][disrow],offset);
  675.                         if(offset==8)
  676.                         {
  677.                                 offset=0;k++;
  678.                         }
  679.                 }
  680.                 if(k==23)
  681.                 {
  682.                         for(i=0;i<8;i++)                  //送往8个4094的数据.
  683.                                 sendRbyte(a[date[23+i]][disrow]);        
  684.                 }
  685.                 break;

  686.                 default:
  687.                 break;               
  688.         }               
  689. }


  690. void shutter_clock(void)                                //翻页钟
  691. {
  692.                 if(date[30]!=temp_time[0]) f1=0;                                                                //时十位
  693.                 if(f1<17)
  694.                 {
  695.                         if(date[30]==0) sendRbyte(a[15][disrow+f1]);
  696.                         else sendRbyte(a[date[30]-1][disrow+f1]);
  697.                 }
  698.                 else sendRbyte(a[date[30]][disrow]);               
  699.                
  700.                 if(date[31]!=temp_time[1]) f2=0;                                                                //时个位
  701.                 if(f2<17)
  702.                 {
  703.                         if(date[31]==0) sendRbyte(a[17][disrow+f2]);
  704.                         else sendRbyte(a[date[31]-1][disrow+f2]);
  705.                 }
  706.                 else sendRbyte(a[date[31]][disrow]);
  707.         
  708.                 sendRbyte(a[date[32]][disrow]);                                                            //冒号
  709.                
  710.                 if(date[33]!=temp_time[2]) f3=0;                                                                //分十位
  711.                 if(f3<17)
  712.                 {
  713.                         if(date[33]==0) sendRbyte(a[19][disrow+f3]);
  714.                         else sendRbyte(a[date[33]-1][disrow+f3]);
  715.                 }
  716.                 else sendRbyte(a[date[33]][disrow]);               
  717.                
  718.                 if(date[34]!=temp_time[3]) f4=0;                                                                //分个位
  719.                 if(f4<17)
  720.                 {
  721.                         if(date[34]==0) sendRbyte(a[21][disrow+f4]);
  722.                         else sendRbyte(a[date[34]-1][disrow+f4]);
  723.                 }
  724.                 else sendRbyte(a[date[34]][disrow]);
  725.                
  726.                 sendRbyte(a[date[35]][disrow]);                                                            //冒号
  727.                
  728.                 if(date[36]!=temp_time[4]) f5=0;                                                                //秒十位
  729.                 if(f5<17)
  730.                 {
  731.                         if(date[36]==0) sendRbyte(a[19][disrow+f5]);
  732.                         else sendRbyte(a[date[36]-1][disrow+f5]);
  733.                 }
  734.                 else sendRbyte(a[date[36]][disrow]);
  735.                
  736.                 if(date[37]!=temp_time[5]) f6=0;                                                                //秒个位
  737.                 if(f6<17)
  738.                 {
  739.                         if(date[37]==0) sendRbyte(a[21][disrow+f6]);
  740.                         else sendRbyte(a[date[37]-1][disrow+f6]);
  741.                 }
  742.                 else sendRbyte(a[date[37]][disrow]);               
  743. }        

  744. void delay_nms(unsigned int count)                //软件延时
  745. {
  746.         unsigned int i,j;
  747.         for(i=0;i<count;i++)
  748.         for(j=0;j<240;j++);                                  //120 改成45看看
  749. }

  750. void set_row(unsigned char row)         //选定显示行
  751. {
  752.         H_PORT=(row&0x0f);
  753. }

  754. void sendRbyte(unsigned char wdata)                                                //模拟spi的方式往列4094传送字模数据
  755. {
  756.         unsigned char i;
  757.         for(i=0;i<8;i++)
  758.         {
  759.                 L_CLK=0;                //时钟拉低
  760.                 RData=~wdata&0x80;
  761. //                GData=~wdata&0x80;
  762.                 L_CLK=1;                //时钟拉高,产生上升沿               
  763.                 wdata <<= 1;        //左移一位
  764.         }
  765. }

  766. void sendR2byte(unsigned char wdata,unsigned char n)        //模拟spi的方式往列4094传送字模数据
  767. {
  768.         unsigned char i;
  769.         for(i=0;i<n;i++)
  770.         {
  771.                 L_CLK=0;                //时钟拉低
  772.                 RData=~wdata&0x80;
  773. //                GData=~wdata&0x80;
  774.                 L_CLK=1;                //时钟拉高,产生上升沿               
  775.                 wdata <<= 1;        //左移一位
  776.         }
  777. }

  778. void time_to_buff(void)                                        //读取时间
  779. {
  780.         DS1302_GetTime(&CurrentTime);
  781.    
  782.     if(CurrentTime.Second<1) alarm_check();
  783.    
  784.         temp_time[0]=date[30];
  785.         temp_time[1]=date[31];
  786.         temp_time[2]=date[33];
  787.         temp_time[3]=date[34];
  788.         temp_time[4]=date[36];
  789.         temp_time[5]=date[37];
  790.         
  791.            date[30]=CurrentTime.Hour/10;                    //小时
  792.            date[31]=CurrentTime.Hour%10;                      //小时
  793.            date[33]=CurrentTime.Minute/10;                 //分钟
  794.            date[34]=CurrentTime.Minute%10;                  //分钟
  795.            date[36]=CurrentTime.Second/10;                  //秒
  796.            date[37]=CurrentTime.Second%10;                  //秒         
  797.    
  798.         if(date[30]==0&date[31]==0&date[33]==0&date[34]==0&date[36]==0&date[37]==0)
  799.         {
  800.                    date[10]=CurrentTime.Year/10;            //年
  801.                    date[11]=CurrentTime.Year%10;            //年
  802.                    date[14]=CurrentTime.Month/10;            //月
  803.                    date[15]=CurrentTime.Month%10;            //月
  804.                    date[18]=CurrentTime.Day/10;                  //日
  805.                    date[19]=CurrentTime.Day%10;                  //日
  806.         
  807.         date[27]=week_data[CurrentTime.Week];
  808.         date[28]=week_data[CurrentTime.Week]+1;
  809.                
  810.                 festival_check();
  811.         }
  812. }

  813. void time_to_buff_all(void)                                //读取全部时间
  814. {
  815.         DS1302_GetTime_ALL(&CurrentTime);
  816.    
  817.     if(CurrentTime.Second<1) alarm_check();
  818.    
  819.     temp_time[0]=date[30];
  820.         temp_time[1]=date[31];
  821.         temp_time[2]=date[33];
  822.         temp_time[3]=date[34];
  823.         temp_time[4]=date[36];
  824.         temp_time[5]=date[37];
  825.    
  826.            date[30]=CurrentTime.Hour/10;                    //小时
  827.            date[31]=CurrentTime.Hour%10;                      //小时
  828.            date[33]=CurrentTime.Minute/10;                 //分钟
  829.            date[34]=CurrentTime.Minute%10;                  //分钟
  830.            date[36]=CurrentTime.Second/10;                  //秒
  831.            date[37]=CurrentTime.Second%10;                  //秒         
  832.         
  833.            date[10]=CurrentTime.Year/10;                //年
  834.            date[11]=CurrentTime.Year%10;                //年
  835.            date[14]=CurrentTime.Month/10;                //月
  836.            date[15]=CurrentTime.Month%10;                //月
  837.            date[18]=CurrentTime.Day/10;                      //日
  838.            date[19]=CurrentTime.Day%10;                      //日
  839.     date[27]=week_data[CurrentTime.Week];  //星期
  840.     date[28]=week_data[CurrentTime.Week]+1;//星期
  841.    
  842.         festival_check();
  843. }

  844. void key_scan(void)                                                //扫描按键
  845. {
  846.     static unsigned char mode_counter=0;
  847.         if(adj_flag==1)
  848.         {
  849.         adj_flag=0;
  850.         //disp_status=NORMAL;
  851.         //status_change_flag=1;
  852.             stop_bit=0;
  853.                         offset=0;
  854.                         switch_flag=1;
  855.                         status++;
  856.                         if(status>7) status=1;
  857.                         time_to_buff_all();

  858.         }               
  859.         if(esc_flag==1)
  860.         {
  861.         esc_flag=0;
  862.         //disp_status=NORMAL;
  863.         //status_change_flag=1;
  864.             stop_bit=0;
  865.                         disp_mode=0;                        //退出时方式为流动显示
  866.                         k=0;
  867.                         offset=0;
  868.                         status=0;
  869.                         time_to_buff_all();
  870.         }

  871.         
  872.         switch(status)
  873.         {
  874.                 case 0:                          //显示模式调整
  875.                 if(add_flag==1)
  876.                 {
  877.             add_flag=0;
  878.                 stop_bit=0;
  879.                                 offset=0;
  880.                                 switch_flag=1;
  881.                 mode_counter++;
  882.                                 if(mode_counter>3) mode_counter=0;
  883.                 disp_mode=mode[mode_counter];

  884.                 }
  885.                 if(dec_flag==1)
  886.                 {
  887.             dec_flag=0;
  888.                                 offset=0;
  889.                 stop_bit=0;
  890.                                 switch_flag=1;
  891.                                 if(mode_counter==0) mode_counter=3;
  892.                 else mode_counter--;
  893.                 disp_mode=mode[mode_counter];
  894.                 }               
  895.                 break;               
  896.                                 
  897.                 case 1:                        //年调整
  898.                 disp_mode=3;
  899.                 if(add_flag==1)
  900.                 {
  901.             add_flag=0;
  902.                                 CurrentTime.Year++;
  903.                                 if(CurrentTime.Year>99) CurrentTime.Year=0;
  904.                                 DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year));
  905.                 }
  906.                 if(dec_flag==1)
  907.                 {
  908.             dec_flag=0;
  909.                                 if(CurrentTime.Year>0) CurrentTime.Year--;
  910.                                 if(CurrentTime.Year==0) CurrentTime.Year=99;
  911.                                 DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year));
  912.                 }
  913.                 break;

  914.                   case 2:                        //月调整
  915.                 disp_mode=4;
  916.                 if(add_flag==1)
  917.                 {
  918.             add_flag=0;
  919.                                 CurrentTime.Month++;
  920.                                 if(CurrentTime.Month>12) CurrentTime.Month=1;
  921.                                 DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month));
  922.                 }
  923.                 if(dec_flag==1)
  924.                 {
  925.             dec_flag=0;
  926.                                 if(CurrentTime.Month>0) CurrentTime.Month--;
  927.                                 if(CurrentTime.Month==0) CurrentTime.Month=12;
  928.                                 DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month));
  929.                 }
  930.                 break;

  931.                 case 3:                        //日调整
  932.                 disp_mode=5;
  933.                 if(add_flag==1)
  934.                 {
  935.             add_flag=0;
  936.                                 CurrentTime.Day++;
  937.                                 if(CurrentTime.Day>31) CurrentTime.Day=1;
  938.                                 DS1302_SetTime(DS1302_DAY,(CurrentTime.Day));
  939.                 }
  940.                 if(dec_flag==1)
  941.                 {
  942.             dec_flag=0;
  943.                                 if(CurrentTime.Day>0) CurrentTime.Day--;
  944.                                 if(CurrentTime.Day==0) CurrentTime.Day=31;
  945.                                 DS1302_SetTime(DS1302_DAY,(CurrentTime.Day));
  946.                 }
  947.                 break;

  948.                 case 4:                        //星期调整
  949.                 disp_mode=6;
  950.                 if(add_flag==1)
  951.                 {
  952.             add_flag=0;
  953.                                 CurrentTime.Week++;
  954.                                 if(CurrentTime.Week>7) CurrentTime.Week=1;
  955.                                 DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week));
  956.                 }
  957.                 if(dec_flag==1)
  958.                 {
  959.             dec_flag=0;
  960.                                 if(CurrentTime.Week>1) CurrentTime.Week--;
  961.                                 if(CurrentTime.Week==1) CurrentTime.Week=7;
  962.                                 DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week));
  963.                 }
  964.                 break;

  965.                 case 5:                        //小时调整
  966.                 disp_mode=2;
  967.                 if(add_flag==1)
  968.                 {
  969.             add_flag=0;
  970.                                 CurrentTime.Hour++;
  971.                                 if(CurrentTime.Hour>23) CurrentTime.Hour=0;
  972.                                 DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour));
  973.                 }
  974.                 if(dec_flag==1)
  975.                 {
  976.             dec_flag=0;
  977.                                 if(CurrentTime.Hour>0) CurrentTime.Hour--;
  978.                                 if(CurrentTime.Hour==0) CurrentTime.Hour=23;
  979.                                 DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour));
  980.                 }
  981.                 break;

  982.                 case 6:                        //分钟调整
  983.                 disp_mode=2;
  984.                 if(add_flag==1)
  985.                 {
  986.             add_flag=0;
  987.                                 CurrentTime.Minute++;
  988.                                 if(CurrentTime.Minute>59) CurrentTime.Minute=0;
  989.                                 DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute));
  990.                 }
  991.                 if(dec_flag==1)
  992.                 {
  993.             dec_flag=0;
  994.                                 if(CurrentTime.Minute>0) CurrentTime.Minute--;
  995.                                 if(CurrentTime.Minute==0) CurrentTime.Minute=59;
  996.                                 DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute));
  997.                 }
  998.                 break;

  999.                 case 7:                        //秒调整
  1000.                 disp_mode=2;
  1001.                 if(add_flag==1)
  1002.                 {
  1003.             add_flag=0;                                
  1004.                                 CurrentTime.Second++;
  1005.                                 if(CurrentTime.Second>59) CurrentTime.Second=0;
  1006.                                 DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second));
  1007.                 }
  1008.                 if(dec_flag==1)
  1009.                 {
  1010.             dec_flag=0;                                
  1011.                                 if(CurrentTime.Second>0) CurrentTime.Second--;
  1012.                                 if(CurrentTime.Second==0) CurrentTime.Second=59;
  1013.                                 DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second));
  1014.                 }
  1015.                 break;

  1016.                 default:
  1017.                 break;
  1018.         }
  1019. }
复制代码

0.jpg

全部资料51hei下载地址:
51电子钟_V2.41(适用于138_595四字屏).rar (240.64 KB, 下载次数: 476)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:146324 发表于 2018-5-30 21:20 | 显示全部楼层
不错。
支持一下。
有时间做一个。
回复

使用道具 举报

ID:228888 发表于 2018-11-8 17:55 | 显示全部楼层
收藏了,谢谢楼主无私分享,开始学单片机就是想独立做一个这样的时钟
回复

使用道具 举报

ID:399416 发表于 2018-12-12 15:24 | 显示全部楼层
多谢  已下载..........
回复

使用道具 举报

ID:140183 发表于 2019-3-1 21:51 | 显示全部楼层
多谢分享!下载看看。
回复

使用道具 举报

ID:300185 发表于 2019-3-4 20:54 | 显示全部楼层
为什么没有晶振和复位电路?
回复

使用道具 举报

ID:140489 发表于 2019-3-6 09:37 | 显示全部楼层
BOOKS 发表于 2019-3-4 20:54
为什么没有晶振和复位电路?

仿真可以不要晶振和复位电路的,但做实物必需要的
回复

使用道具 举报

ID:513131 发表于 2019-4-16 13:54 | 显示全部楼层
厉害了,我的哥,
回复

使用道具 举报

ID:110875 发表于 2019-4-24 19:46 | 显示全部楼层
lids 发表于 2019-3-6 09:37
仿真可以不要晶振和复位电路的,但做实物必需要的

不接电源单片机也可以正常工作,这就是仿真,不拘小节,但是做实物就很小气了!
回复

使用道具 举报

ID:492212 发表于 2019-4-25 12:36 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:269631 发表于 2019-9-16 08:59 | 显示全部楼层
支持一下。有时间做一个。
回复

使用道具 举报

ID:620287 发表于 2019-10-13 13:08 来自手机 | 显示全部楼层
是单色屏?接线口的R G是什么意思
回复

使用道具 举报

ID:623232 发表于 2019-10-13 14:27 | 显示全部楼层
羡慕啊
回复

使用道具 举报

ID:165363 发表于 2019-11-27 19:47 | 显示全部楼层
感谢楼主,学习一下数字翻页显示。
回复

使用道具 举报

ID:420321 发表于 2019-11-28 16:57 | 显示全部楼层
这个可以有,之前用的12864做的电子钟,没有用点阵做这个
回复

使用道具 举报

ID:159604 发表于 2020-6-7 16:55 | 显示全部楼层
下载了,有空试试
回复

使用道具 举报

ID:780252 发表于 2020-6-19 11:17 | 显示全部楼层
感谢支持一下。 有时间做一个。
回复

使用道具 举报

ID:235055 发表于 2020-7-7 08:22 | 显示全部楼层
收藏了,谢谢楼主无私分享
回复

使用道具 举报

ID:800832 发表于 2020-8-19 15:30 | 显示全部楼层
下载后编译发现读取不了时间,下载不编译的hex是正常的。不知道源程序做了什么修改
回复

使用道具 举报

ID:84791 发表于 2020-10-8 03:33 | 显示全部楼层
下载下来了,仿真看了,太厉害了。我看看什么时候能看懂学会,做一个出来。
回复

使用道具 举报

ID:257260 发表于 2020-10-21 17:19 | 显示全部楼层
完美运行!
回复

使用道具 举报

ID:88256 发表于 2020-12-3 21:43 | 显示全部楼层
图省事下载用里面的proteus仿真,谢谢了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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