找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3536|回复: 15
收起左侧

关于单片机仿真时钟的问题,出了点显示的问题 显示混乱

[复制链接]
ID:87316 发表于 2016-1-10 16:31 | 显示全部楼层 |阅读模式
屏幕截图(24).png 程序调了很久都没用
回复

使用道具 举报

ID:87316 发表于 2016-1-10 16:32 | 显示全部楼层
这是什么原因呢
回复

使用道具 举报

ID:87316 发表于 2016-1-10 16:35 | 显示全部楼层
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int//蜂鸣器位定义
  4. sbit beep = P3^3 ;//DS1302相关操作线定义
  5. sbit RST = P1^1 ;
  6. sbit SCK = P1^2 ;
  7. sbit SDA = P1^3 ;  //按键定义,key1切换键,key2加,key3减,key4闹钟,年月日周
  8. sbit key1 = P1^4 ;
  9. sbit key2 = P1^5 ;
  10. sbit key3 = P1^6 ;
  11. sbit key4 = P1^7 ;
  12. uchar i,j,mod,flag,flag1=1 ;//控制定时器动态扫描数码管的第几位,j是定时读取时间。mod是对key1按下次数计数。flag切换闹钟,日期,和周.flag1为闹钟标志位
  13. //uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 写地址
  14. //uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};  //秒分时日月周年 读地址
  15. //共阳数码管码表,表示0-9和-。-表示时分秒的间隔.
  16. uchar code LED[11] =
  17. {
  18.     0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
  19. };
  20. uchar disbuf[8] =
  21. {
  22.     0x62,0xa2,0xf7,0x7a,0x28,0xf7,0x7e,0x7e
  23. };//定义时间日期的结构类型
  24. struct time
  25. {
  26.     uchar second ;
  27.     uchar minute ;
  28.     uchar hour ;
  29.    // uchar week ;
  30.     uchar day ;
  31.     uchar month ;
  32.     uchar year ;
  33. }
  34. current_time ;
  35. #define ctime current_time//定义闹钟的时分秒变量
  36. uchar asec,amin,ahour ;
  37. void delay(uint ms)
  38. {
  39.     uchar i ;
  40.     while(ms--)
  41.     for(i=135;i>0;i--);
  42. }//滴一声,用来按键伴音
  43. void di()
  44. {
  45.     uchar i ;
  46.     for(i=0;i<40;i++)
  47.     {
  48.         beep = 0 ;
  49.         delay(1) ;
  50.         beep = 1 ;
  51.         delay(1) ;
  52.     }
  53. }
  54. //滴滴,连续响两下。用来闹钟提醒。
  55. void didi()
  56. {
  57.     uchar i ;
  58.     for(i = 2; i>0; i--)
  59.     {
  60.         di();
  61.         delay(140);
  62.     }
  63. }//DS1302的写驱动,传入参数为一个地址和数据
  64. void write(uchar addr,uchar dat)
  65. {
  66.     uchar i ;
  67.     RST = 0 ;
  68.     SCK = 0 ;
  69.     RST = 1 ;
  70.     for(i=0;i<8;i++)
  71.     {
  72.         SCK = 0 ;
  73.         SDA = (bit)(addr&0x01) ;
  74.         addr >>=1 ;
  75.         SCK = 1 ;
  76.     }
  77.     for(i=0;i<8;i++)
  78.     {
  79.         SCK = 0 ;
  80.         SDA = (bit)(dat&0x01);           //下降沿写入,上升沿读入
  81.         dat >>= 1 ;
  82.         SCK = 1 ;
  83.     }
  84.     RST = 0 ;
  85. }

  86. //DS1302的读驱动,传入参数为一个地址,返回参数为读到的数据
  87. uchar read(uchar addr)
  88. {
  89.     uchar i,dat ;
  90.     RST = 0 ;
  91.     SCK = 0 ;
  92.     RST = 1 ;
  93.     for(i=0;i<8;i++)
  94.     {
  95.         SCK = 0 ;
  96.         SDA =(bit)(addr&0x01);
  97.         addr>>=1 ;
  98.         SCK = 1 ;
  99.     }
  100.     for(i=0;i<8;i++)
  101.     {
  102.         SCK=0 ;
  103.         dat>>=1 ;
  104.         if(SDA)
  105.         dat|=0x80 ;
  106.         SCK=1 ;
  107.     }
  108.    
  109.     RST=0 ;
  110.     dat=(dat/16*10)+(dat&0x0f);
  111.     return dat ;
  112. }
  113. //读取DS1302的时间和日期
  114. void read_time()
  115. {
  116.     ctime.second = read(0x81);
  117.     ctime.minute = read(0x83);
  118.     ctime.hour   = read(0x85);
  119.     ctime.day    = read(0x87);
  120.     ctime.month  = read(0x89);
  121.     //ctime.week   = read(0x8b);
  122.     ctime.year   = read(0x8d);
  123. }
  124. //设定时间和日期
  125. void set_time()
  126. {
  127.     if(!flag)
  128.     {
  129.         write(0x8e,0x00);
  130.         write(0x80,((ctime.second/10)<<4|(ctime.second%10)));
  131.         write(0x82,((ctime.minute/10)<<4|(ctime.minute%10)));
  132.         write(0x84,((ctime.hour/10)<<4|(ctime.hour%10)));
  133.         write(0x8e,0x80);
  134.     }
  135.     else
  136.     {
  137.         write(0x8e,0x00);
  138.         write(0x86,((ctime.day/10)<<4|(ctime.day%10)));
  139.         write(0x88,((ctime.month/10)<<4|(ctime.month%10)));
  140.         //write(0x8a,((ctime.week/10)<<4|(ctime.week%10)));
  141.         write(0x8c,((ctime.year/10)<<4|(ctime.year%10)));
  142.         write(0x8e,0x80);
  143.     }
  144.     flag1=1 ;
  145. }
  146. //刷新显示缓冲区
  147. void refbuf()
  148. {
  149.     switch(flag)
  150.     {
  151.         case 1 :
  152.         disbuf[0] = LED[ctime.day%10];
  153.         disbuf[1] = LED[ctime.day/10];
  154.         disbuf[2] = 0xbf ;                 //10111111 -
  155.         disbuf[3] = LED[ctime.month%10];
  156.         disbuf[4] = LED[ctime.month/10];
  157.         disbuf[5] = 0xbf ;
  158.         disbuf[6] = LED[ctime.year%10];
  159.         disbuf[7] = LED[ctime.year/10];
  160.         break ;
  161.         /*case 2 :
  162.         disbuf[0] = 0xbf ;
  163.         disbuf[1] = 0xbf ;
  164.         disbuf[2] = 0xbf ;
  165.         disbuf[3] = 0xbf ;
  166.         disbuf[4] = LED[ctime.week] ;
  167.         disbuf[5] = 0xbf ;
  168.         disbuf[6] = 0xbf ;
  169.         disbuf[7] = 0xbf ;
  170.         break ;*/
  171.         case 2 :
  172.         disbuf[0] = LED[asec%10];
  173.         disbuf[1] = LED[asec/10];
  174.         disbuf[2] = 0xbf;
  175.         disbuf[3] = LED[amin%10];
  176.         disbuf[4] = LED[amin/10];
  177.         disbuf[5] = 0xbf;
  178.         disbuf[6] = LED[ahour%10];
  179.         disbuf[7] = LED[ahour/10];
  180.         break ;
  181.         default :
  182.         disbuf[0] = LED[ctime.second%10];
  183.         disbuf[1] = LED[ctime.second/10];
  184.         disbuf[2] = 0xbf;
  185.         disbuf[3] = LED[ctime.minute%10];
  186.         disbuf[4] = LED[ctime.minute/10];
  187.         disbuf[5] = 0xbf;
  188.         disbuf[6] = LED[ctime.hour%10];
  189.         disbuf[7] = LED[ctime.hour/10];
  190.     }
  191. }
  192. //键盘扫描
  193. void keyscan()
  194. {
  195.     if(key1 == 0)
  196.     {
  197.         delay(5);
  198.         if(key1 == 0)
  199.         {
  200.             while(!key1); //key1用来调节时间和日期、闹钟
  201.             mod++;//mod标示调节时间的时候对应的闪烁位,mod=1秒位或天或闹钟的秒,mod=2是分位,mod=3是小时位
  202.             di();//退出调节功能,返回正常显示
  203.             if(mod == 4)
  204.             {
  205.                 set_time();
  206.                 mod = 0 ;
  207.             }
  208.         }
  209.     } //调节加1,因为涉及到时分秒,年月日周和闹钟的调节,所以写的比较复杂,应该有更精简的代码。
  210.     if(key2==0)
  211.     {
  212.         delay(5);
  213.         if(key2==0)
  214.         {
  215.             while(!key2);
  216.             di();
  217.             switch(mod)
  218.             {
  219.                 case 1 :
  220.                 ctime.second++;
  221.                 if(ctime.second==60)
  222.                 ctime.second=0 ;
  223.                 break ;
  224.                 case 2 :
  225.                 ctime.minute++;
  226.                 if(ctime.minute==60)
  227.                 ctime.minute=0 ;
  228.                 break ;
  229.                 case 3 :
  230.                 ctime.hour++;
  231.                 if(ctime.hour==24)
  232.                 ctime.hour=0 ;
  233.                 break ;
  234.             } //flag=0时默认调节时分秒,=1时调节年月日,=2时调节周,=3时调节闹钟,=4时就返回正常显示,flag又key4来控制。
  235.             if(flag==1)
  236.             {
  237.                 switch(mod)
  238.                 {
  239.                     case 1 :
  240.                     ctime.day++;
  241.                     if(ctime.day==32)
  242.                     ctime.day=0 ;
  243.                     break ;
  244.                     case 2 :
  245.                     ctime.month++;
  246.                     if(ctime.month==13)
  247.                     ctime.month=0 ;
  248.                     break ;
  249.                     case 3 :
  250.                     ctime.year++;
  251.                     if(ctime.year==100)
  252.                     ctime.year=0 ;
  253.                     break ;
  254.                 }
  255.             }
  256.            /* if(flag==2)
  257.             {
  258.                 if(mod==1)
  259.                 {
  260.                     ctime.week++;
  261.                     if(ctime.week==8)
  262.                     ctime.week=1 ;
  263.                 }
  264.             }*/
  265.             if(flag==2)
  266.             {
  267.                 switch(mod)
  268.                 {
  269.                     case 1 :
  270.                     asec++;
  271.                     if(asec==60)
  272.                     asec=0 ;
  273.                     break ;
  274.                     case 2 :
  275.                     amin++;
  276.                     if(amin==60)
  277.                     amin=0 ;
  278.                     break ;
  279.                     case 3 :
  280.                     ahour++;
  281.                     if(ahour==24)
  282.                     ahour=0 ;
  283.                     break ;
  284.                 }
  285.             }
  286.         }
  287.     }//调节减1,功能与key2相似。
  288.     if(key3==0)
  289.     {
  290.         delay(5);
  291.         if(key3==0)
  292.         {
  293.             while(!key3);
  294.             di();
  295.             switch(mod)
  296.             {
  297.                 case 1 :
  298.                 if(ctime.second==0)
  299.                 ctime.second=60 ;
  300.                 ctime.second--;
  301.                 break ;
  302.                 case 2 :
  303.                 if(ctime.minute==0)
  304.                 ctime.minute=60 ;
  305.                 ctime.minute--;
  306.                 break ;
  307.                 case 3 :
  308.                 if(ctime.hour==0)
  309.                 ctime.hour=24 ;
  310.                 ctime.hour--;
  311.                 break ;
  312.             }
  313.             if(flag==1)
  314.             {
  315.                 switch(mod)
  316.                 {
  317.                     case 1 :
  318.                     if(ctime.day==0)
  319.                     ctime.day=32 ;
  320.                     ctime.day--;
  321.                     break ;
  322.                     case 2 :
  323.                     if(ctime.month==0)
  324.                     ctime.month=13 ;
  325.                     ctime.month--;
  326.                     break ;
  327.                     case 3 :
  328.                     if(ctime.year==0)
  329.                     ctime.year=100 ;
  330.                     ctime.year--;
  331.                     break ;
  332.                 }
  333.             }
  334.            /* if(flag==2)
  335.             {
  336.                 if(mod==1)
  337.                 {
  338.                     if(ctime.week==1)
  339.                     ctime.week=8 ;
  340.                     ctime.week--;
  341.                 }
  342.             }  */
  343.             if(flag==2)
  344.             {
  345.                 switch(mod)
  346.                 {
  347.                     case 1 :
  348.                     if(asec==0)
  349.                     asec=60 ;
  350.                     asec--;
  351.                     break ;
  352.                     case 2 :
  353.                     if(amin==0)
  354.                     amin=60 ;
  355.                     amin--;
  356.                     break ;
  357.                     case 3 :
  358.                     if(ahour==0)
  359.                     ahour=24 ;
  360.                     ahour--;
  361.                     break ;
  362.                 }
  363.             }
  364.         }
  365.     }
  366.     if(key4==0)
  367.     {
  368.         delay(5);
  369.         if(key4==0)
  370.         {
  371.             while(!key4);
  372.             di();
  373.             flag++;
  374.             if(flag==3)
  375.             {
  376.                 flag=0 ;
  377.                 flag1=1 ;                                           //KEY4按一次显示日期,按2次显示闹钟
  378.             }
  379.         }
  380.     }
  381. }
  382. //初始化,定时器定时3ms用来动态扫描数码管显示
  383. void init()
  384. {
  385.     TMOD = 0X01 ;

  386.     TH0  = (65536-3000)/256 ;
  387.     TL0  = (65536-3000)%256 ;

  388.     TR0  = 1 ;
  389.     ET0  = 1 ;

  390.     EA   = 1 ;
  391. /* write(0x8e,0x00);   //第一次写DS1302芯片,不然开始显示乱码,只需要初始化一次就行了,以后就屏蔽掉
  392.      write(0x80,0X10);
  393.      write(0x82,0X10);
  394.      write(0x84,0X10);
  395.      write(0x86,0x23);
  396.      write(0x88,0x07);
  397.      write(0x8a,0x06);
  398.      write(0x8c,0x11);
  399.      write(0x8e,0x80);*/
  400.     read_time();
  401.     //每次初始化的时候都读取时钟芯片的时间,用来显示。
  402. }

  403. void main()
  404. {
  405.     init();
  406.     while(1)
  407.     {
  408.         keyscan();
  409.         //闹钟判断,默认响1min,同时按下key2和key3关掉闹钟
  410.         if(amin==ctime.minute&&ahour==ctime.hour&&flag1)
  411.         {
  412.             didi();
  413.             if((key2==0)&&(key3==0))
  414.             {
  415.                 delay(5);
  416.                 if((key2==0)&&(key3==0))
  417.                 flag1=0 ;
  418.             }
  419.         }
  420.     }
  421. }
  422. void time0()interrupt 1
  423. {
  424.     TH0=(65536-3000)/256 ;
  425.     TL0=(65536-3000)%256 ;
  426.     if(i==8)
  427.     {
  428.         i=0 ;
  429.         j++;
  430.     }
  431.     //实现调节是闪烁的效果
  432.     if(mod|flag)
  433.     {
  434.         if(j==10)
  435.         {
  436.             switch(mod)
  437.             {
  438.                 case 1 :
  439.                 disbuf[0]=0xff ;
  440.                 disbuf[1]=0xff ;
  441.                 break ;
  442.                 case 2 :
  443.                 disbuf[3]=0xff ;
  444.                 disbuf[4]=0xff ;
  445.                 break ;
  446.                 case 3 :
  447.                 disbuf[6]=0xff ;
  448.                 disbuf[7]=0xff ;
  449.                 break ;
  450.             }
  451.         }
  452.     }
  453.     P2=~(0x80>>i);
  454.     P0=disbuf[i];
  455.     i++;
  456.     //3msx8x20,大约480ms从DS1302芯片读取一下时间
  457.     if(j==20)
  458.     {
  459.         j=0 ;
  460.         refbuf();
  461.         if(mod==0)
  462.         read_time();
  463.     }
  464. }
