找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1394|回复: 4
收起左侧

不明白这段单片机程序中的jishu2是做什么用的?

[复制链接]
ID:460685 发表于 2019-1-3 09:59 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar  unsigned char
  4. #define uint  unsigned int

  5. sbit  beer=P1^5;
  6. //按键加减时分秒
  7. sbit   jk1=P3^0;
  8. sbit   jk2=P3^1;
  9. sbit   jk3=P3^2;
  10. sbit   jk4=P3^3;

  11. //--定义使用的IO--,也就是译码器的3个输入端//
  12. #define GPIO_DIG P0
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;

  16. //显示时间,初始状态
  17. uint h=00;
  18. uint min=00;
  19. uint miao=00;

  20. uint hx=13;
  21. uint minx=0;
  22. uint miaox=0;



  23. //计数器计时
  24. uint jishu1=0;
  25. uint jishu2=0;
  26. uint jishu3=0;
  27. uint bzb=0;
  28. uint  moshi=0        ;//时间设置
  29. uint  moshin=0;//闹钟设置

  30. //共阴极/*0,1,2,3,4,5,6,7,8,9,*/
  31. uchar code SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x50,0x78,};
  32. uchar gang=0x40;
  33. //显示缓冲
  34. uchar num[]={0,0,0,0,0,0,0,0};
  35.          
  36. //延时函数ms
  37. void _delay_ms(uint i)
  38. {
  39.   uchar j;
  40.   for(;i>0;i--)
  41.   {
  42.    for(j=0;j<120;j++);
  43.   }
  44. }
  45. //延时函数us
  46. void _delay_us(uchar i)
  47. {
  48.    for(;i>0;i--){;}
  49. }


  50. //使用数码管显示
  51. void display()
  52. {
  53.         unsigned char i;
  54.         unsigned int j;
  55.         for(i=0;i<8;i++)
  56.         {
  57.                 switch(i)         //位选,选择点亮的数码管,
  58.                 {
  59.                         case(7):
  60.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  61.                         case(6):
  62.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  63.                         case(5):
  64.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  65.                         case(4):
  66.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  67.                         case(3):
  68.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  69.                         case(2):
  70.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  71.                         case(1):
  72.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  73.                         case(0):
  74.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  75.                 }
  76.                 GPIO_DIG=num[i];//发送段码
  77.                 j=70;                                   //扫描间隔时间设定
  78.                 while(j--);
  79.                 GPIO_DIG=0x00;//消隐
  80.         }
  81. }

  82. void beerc()//闹钟响
  83. {
  84. beer=1; _delay_ms(30);_delay_us(30);beer=0;
  85. }
  86. //显示数据处理
  87. void  shuju()
  88. {
  89. if((moshi==0)&&(moshin==0))
  90. {
  91.   //载入数码管显示当前时间
  92.   num[0]=SEG7[h%100/10];
  93.   num[1]=SEG7[h%10]&0x7f;
  94.   num[2]=0x40;//显示横杆  美观作用
  95.   num[3]=SEG7[min%100/10];
  96.   num[4]=SEG7[min%10]&0x7f;
  97.   num[5]=0x40;
  98.   num[6]=SEG7[miao%100/10];
  99.   num[7]=SEG7[miao%10];
  100.   }
  101. if(moshi==1)
  102. {
  103.   //载入数码管显示设置时
  104.   if(jishu2<10)num[0]=SEG7[h%100/10];  else  num[0]=0;
  105.   if(jishu2<10)num[1]=SEG7[h%10]; else  num[1]=0;
  106.   num[2]=0x40;
  107.   num[3]=SEG7[min%100/10];
  108.   num[4]=SEG7[min%10]&0x7f;
  109.   num[5]=0x40;
  110.   num[6]=SEG7[miao%100/10];
  111.   num[7]=SEG7[miao%10];
  112.   }
  113. if(moshi==2)
  114. {
  115.   //载入数码管显示设置分
  116.   num[0]=SEG7[h%100/10];
  117.   num[1]=SEG7[h%10]&0x7f;
  118.   num[2]=0x40;
  119.   if(jishu2<10)num[3]=SEG7[min%100/10];        else  num[3]=0;
  120.   if(jishu2<10)num[4]=SEG7[min%10];        else  num[4]=0;
  121.   num[5]=0x40;
  122.   num[6]=SEG7[miao%100/10];
  123.   num[7]=SEG7[miao%10];
  124.   }
  125. if(moshi==3)
  126. {
  127.   //载入数码管显示设置秒
  128.   num[0]=SEG7[h%100/10];
  129.   num[1]=SEG7[h%10]&0x7f;
  130.   num[2]=0x40;
  131.   num[3]=SEG7[min%100/10];
  132.   num[4]=SEG7[min%10]&0x7f;
  133.   num[5]=0x40;
  134.   if(jishu2<10)num[6]=SEG7[miao%100/10];else  num[6]=0;
  135.   if(jishu2<10)num[7]=SEG7[miao%10];           else  num[7]=0;
  136.   }

  137. if(moshin==1)
  138. {
  139.   //载入数码管显示设置时
  140.   if(jishu2<10)num[0]=SEG7[hx%100/10];  else  num[0]=0;
  141.   if(jishu2<10)num[1]=SEG7[hx%10];     else  num[1]=0;
  142.   num[2]=0x40;
  143.   num[3]=SEG7[minx%100/10];
  144.   num[4]=SEG7[minx%10];
  145.   num[5]=0x00;
  146.   num[6]=0x00;        
  147.   num[7]=0x00;        
  148.   beer=0;
  149.   }

  150.    if(moshin==2)
  151. {
  152.   //载入数码管显示设置分
  153.   num[0]=SEG7[hx%100/10];
  154.   num[1]=SEG7[hx%10]&0x7f;
  155.   num[2]=0x40;
  156.   if(jishu2<10)num[3]=SEG7[minx%100/10];        else  num[3]=0;
  157.   if(jishu2<10)num[4]=SEG7[minx%10]&0x7f;        else  num[4]=0;
  158.   num[5]=0x00;
  159.   num[6]=0x00;        
  160.   num[7]=0x00;  
  161.   beer=0;
  162.         
  163.   }

  164. }

  165. //按键处理函数
  166. void  key()
  167. {
  168.           //切换
  169.          if((jk1==0)&&(moshin==0)){moshi=(moshi+1)%4;beerc();while(jk1==0);}
  170.          if(moshi==1)
  171.          {
  172.            //判断加小时按键是否按下
  173.            if(jk2==0){if(h<23)h=h+1;else h=0; while(jk2==0);}
  174.            //判断减小时按键是否按下
  175.            if(jk3==0){if(h> 0)h=h-1;else h=23;while(jk3==0);}
  176.          }
  177.           if(moshi==2)
  178.          {
  179.            //判断加分钟按键是否按下
  180.            if(jk2==0){if(min<59)min=min+1;else min=0; while(jk2==0);}
  181.            //判断减分钟按键是否按下
  182.            if(jk3==0){if(min> 0)min=min-1;else min=59;while(jk3==0);}
  183.          }
  184.           if(moshi==3)
  185.          {
  186.            //判断加秒钟按键是否按下
  187.            if(jk2==0){if(miao<59)miao=miao+1;else miao=0; while(jk2==0);}
  188.            //判断减秒钟按键是否按下
  189.            if(jk3==0){if(miao> 0)miao=miao-1;else miao=59;while(jk3==0);}
  190.          }
  191.           //切换
  192.          if((jk4==0)&&(moshi==0)){moshin=(moshin+1)%3;beerc();while(jk4==0);}
  193.          //------------------------------
  194.          if(moshin==1)
  195.          {
  196.            //判断加小时按键是否按下
  197.            if(jk2==0){if(hx<23)hx=hx+1;else hx=0; while(jk2==0);}
  198.            //判断减小时按键是否按下
  199.            if(jk3==0){if(hx> 0)hx=hx-1;else hx=23;while(jk3==0);}
  200.          }
  201.           if(moshin==2)
  202.          {
  203.            //判断加分钟按键是否按下
  204.            if(jk2==0){if(minx<59)minx=minx+1;else minx=0; while(jk2==0);}
  205.            //判断减分钟按键是否按下
  206.            if(jk3==0){if(minx> 0)minx=minx-1;else minx=59;while(jk3==0);}
  207.          }


  208. }
  209. //主函数-
  210. void main(void)   
  211.    {         
  212.    P1=0X0F;
  213.    //-------定时器0配置
  214.    TMOD=0x01;
  215.    //使能定时器0 ,打开中断
  216.    ET0=1;
  217.    //定时器的初值
  218.    TH0=(65536-50000)/256;
  219.    TL0=(65536-50000)%256;
  220.    //启动启定时器0
  221.    TR0=1;
  222.   //开总中断
  223.   EA=1;           
  224.   beer=0;
  225.     while(1)
  226.         {
  227.          shuju();        //显示数据处理
  228.          display(); //显示子函数  
  229.          key(); //-按键处理
  230.         }
  231.    }
  232. //定时器中断计时                 
  233. void  Time0() interrupt 1
  234.   {
  235.   //重装初值50ms;
  236.   TH0=(65536-50000)/256;  
  237.   TL0=(65536-50000)%256;

  238.   //时间缓冲+1;
  239.   if((moshi==0))jishu1=jishu1+1;
  240.   if(jishu1>=20) //判断是否到达一秒
  241.   {
  242.     jishu1=0;
  243.         miao++;
  244.         //判断到达60s
  245.     if(miao>59)
  246.     {//分钟加1
  247.      min++;
  248.          miao=0;
  249.          //判断到达60分
  250.      if(min>59)
  251.          {//小时加1
  252.           h=h+1;
  253.           min=0;
  254.          }
  255.          if(h==24)h=0;

  256.     }         
  257.         if((h==hx)&&(min==minx)&&(miao==miaox)) bzb=1;

  258.    }

  259.    if((moshi>0)||(moshin>0))jishu2=(jishu2+1)%20;
  260.    //闹钟
  261.    if((bzb==1))
  262.    {
  263.      jishu3=jishu3+1;
  264.       beer=!beer;
  265.      if(jishu3>200)
  266.       {
  267.              jishu3=0;bzb=0;beer=0;
  268.       }
  269.     }


  270. }
