找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3293|回复: 5
打印 上一主题 下一主题
收起左侧

单片机数码管分两组显示,第一屏日期,第二屏时间,并且可调。每隔5s变化一次

[复制链接]
跳转到指定楼层
楼主
想要的结果是:如果按starts1 键,显示停止刷新进入调节时间和日期模式。(如果显示的是日期就调节日期,如果显示的是时间就调节时间),调节完后再按starts1键计时开始。

现在的问题是:进入keysanc函数后还是每隔5s变换显示。

帮助:我是初学者程序有好多比较啰嗦,还请帮忙修改指正,并能达到效果,172229507 谢谢谢!

  1. /*#include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit starts1=P3^4;
  5. sbit miaos2=P3^5;
  6. sbit fens3=P3^6;
  7. sbit shis4=P3^7;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. uchar code table[]={
  11. 0x3f,0x06,0x5b,0x4f,0x66,
  12. 0x6d,0x7d,0x07,0x7f,0x6f};
  13. uchar code table1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  14. uchar t,num,num1,nian ,yue ,ri,flag ,s6,s7,s8;
  15. char shi,fen,miao;
  16. void delay(uint x)     //延时函数
  17.    {
  18.       uint i,j;
  19.       for(i=x;i>0;i--)
  20.       for(j=110;j>0;j--);
  21.    }
  22. void display_seg(uchar num1,uchar num)  //显示函数
  23.   {
  24.      dula=1;
  25.      P0=table[num];
  26.      dula=0;
  27.      P0=0xff;        //消隐
  28.      wela=1;
  29.      P0=table1[num1];
  30.      wela=0;
  31.      delay(1);
  32. }
  33. void display1(uchar x,uchar y)      //分离函数
  34.    {
  35.         uint shi,ge;         //定义变量
  36.         shi=y/10;
  37.         ge=y%10;
  38.         if(x==1)          //x=1 表示年,
  39.           {
  40.                display_seg(5,shi);       //小时的十位
  41.                delay(2);
  42.                display_seg(4,ge);       //小时的个位
  43.                delay(2);
  44.           }
  45.         if(x==2)          //x=2 表示月
  46.          {
  47.                 display_seg(3,shi);       //分钟的十位
  48.                 delay(2);
  49.                 display_seg(2,ge);       //分钟的个位
  50.                 delay(2);
  51.         }
  52.       if(x==3)          //x=3 表示日
  53.         {
  54.              display_seg(1,shi);       //秒的十位
  55.              delay(2);
  56.             display_seg(0,ge);       //秒的个位
  57.             delay(2);
  58.        }
  59.   }

  60. void reflash1()       //刷新函数
  61. {
  62.      display1(1,nian);
  63.      display1(2,yue);
  64.      display1(3,ri);
  65. }


  66. void display2(uchar x,uchar y)      //分离函数
  67. {
  68.      uint shi,ge;         //定义变量
  69.      shi=y/10;
  70.      ge=y%10;
  71.      if(x==1)          //x=1 表示小时,
  72.        {
  73.              display_seg(5,shi);       //小时的十位
  74.              delay(2);
  75.              display_seg(4,ge);       //小时的个位
  76.              delay(2);
  77.        }
  78.       if(x==2)          //x=2 表示分钟
  79.        {
  80.               display_seg(3,shi);       //分钟的十位
  81.               delay(2);
  82.               display_seg(2,ge);       //分钟的个位
  83.               delay(2);
  84.        }
  85.       if(x==3)          //x=3 表示秒
  86.       {
  87.               display_seg(1,shi);       //秒的十位
  88.               delay(2);
  89.               display_seg(0,ge);       //秒的个位
  90.               delay(2);
  91.       }
  92. }

  93. void reflash2()       //刷新函数
  94. {
  95.      display2(1,nian);
  96.      display2(2,yue);
  97.      display2(3,ri);
  98. }

  99. void init()        //初始化 中断
  100. {
  101.      TMOD=0X01;
  102.      TH0=(65536-50000)/256;
  103.      TL0=(65536-50000)%256;
  104.      EA=1;
  105.      ET0=1;
  106.      TR0=1;
  107. }
  108. void keyscan1()       //按键加程序
  109. {
  110.        if(starts1==0)      //功能键,如果有按键按下记时停止,开始调节时间
  111.         {
  112.               delay(5);
  113.               if(starts1==0)
  114.                {
  115.                     TR0=~TR0;     //按键一次停止计数第二次案件开始计数
  116.                }while(!starts1);
  117.        }

  118.        if(miaos2==0)      //秒调节
  119.        {
  120.             TR0=0;       //关闭定时器
  121.              delay(5);
  122.              if(miaos2==0)
  123.                 {
  124.                     miao++;
  125.                     if(miao==60)
  126.                          miao=0;
  127.                }   while(!miaos2);     //去抖
  128.        }        

  129.        if(fens3==0)      //调节分钟
  130.        {
  131.              delay(5);
  132.              if(fens3==0)
  133.               {
  134.                      fen++;
  135.                       if(fen==60)
  136.                      fen=0;
  137.               }while(!fens3);      
  138.        }      
  139.   

  140.         if(shis4==0)      //调节时
  141.            {
  142.                 delay(5);
  143.                 if(shis4==0)
  144.                 {
  145.                      shi++;
  146.                      if(shi==24)
  147.                      shi=0;
  148.                 }while(!shis4);
  149.            }
  150. }

  151. void main()
  152. {
  153.       uint x,y;
  154.       init();
  155.       while(1)
  156.       {   
  157.             for(x=0;x<300;x++)
  158.             {
  159.                   reflash1();
  160.             }
  161.            for(y=0;y<300;y++)
  162.              {
  163.                   reflash2();                    
  164.              }   
  165.        }
  166. }
  167. void time0() interrupt 1    //定时器/ 计数器0工作方式1
  168. {

  169.      TH0=(65536-9216)/256;    //初值的计算=65536-定时时间(s)/机器周期=65536-定时时间*晶振频率/12
  170.      TL0=(65536-9216)%256;    //设定的是10ms
  171.       t++;
  172.        if(t==100)      //循环100次 10ms*100=1000ms=1s
  173.          {
  174.               t=0;
  175.               miao++;
  176.              if(miao==60)
  177.              {
  178.                   miao=0;
  179.                   fen++;
  180.                   if(fen==60)
  181.                   {
  182.                        fen=0;
  183.                        shi++;
  184.                        if(shi==24)
  185.                        shi=0;
  186.                   }
  187.              }
  188.          }
  189. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-9-1 19:13 | 只看该作者
秒时间也每隔5s变换显示?
回复

使用道具 举报

板凳
ID:82765 发表于 2017-9-2 09:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:140489 发表于 2017-9-28 16:29 | 只看该作者
键盘扫描函数没调用,你按键肯定没用
回复

使用道具 举报

5#
ID:47286 发表于 2017-9-28 23:29 | 只看该作者
cjjcjj1 发表于 2017-9-2 09:03
你好!对你的要求没有完全看明白

他就是想每屏显示的内容不一样 每隔5s切换一个屏 任意屏内 按下按键调节当前屏的内容

它遇到的问题是 切换可以了 但按下后还是过5s就切换 停不下来 不能调节当前屏的东西
回复

使用道具 举报

6#
ID:140489 发表于 2017-9-29 09:24 | 只看该作者
给你改了一下,实现了你想要的功能,年月日显示的一个固定的数字,要使年月日跑起来,你自己在中断里面写
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit starts1=P3^0;
  5. sbit miaos2=P3^1;
  6. sbit fens3=P3^2;
  7. sbit shis4=P3^3;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. uchar code table[]={
  11. 0x3f,0x06,0x5b,0x4f,0x66,
  12. 0x6d,0x7d,0x07,0x7f,0x6f};
  13. uchar code table1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  14. uchar t,num,num1,nian=17 ,yue=9 ,ri=29,s6,s7,s8;
  15. char shi=8,fen=15,miao;
  16. uint cnt;//显示切换计时
  17. bit flag;
  18. void delay(uint x)     //延时函数
  19.    {
  20.       uint i,j;
  21.       for(i=x;i>0;i--)
  22.               for(j=110;j>0;j--);
  23.    }
  24. void display_seg(uchar num1,uchar num)  //显示函数
  25.   {
  26.      dula=1;
  27.      P0=table[num];
  28.      dula=0;
  29.      P0=0xff;        //消隐
  30.      wela=1;
  31.      P0=table1[num1];
  32.      wela=0;
  33.      delay(1);
  34. }
  35. void display1(uchar x,uchar y)      //分离函数
  36.    {
  37.         uint shi,ge;         //定义变量
  38.         shi=y/10;
  39.         ge=y%10;
  40.         if(x==1)          //x=1 表示年,
  41.           {
  42.                display_seg(5,shi);       //小时的十位
  43.                delay(2);
  44.                display_seg(4,ge);       //小时的个位
  45.                delay(2);
  46.           }
  47.         if(x==2)          //x=2 表示月
  48.          {
  49.                 display_seg(3,shi);       //分钟的十位
  50.                 delay(2);
  51.                 display_seg(2,ge);       //分钟的个位
  52.                 delay(2);
  53.         }
  54.       if(x==3)          //x=3 表示日
  55.         {
  56.              display_seg(1,shi);       //秒的十位
  57.              delay(2);
  58.             display_seg(0,ge);       //秒的个位
  59.             delay(2);
  60.        }
  61.   }

  62. void reflash1()       //刷新函数
  63. {
  64.      display1(1,shi);
  65.      display1(2,fen);
  66.      display1(3,miao);
  67. }


  68. void display2(uchar x,uchar y)      //分离函数
  69. {
  70.      uint shi,ge;         //定义变量
  71.      shi=y/10;
  72.      ge=y%10;
  73.      if(x==1)          //x=1 表示小时,
  74.        {
  75.              display_seg(5,shi);       //小时的十位
  76.              delay(2);
  77.              display_seg(4,ge);       //小时的个位
  78.              delay(2);
  79.        }
  80.       if(x==2)          //x=2 表示分钟
  81.        {
  82.               display_seg(3,shi);       //分钟的十位
  83.               delay(2);
  84.               display_seg(2,ge);       //分钟的个位
  85.               delay(2);
  86.        }
  87.       if(x==3)          //x=3 表示秒
  88.       {
  89.               display_seg(1,shi);       //秒的十位
  90.               delay(2);
  91.               display_seg(0,ge);       //秒的个位
  92.               delay(2);
  93.       }
  94. }

  95. void reflash2()       //刷新函数
  96. {
  97.      display2(1,nian);
  98.      display2(2,yue);
  99.      display2(3,ri);
  100. }

  101. void init()        //初始化 中断
  102. {
  103.      TMOD=0X01;
  104.      TH0=(65536-9216)/256;
  105.      TL0=(65536-9216)%256;
  106.      EA=1;
  107.      ET0=1;
  108.      TR0=1;
  109. }
  110. void keyscan1()       //按键加程序
  111. {
  112.        if(starts1==0)      //功能键,如果有按键按下记时停止,开始调节时间
  113.         {
  114.               delay(10);
  115.               if(starts1==0)
  116.                {
  117.                     TR0 =! TR0;     //按键一次停止计数第二次案件开始计数
  118.                }while(!starts1);
  119.        }

  120.        if(miaos2==0)      //秒调节
  121.        {
  122.              delay(10);
  123.              if(miaos2==0)
  124.                 {       
  125.                     miao++;
  126.                     if(miao>=60)
  127.                                         miao=0;
  128.                }   while(!miaos2);     
  129.                           
  130.        }        

  131.        if(fens3==0)      //调节分钟
  132.        {
  133.              delay(10);
  134.              if(fens3==0)
  135.               {
  136.                      fen++;
  137.                       if(fen==60)
  138.                      fen=0;
  139.               }while(!fens3);      
  140.        }      
  141.   

  142.         if(shis4==0)      //调节时
  143.            {
  144.                 delay(10);
  145.                 if(shis4==0)
  146.                 {
  147.                      shi++;
  148.                      if(shi==24)
  149.                      shi=0;
  150.                 }while(!shis4);
  151.            }
  152. }

  153. void main()
  154. {
  155.       init();
  156.       while(1)
  157.       {   
  158.                         
  159.                         keyscan1();
  160.             
  161.                         if(flag==0)
  162.                         {
  163.                   reflash1();
  164.             }
  165.             
  166.                         else
  167.                         {
  168.                   reflash2();                    
  169.              }   
  170.        }
  171. }
  172. void time0() interrupt 1    //定时器/ 计数器0工作方式1
  173. {

  174.      TH0=(65536-9216)/256;    //初值的计算=65536-定时时间(s)/机器周期=65536-定时时间*晶振频率/12
  175.      TL0=(65536-9216)%256;    //设定的是10ms
  176.       cnt++;
  177.           t++;
  178.        if(t==100)      //循环100次 10ms*100=1000ms=1s
  179.          {
  180.               t=0;
  181.               miao++;
  182.              if(miao==60)
  183.              {
  184.                   miao=0;
  185.                   fen++;
  186.                   if(fen==60)
  187.                   {
  188.                        fen=0;
  189.                        shi++;
  190.                        if(shi==24)
  191.                        shi=0;
  192.                   }
  193.              }
  194.          }

  195.                  
  196.                  if(cnt==500)        //5s切换显示
  197.                  {
  198.                          cnt=0;
  199.                         flag =! flag;
  200.                  }

  201. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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