复制代码
回复

使用道具 举报

ID:87316 发表于 2016-1-10 16:39 | 显示全部楼层
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int//蜂鸣器位定义
  4. sbit beep = P3^3 ;//DS1302相关操作线定义
  5. sbit RST = P1^1 ;
  6. sbit SCK = P1^2 ;
  7. sbit SDA = P1^3 ;  //按键定义,key1切换键,key2加,key3减,key4闹钟,年月日周
  8. sbit key1 = P1^4 ;
  9. sbit key2 = P1^5 ;
  10. sbit key3 = P1^6 ;
  11. sbit key4 = P1^7 ;
  12. uchar i,j,mod,flag,flag1=1 ;//控制定时器动态扫描数码管的第几位,j是定时读取时间。mod是对key1按下次数计数。flag切换闹钟,日期,和周.flag1为闹钟标志位
  13. //uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 写地址
  14. //uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};  //秒分时日月周年 读地址
  15. //共阳数码管码表,表示0-9和-。-表示时分秒的间隔.
  16. uchar code LED[11] =
  17. {
  18.     0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
  19. };
  20. uchar disbuf[8] =
  21. {
  22.     0x62,0xa2,0xf7,0x7a,0x28,0xf7,0x7e,0x7e
  23. };//定义时间日期的结构类型
  24. struct time
  25. {
  26.     uchar second ;
  27.     uchar minute ;
  28.     uchar hour ;
  29.    // uchar week ;
  30.     uchar day ;
  31.     uchar month ;
  32.     uchar year ;
  33. }
  34. current_time ;
  35. #define ctime current_time//定义闹钟的时分秒变量
  36. uchar asec,amin,ahour ;
  37. void delay(uint ms)
  38. {
  39.     uchar i ;
  40.     while(ms--)
  41.     for(i=135;i>0;i--);
  42. }//滴一声,用来按键伴音
  43. void di()
  44. {
  45.     uchar i ;
  46.     for(i=0;i<40;i++)
  47.     {
  48.         beep = 0 ;
  49.         delay(1) ;
  50.         beep = 1 ;
  51.         delay(1) ;
  52.     }
  53. }
  54. //滴滴,连续响两下。用来闹钟提醒。
  55. void didi()
  56. {
  57.     uchar i ;
  58.     for(i = 2; i>0; i--)
  59.     {
  60.         di();
  61.         delay(140);
  62.     }
  63. }//DS1302的写驱动,传入参数为一个地址和数据
  64. void write(uchar addr,uchar dat)
  65. {
  66.     uchar i ;
  67.     RST = 0 ;
  68.     SCK = 0 ;
  69.     RST = 1 ;
  70.     for(i=0;i<8;i++)
  71.     {
  72.         SCK = 0 ;
  73.         SDA = (bit)(addr&0x01) ;
  74.         addr >>=1 ;
  75.         SCK = 1 ;
  76.     }
  77.     for(i=0;i<8;i++)
  78.     {
  79.         SCK = 0 ;
  80.         SDA = (bit)(dat&0x01);           //下降沿写入,上升沿读入
  81.         dat >>= 1 ;
  82.         SCK = 1 ;
  83.     }
  84.     RST = 0 ;
  85. }

  86. //DS1302的读驱动,传入参数为一个地址,返回参数为读到的数据
  87. uchar read(uchar addr)
  88. {
  89.     uchar i,dat ;
  90.     RST = 0 ;
  91.     SCK = 0 ;
  92.     RST = 1 ;
  93.     for(i=0;i<8;i++)
  94.     {
  95.         SCK = 0 ;
  96.         SDA =(bit)(addr&0x01);
  97.         addr>>=1 ;
  98.         SCK = 1 ;
  99.     }
  100.     for(i=0;i<8;i++)
  101.     {
  102.         SCK=0 ;
  103.         dat>>=1 ;
  104.         if(SDA)
  105.         dat|=0x80 ;
  106.         SCK=1 ;
  107.     }
  108.    
  109.     RST=0 ;
  110.     dat=(dat/16*10)+(dat&0x0f);
  111.     return dat ;
  112. }
  113. //读取DS1302的时间和日期
  114. void read_time()
  115. {
  116.     ctime.second = read(0x81);
  117.     ctime.minute = read(0x83);
  118.     ctime.hour   = read(0x85);
  119.     ctime.day    = read(0x87);
  120.     ctime.month  = read(0x89);
  121.     //ctime.week   = read(0x8b);
  122.     ctime.year   = read(0x8d);
  123. }
  124. //设定时间和日期
  125. void set_time()
  126. {
  127.     if(!flag)
  128.     {
  129.         write(0x8e,0x00);
  130.         write(0x80,((ctime.second/10)<<4|(ctime.second%10)));
  131.         write(0x82,((ctime.minute/10)<<4|(ctime.minute%10)));
  132.         write(0x84,((ctime.hour/10)<<4|(ctime.hour%10)));
  133.         write(0x8e,0x80);
  134.     }
  135.     else
  136.     {
  137.         write(0x8e,0x00);
  138.         write(0x86,((ctime.day/10)<<4|(ctime.day%10)));
  139.         write(0x88,((ctime.month/10)<<4|(ctime.month%10)));
  140.         //write(0x8a,((ctime.week/10)<<4|(ctime.week%10)));
  141.         write(0x8c,((ctime.year/10)<<4|(ctime.year%10)));
  142.         write(0x8e,0x80);
  143.     }
  144.     flag1=1 ;
  145. }
  146. //刷新显示缓冲区
  147. void refbuf()
  148. {
  149.     switch(flag)
  150.     {
  151.         case 1 :
  152.         disbuf[0] = LED[ctime.day%10];
  153.         disbuf[1] = LED[ctime.day/10];
  154.         disbuf[2] = 0xbf ;                 //10111111 -
  155.         disbuf[3] = LED[ctime.month%10];
  156.         disbuf[4] = LED[ctime.month/10];
  157.         disbuf[5] = 0xbf ;
  158.         disbuf[6] = LED[ctime.year%10];
  159.         disbuf[7] = LED[ctime.year/10];
  160.         break ;
  161.         /*case 2 :
  162.         disbuf[0] = 0xbf ;
  163.         disbuf[1] = 0xbf ;
  164.         disbuf[2] = 0xbf ;
  165.         disbuf[3] = 0xbf ;
  166.         disbuf[4] = LED[ctime.week] ;
  167.         disbuf[5] = 0xbf ;
  168.         disbuf[6] = 0xbf ;
  169.         disbuf[7] = 0xbf ;
  170.         break ;*/
  171.         case 2 :
  172.         disbuf[0] = LED[asec%10];
  173.         disbuf[1] = LED[asec/10];
  174.         disbuf[2] = 0xbf;
  175.         disbuf[3] = LED[amin%10];
  176.         disbuf[4] = LED[amin/10];
  177.         disbuf[5] = 0xbf;
  178.         disbuf[6] = LED[ahour%10];
  179.         disbuf[7] = LED[ahour/10];
  180.         break ;
  181.         default :
  182.         disbuf[0] = LED[ctime.second%10];
  183.         disbuf[1] = LED[ctime.second/10];
  184.         disbuf[2] = 0xbf;
  185.         disbuf[3] = LED[ctime.minute%10];
  186.         disbuf[4] = LED[ctime.minute/10];
  187.         disbuf[5] = 0xbf;
  188.         disbuf[6] = LED[ctime.hour%10];
  189.         disbuf[7] = LED[ctime.hour/10];
  190.     }
  191. }
  192. //键盘扫描
  193. void keyscan()
  194. {
  195.     if(key1 == 0)
  196.     {
  197.         delay(5);
  198.         if(key1 == 0)
  199.         {
  200.             while(!key1); //key1用来调节时间和日期、闹钟
  201.             mod++;//mod标示调节时间的时候对应的闪烁位,mod=1秒位或天或闹钟的秒,mod=2是分位,mod=3是小时位
  202.             di();//退出调节功能,返回正常显示
  203.             if(mod == 4)
  204.             {
  205.                 set_time();
  206.                 mod = 0 ;
  207.             }
  208.         }
  209.     } //调节加1,因为涉及到时分秒,年月日周和闹钟的调节,所以写的比较复杂,应该有更精简的代码。
  210.     if(key2==0)
  211.     {
  212.         delay(5);
  213.         if(key2==0)
  214.         {
  215.             while(!key2);
  216.             di();
  217.             switch(mod)
  218.             {
  219.                 case 1 :
  220.                 ctime.second++;
  221.                 if(ctime.second==60)
  222.                 ctime.second=0 ;
  223.                 break ;
  224.                 case 2 :
  225.                 ctime.minute++;
  226.                 if(ctime.minute==60)
  227.                 ctime.minute=0 ;
  228.                 break ;
  229.                 case 3 :
  230.                 ctime.hour++;
  231.                 if(ctime.hour==24)
  232.                 ctime.hour=0 ;
  233.                 break ;
  234.             } //flag=0时默认调节时分秒,=1时调节年月日,=2时调节周,=3时调节闹钟,=4时就返回正常显示,flag又key4来控制。
  235.             if(flag==1)
  236.             {
  237.                 switch(mod)
  238.                 {
  239.                     case 1 :
  240.                     ctime.day++;
  241.                     if(ctime.day==32)
  242.                     ctime.day=0 ;
  243.                     break ;
  244.                     case 2 :
  245.                     ctime.month++;
  246.                     if(ctime.month==13)
  247.                     ctime.month=0 ;
  248.                     break ;
  249.                     case 3 :
  250.                     ctime.year++;
  251.                     if(ctime.year==100)
  252.                     ctime.year=0 ;
  253.                     break ;
  254.                 }
  255.             }
  256.            /* if(flag==2)
  257.             {
  258.                 if(mod==1)
  259.                 {
  260.                     ctime.week++;
  261.                     if(ctime.week==8)
  262.                     ctime.week=1 ;
  263.                 }
  264.             }*/
  265.             if(flag==2)
  266.             {
  267.                 switch(mod)
  268.                 {
  269.                     case 1 :
  270.                     asec++;
  271.                     if(asec==60)
  272.                     asec=0 ;
  273.                     break ;
  274.                     case 2 :
  275.                     amin++;
  276.                     if(amin==60)
  277.                     amin=0 ;
  278.                     break ;
  279.                     case 3 :
  280.                     ahour++;
  281.                     if(ahour==24)
  282.                     ahour=0 ;
  283.                     break ;
  284.                 }
  285.             }
  286.         }
  287.     }//调节减1,功能与key2相似。
  288.     if(key3==0)
  289.     {
  290.         delay(5);
  291.         if(key3==0)
  292.         {
  293.             while(!key3);
  294.             di();
  295.             switch(mod)
  296.             {
  297.                 case 1 :
  298.                 if(ctime.second==0)
  299.                 ctime.second=60 ;
  300.                 ctime.second--;
  301.                 break ;
  302.                 case 2 :
  303.                 if(ctime.minute==0)
  304.                 ctime.minute=60 ;
  305.                 ctime.minute--;
  306.                 break ;
  307.                 case 3 :
  308.                 if(ctime.hour==0)
  309.                 ctime.hour=24 ;
  310.                 ctime.hour--;
  311.                 break ;
  312.             }
  313.             if(flag==1)
  314.             {
  315.                 switch(mod)
  316.                 {
  317.                     case 1 :
  318.                     if(ctime.day==0)
  319.                     ctime.day=32 ;
  320.                     ctime.day--;
  321.                     break ;
  322.                     case 2 :
  323.                     if(ctime.month==0)
  324.                     ctime.month=13 ;
  325.                     ctime.month--;
  326.                     break ;
  327.                     case 3 :
  328.                     if(ctime.year==0)
  329.                     ctime.year=100 ;
  330.                     ctime.year--;
  331.                     break ;
  332.                 }
  333.             }
  334.            /* if(flag==2)
  335.             {
  336.                 if(mod==1)
  337.                 {
  338.                     if(ctime.week==1)
  339.                     ctime.week=8 ;
  340.                     ctime.week--;
  341.                 }
  342.             }  */
  343.             if(flag==2)
  344.             {
  345.                 switch(mod)
  346.                 {
  347.                     case 1 :
  348.                     if(asec==0)
  349.                     asec=60 ;
  350.                     asec--;
  351.                     break ;
  352.                     case 2 :
  353.                     if(amin==0)
  354.                     amin=60 ;
  355.                     amin--;
  356.                     break ;
  357.                     case 3 :
  358.                     if(ahour==0)
  359.                     ahour=24 ;
  360.                     ahour--;
  361.                     break ;
  362.                 }
  363.             }
  364.         }
  365.     }
  366.     if(key4==0)
  367.     {
  368.         delay(5);
  369.         if(key4==0)
  370.         {
  371.             while(!key4);
  372.             di();
  373.             flag++;
  374.             if(flag==3)
  375.             {
  376.                 flag=0 ;
  377.                 flag1=1 ;                                           //KEY4按一次显示日期,按2次显示闹钟
  378.             }
  379.         }
  380.     }
  381. }
  382. //初始化,定时器定时3ms用来动态扫描数码管显示
  383. void init()
  384. {
  385.     TMOD = 0X01 ;

  386.     TH0  = (65536-3000)/256 ;
  387.     TL0  = (65536-3000)%256 ;

  388.     TR0  = 1 ;
  389.     ET0  = 1 ;

  390.     EA   = 1 ;
  391. /* write(0x8e,0x00);   //第一次写DS1302芯片,不然开始显示乱码,只需要初始化一次就行了,以后就屏蔽掉
  392.      write(0x80,0X10);
  393.      write(0x82,0X10);
  394.      write(0x84,0X10);
  395.      write(0x86,0x23);
  396.      write(0x88,0x07);
  397.      write(0x8a,0x06);
  398.      write(0x8c,0x11);
  399.      write(0x8e,0x80);*/
  400.     read_time();
  401.     //每次初始化的时候都读取时钟芯片的时间,用来显示。
  402. }

  403. void main()
  404. {
  405.     init();
  406.     while(1)
  407.     {
  408.         keyscan();
  409.         //闹钟判断,默认响1min,同时按下key2和key3关掉闹钟
  410.         if(amin==ctime.minute&&ahour==ctime.hour&&flag1)
  411.         {
  412.             didi();
  413.             if((key2==0)&&(key3==0))
  414.             {
  415.                 delay(5);
  416.                 if((key2==0)&&(key3==0))
  417.                 flag1=0 ;
  418.             }
  419.         }
  420.     }
  421. }
  422. void time0()interrupt 1
  423. {
  424.     TH0=(65536-3000)/256 ;
  425.     TL0=(65536-3000)%256 ;
  426.     if(i==8)
  427.     {
  428.         i=0 ;
  429.         j++;
  430.     }
  431.     //实现调节是闪烁的效果
  432.     if(mod|flag)
  433.     {
  434.         if(j==10)
  435.         {
  436.             switch(mod)
  437.             {
  438.                 case 1 :
  439.                 disbuf[0]=0xff ;
  440.                 disbuf[1]=0xff ;
  441.                 break ;
  442.                 case 2 :
  443.                 disbuf[3]=0xff ;
  444.                 disbuf[4]=0xff ;
  445.                 break ;
  446.                 case 3 :
  447.                 disbuf[6]=0xff ;
  448.                 disbuf[7]=0xff ;
  449.                 break ;
  450.             }
  451.         }
  452.     }
  453.     P2=~(0x80>>i);
  454.     P0=disbuf[i];
  455.     i++;
  456.     //3msx8x20,大约480ms从DS1302芯片读取一下时间
  457.     if(j==20)
  458.     {
  459.         j=0 ;
  460.         refbuf();
  461.         if(mod==0)
  462.         read_time();
  463.     }
  464. }
