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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機仿真時鐘的問題,出了點顯示的問題 顯示混亂

[復制鏈接]
跳轉到指定樓層
樓主
程序調了很久都沒用
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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. }
復制代碼
回復

使用道具 舉報

5#
ID:87316 發表于 2016-1-10 16:39 | 只看該作者
怎么代碼上傳不了
回復

使用道具 舉報

6#
ID:99607 發表于 2016-1-10 16:54 | 只看該作者
樓主給你一個能用的程序,電路和你的差不多你可以參考對比一下:http://www.zg4o1577.cn/bbs/dpj-40329-1.html
回復

使用道具 舉報

7#
ID:102665 發表于 2016-1-10 17:42 | 只看該作者
好長的程序
回復

使用道具 舉報

8#
ID:102111 發表于 2016-1-10 19:21 | 只看該作者
顯示部分沒有做“消影”,于是顯示出問題了,掃描顯示的時候,要注意消影。
回復

使用道具 舉報

9#
ID:87316 發表于 2016-1-10 21:11 | 只看該作者
Antecer 發表于 2016-1-10 19:21
顯示部分沒有做“消影”,于是顯示出問題了,掃描顯示的時候,要注意消影。

不是太懂額,可以說下怎么弄嗎?
回復

使用道具 舉報

10#
ID:102111 發表于 2016-1-10 21:14 | 只看該作者
本帖最后由 Antecer 于 2016-1-10 21:18 編輯
學會tan玩 發表于 2016-1-10 21:11
不是太懂額,可以說下怎么弄嗎?

數碼管的掃描流程:
1.關閉顯示
2.輸入段碼
3.輸入位碼(開顯示)
重復1-3八次完成整個掃描
回復

使用道具 舉報

11#
ID:87316 發表于 2016-1-10 21:20 | 只看該作者
Antecer 發表于 2016-1-10 21:14
數碼管的掃描流程:
1.關閉顯示
2.輸入段碼

哦,謝謝。來試試改程序
回復

使用道具 舉報

12#
ID:87316 發表于 2016-1-10 21:24 | 只看該作者
51黑論壇迷 發表于 2016-1-10 16:54
樓主給你一個能用的程序,電路和你的差不多你可以參考對比一下:http://www.zg4o1577.cn/bbs/dpj-40329-1.html

這區別有點大啊,我要用時鐘芯片的
回復

使用道具 舉報

13#
ID:87316 發表于 2016-1-10 21:25 | 只看該作者
Antecer 發表于 2016-1-10 21:14
數碼管的掃描流程:
1.關閉顯示
2.輸入段碼

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

使用道具 舉報

14#
ID:87316 發表于 2016-1-10 21:39 | 只看該作者
有沒有大神幫忙改一下程序啊,,明天就要上課了。。感激不盡啊 。。
回復

使用道具 舉報

15#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级在线 | 国产精品日韩欧美一区二区三区 | 国产精品久久久久久久久久久免费看 | 日本涩涩视频 | 美女拍拍拍网站 | 午夜国产 | 色婷婷婷婷色 | 日韩精品一二三 | 欧美aⅴ在线观看 | 成人国产免费视频 | 中文字幕一区二区三区四区 | 亚洲成人日韩 | 在线日韩在线 | 久久久久国产精品一区 | 国产精品免费一区二区三区 | 成年人视频在线免费观看 | 欧美在线一区二区三区 | 亚洲狠狠丁香婷婷综合久久久 | 国产区精品在线观看 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲视频一区 | 久久精品超碰 | 欧美视频一区二区三区 | 国内精品一区二区三区 | 亚洲精品在线视频 | 精品一区二区三区在线视频 | 精品成人在线 | 91网站在线观看视频 | 日韩av一区二区在线观看 | 伊人伊人 | 亚洲网站在线观看 | 久久激情视频 | 国内精品久久影院 | 午夜资源 | 一区二区三区视频在线观看 | 亚洲三区在线观看 | 请别相信他免费喜剧电影在线观看 | 亚洲精品日韩视频 | 国产成人精品综合 | 日韩国产精品一区二区三区 | 国产成人免费视频网站高清观看视频 |