复制代码
回复

使用道具 举报

ID:460685 发表于 2019-1-3 10:00 | 显示全部楼层
  if((moshi>0)||(moshin>0))jishu2=(jishu2+1)%20;   这段是什么意思  作用是啥呢
回复

使用道具 举报

ID:310519 发表于 2019-1-3 12:50 | 显示全部楼层
503706606 发表于 2019-1-3 10:00
if((moshi>0)||(moshin>0))jishu2=(jishu2+1)%20;   这段是什么意思  作用是啥呢

if((moshi>0)||(moshin>0))   表达式中,moshi>0 ,moshin>0 ,

只要其中有一个成立,就执行jishu2=(jishu2+1)%20;

与之相对的是&&: if((moshi>0)&&(moshin>0))要全部成立,才会执行jishu2=(jishu2+1)%20;
回复

使用道具 举报

ID:149389 发表于 2019-1-7 20:18 | 显示全部楼层
QQ图片20190107201440.png

jishu2,计数20词为20x50ms=1000ms 即1秒
QQ图片20190107201657.png
以10为分界,半秒显示“X”,半秒显示“0”,闪烁效果
回复

使用道具 举报

ID:149389 发表于 2019-1-7 20:25 | 显示全部楼层
503706606 发表于 2019-1-3 10:00
if((moshi>0)||(moshin>0))jishu2=(jishu2+1)%20;   这段是什么意思  作用是啥呢

003.png


当处在 时间设置模式,或者闹钟设置模式的情况下

jishu2  每50ms 计数值+1,然后对20取余数(计数范围0-19)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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