复制代码
回复

使用道具 举报

ID:87316 发表于 2016-1-10 16:39 | 显示全部楼层
怎么代码上传不了
回复

使用道具 举报

ID:99607 发表于 2016-1-10 16:54 | 显示全部楼层
楼主给你一个能用的程序,电路和你的差不多你可以参考对比一下:http://www.51hei.com/bbs/dpj-40329-1.html
回复

使用道具 举报

ID:102665 发表于 2016-1-10 17:42 | 显示全部楼层
好长的程序
回复

使用道具 举报

ID:102111 发表于 2016-1-10 19:21 | 显示全部楼层
显示部分没有做“消影”,于是显示出问题了,扫描显示的时候,要注意消影。
回复

使用道具 举报

ID:87316 发表于 2016-1-10 21:11 | 显示全部楼层
Antecer 发表于 2016-1-10 19:21
显示部分没有做“消影”,于是显示出问题了,扫描显示的时候,要注意消影。

不是太懂额,可以说下怎么弄吗?
回复

使用道具 举报

ID:102111 发表于 2016-1-10 21:14 | 显示全部楼层
本帖最后由 Antecer 于 2016-1-10 21:18 编辑
学会tan玩 发表于 2016-1-10 21:11
不是太懂额,可以说下怎么弄吗?

数码管的扫描流程:
1.关闭显示
2.输入段码
3.输入位码(开显示)
重复1-3八次完成整个扫描
回复

使用道具 举报

ID:87316 发表于 2016-1-10 21:20 | 显示全部楼层
Antecer 发表于 2016-1-10 21:14
数码管的扫描流程:
1.关闭显示
2.输入段码

哦,谢谢。来试试改程序
回复

使用道具 举报

ID:87316 发表于 2016-1-10 21:24 | 显示全部楼层
51黑论坛迷 发表于 2016-1-10 16:54
楼主给你一个能用的程序,电路和你的差不多你可以参考对比一下:http://www.51hei.com/bbs/dpj-40329-1.html

这区别有点大啊,我要用时钟芯片的
回复

使用道具 举报

ID:87316 发表于 2016-1-10 21:25 | 显示全部楼层
Antecer 发表于 2016-1-10 21:14
数码管的扫描流程:
1.关闭显示
2.输入段码

你知道程序大概怎么改么
回复

使用道具 举报

ID:87316 发表于 2016-1-10 21:39 | 显示全部楼层
有没有大神帮忙改一下程序啊,,明天就要上课了。。感激不尽啊 。。
回复

使用道具 举报

ID:87316 发表于 2016-1-11 08:21 | 显示全部楼层
Antecer 发表于 2016-1-10 21:14
数码管的扫描流程:
1.关闭显示
2.输入段码

不是消影的问题吧,我仿真时帧进还是那样子
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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