找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3233|回复: 10
收起左侧

单片机多功能电子时钟程序 按键的嵌套问题

[复制链接]
ID:702201 发表于 2020-6-15 20:19 | 显示全部楼层 |阅读模式
不知道为什么按键S2在按键S1包含里面不起作用,本来是想用按键S2设定闹钟模式,按下S1,进入调时模式,再按下S2会小时加1,之后再按第二次S1,会回到显示时间模式。求大佬解答,主要是搞不懂按键的嵌套

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.          sbit s1=P0^0;
  5. sbit s2=P0^1;
  6. uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. uchar  xiao[8];
  8. uchar  weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  9. uint cnt=0,shi,fen,miao,knum;
  10. unsigned  long sec=0;
  11. void anjian();
  12. void delayms(int x);
  13. void displayo(uchar miao,uchar fen,uchar shi);
  14. void display();

  15. void anjian()
  16. {
  17.         static  uchar smiao,sfen,sshi,press;
  18.                         
  19.                   if(!s2)
  20.          {
  21.                  delayms(10);
  22.                  if(!s2)
  23.                  {
  24.                         
  25.                          press++;
  26.                          if(press==1)
  27.                          {
  28.                           smiao=miao,sfen=fen,sshi=shi;
  29.                           TR0=0;
  30.                  displayo(smiao,sfen,sshi);
  31.                  display();
  32.                                   if(!s1)
  33.          {
  34.                 delayms(5);
  35.                  if(!s1)
  36.                  {
  37.                         while(!s1)
  38.                         {
  39.                                         knum++;
  40.                                 delayms(5);
  41.                                 if(knum==100)
  42.                                 {
  43.                                                 knum=0;
  44.                                         while(!s1)
  45.                                         {
  46.                                                 
  47.                                                         if(sshi<23)
  48.                                                         {
  49.                                                                         sshi++;
  50.                                                 displayo(smiao,sfen,sshi);
  51.                                                                 display();
  52.                                                                 delayms(70);
  53.                                                         }
  54.                                                 
  55.                                                 else
  56.                                                         sshi=0;
  57.                                                                
  58.                                   }
  59.                           }
  60.                    }
  61.                         

  62.                         knum=0;
  63.                         if(sshi<23)
  64.                                 sshi++;
  65.                         else
  66.                                 sshi=0;
  67.                  }
  68.                  }
  69.                          }

  70.                          if(press==2)
  71.                          {
  72.                                  press=0;
  73.                                  miao=smiao,fen=sfen,shi=sshi;
  74.                          TR0=1;
  75.          
  76.                          }
  77.     }
  78. }
  79.          displayo(miao,fen,shi);
  80. display();
  81. }

  82.          
  83.          
  84.          
  85.         void displayo(uchar miao,uchar fen,uchar shi)
  86.         
  87.         {
  88.                  xiao[0]=duanma[shi/10];
  89.                  xiao[1]=duanma[shi%10];
  90.                  xiao[2]=0x40;         
  91.      xiao[3]=duanma[fen/10];
  92.                  xiao[4]=duanma[fen%10];
  93.                  xiao[5]=0x40;
  94.                  xiao[6]=duanma[miao/10];
  95.                  xiao[7]=duanma[miao%10];
  96.         }               
  97.         
  98.         void display()
  99.         {
  100.                  uchar i;
  101.                         for(i=0;i<8;i++)
  102.                  {
  103.                    P1=weima[i];
  104.                    P2=xiao[i];
  105.                    delayms(1);
  106.                
  107.                   }
  108.         }
  109. void delayms(uint x)  
  110. {
  111.       uint i,  j;
  112.       for(j=0;j<x;j++)
  113.            for(i=0;i<120;i++);
  114. }
  115. void main()
  116. {
  117.   
  118.    EA=1;
  119.    TMOD=0x01;
  120.    TH0=15536/256;
  121.    TL0=15536%256;
  122.    ET0=1;
  123.    TR0=1;
  124.   while(1)
  125.    {

  126.                 display();
  127.                  anjian();
  128.                  }
  129.                  }
  130. void time() interrupt 1
  131. {
  132.          TH0=15536/256;
  133.            TL0=15536%256;
  134.            cnt++;

  135.            if(cnt==20)
  136.            {
  137.              cnt=0;
  138.                    miao++;
  139.                          if(miao==60)
  140.                          {
  141.                                         miao=0;
  142.                                  fen++;
  143.                                  if(fen==60)
  144.                                  {
  145.                                                 fen=0;
  146.                                          shi++;
  147.                                          if(shi==24)
  148.                                          {
  149.                                                         shi=0;
  150.                                          }
  151.                                  }
  152.                          }
  153.                
  154.           }
  155.                 displayo(miao,fen,shi);
  156. }
  157.    
  158.   
复制代码
全部资料51hei下载地址:
电子时钟.zip (131.76 KB, 下载次数: 11)
回复

使用道具 举报

ID:332444 发表于 2020-6-16 11:55 | 显示全部楼层
回复

使用道具 举报

ID:213173 发表于 2020-6-16 21:13 | 显示全部楼层
按键程序改这样试试
  1. char shi,fen,miao,sshi,sfen;
  2. void anjian()
  3. {
  4.         static  uchar press;
  5.         if(!s1||!s2||!s3)
  6.         {
  7.                 delayms(10);
  8.                 if(!s1||!s2||!s3)
  9.                 {
  10.                         if(!s1)
  11.                         {
  12.                                 press++;
  13.                                 if(press==6)
  14.                                 {
  15.                                         press=0;
  16.                                 }
  17.                         }
  18.                         if(!s2 && press!=0)
  19.                         {
  20.                                 if(press==1)
  21.                                 {
  22.                                         shi++;
  23.                                         if(shi>23)shi=0;
  24.                                 }
  25.                                 if(press==2)
  26.                                 {
  27.                                         fen++;
  28.                                         if(fen>59)fen=0;
  29.                                 }
  30.                                 if(press==3)
  31.                                 {
  32.                                         miao++;
  33.                                         if(miao>59)miao=0;
  34.                                 }
  35.                                 if(press==4)
  36.                                 {
  37.                                         sshi++;
  38.                                         if(sshi>23)sshi=0;
  39.                                 }
  40.                                 if(press==5)
  41.                                 {
  42.                                         sfen++;
  43.                                         if(sfen>59)sfen=0;
  44.                                 }
  45.                         }
  46.                         if(!s3 && press!=0)
  47.                         {
  48.                                 if(press==1)
  49.                                 {
  50.                                         shi--;
  51.                                         if(shi<0)shi=23;
  52.                                 }
  53.                                 if(press==2)
  54.                                 {
  55.                                         fen--;
  56.                                         if(fen<0)fen=59;
  57.                                 }
  58.                                 if(press==3)
  59.                                 {
  60.                                         miao--;
  61.                                         if(miao<0)miao=59;
  62.                                 }
  63.                                 if(press==4)
  64.                                 {
  65.                                         sshi--;
  66.                                         if(sshi<0)sshi=23;
  67.                                 }
  68.                                 if(press==5)
  69.                                 {
  70.                                         sfen--;
  71.                                         if(sfen<0)sfen=59;
  72.                                 }
  73.                         }
  74.                         while(!s1&&!s2&&!s3);
  75.                 }
  76.         }
  77. }
复制代码
回复

使用道具 举报

ID:702201 发表于 2020-6-17 11:06 | 显示全部楼层
wulin 发表于 2020-6-16 21:13
按键程序改这样试试

大佬,请问你这个按键短按一下会跳数,不能设置成短按加1,长按跳数,在不加等待按键释放的情况下?因为数码管调时时会闪烁
回复

使用道具 举报

ID:702201 发表于 2020-6-17 11:07 | 显示全部楼层
xianfajushi 发表于 2020-6-16 11:55
可参https://ask.csdn.net/questions/1078609

这个按键加了等待释放,调时时数码管会闪烁的,还有没有让它在不闪烁的情况下调整时间
回复

使用道具 举报

ID:213173 发表于 2020-6-17 15:01 | 显示全部楼层
hhhjjjj 发表于 2020-6-17 11:06
大佬,请问你这个按键短按一下会跳数,不能设置成短按加1,长按跳数,在不加等待按键释放的情况下?因为 ...

要想短按+/-1,长按连+/-并且不干扰数码管必须去掉delayms阻滞延时和while(xxx)松手等待,改为计数法消抖。
  1. #define key_S 20                                //宏定义短按(约15ms)
  2. #define key_L key_S*35                        //宏定义长按(约500ms)
  3. #define key_I key_S*27                        //宏定义长按连+/-间隔(约120ms)
  4. char shi,fen,miao,sshi,sfen;
  5. uchar press;
  6. void anjian()
  7. {
  8.         static unsigned int time=0;
  9.         if(!s1||!s2||!s3)
  10.         {
  11.                 time++;
  12.                 if(time>key_L)//长按有效
  13.                         time=key_I;//连+/-间隔
  14.                 if(time==key_S)//短按消抖
  15.                 {
  16.                         if(!s1)
  17.                         {
  18.                                 press++;
  19.                                 if(press==6)
  20.                                 {
  21.                                         press=0;
  22.                                 }
  23.                         }
  24.                 }
  25.                 if(time==key_S||time==key_L)//短按消抖或长按连+/-
  26.                 {
  27.                         if(!s2 && press!=0)
  28.                         {
  29.                                 if(press==1)
  30.                                 {
  31.                                         shi++;
  32.                                         if(shi>23)shi=0;
  33.                                 }
  34.                                 if(press==2)
  35.                                 {
  36.                                         fen++;
  37.                                         if(fen>59)fen=0;
  38.                                 }
  39.                                 if(press==3)
  40.                                 {
  41.                                         miao++;
  42.                                         if(miao>59)miao=0;
  43.                                 }
  44.                                 if(press==4)
  45.                                 {
  46.                                         sshi++;
  47.                                         if(sshi>23)sshi=0;
  48.                                 }
  49.                                 if(press==5)
  50.                                 {
  51.                                         sfen++;
  52.                                         if(sfen>59)sfen=0;
  53.                                 }
  54.                         }
  55.                         if(!s3 && press!=0)
  56.                         {
  57.                                 if(press==1)
  58.                                 {
  59.                                         shi--;
  60.                                         if(shi<0)shi=23;
  61.                                 }
  62.                                 if(press==2)
  63.                                 {
  64.                                         fen--;
  65.                                         if(fen<0)fen=59;
  66.                                 }
  67.                                 if(press==3)
  68.                                 {
  69.                                         miao--;
  70.                                         if(miao<0)miao=59;
  71.                                 }
  72.                                 if(press==4)
  73.                                 {
  74.                                         sshi--;
  75.                                         if(sshi<0)sshi=23;
  76.                                 }
  77.                                 if(press==5)
  78.                                 {
  79.                                         sfen--;
  80.                                         if(sfen<0)sfen=59;
  81.                                 }
  82.                         }
  83.                 }
  84.         }
  85.         else time=0;
  86. }
复制代码
回复

使用道具 举报

ID:702201 发表于 2020-6-17 15:31 | 显示全部楼层
wulin 发表于 2020-6-17 15:01
要想短按+/-1,长按连+/-并且不干扰数码管必须去掉delayms阻滞延时和while(xxx)松手等待,改为计数法消抖 ...

(按S1  到数码管为4再按S4进入闹钟设置模式,)还有就是为什么我按S4进入闹钟模式时,displayo(smiao,sfen,sshi),显示不出来。还有就是想问一下display(uchar miao,uchar fen, uchar shi)适用于display(smiao,sfen,sshi)吗?还是说我要写两个display(),?



  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.          sbit s1=P0^0;
  5. sbit s2=P0^1;
  6. sbit s3=P0^2;
  7. sbit s4=P0^3;
  8. uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  9. uchar  xiao[8];
  10. uchar  weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  11. uint cnt=0,shi,fen,miao,knum,smiao,sshi,sfen;
  12. uchar k;
  13. unsigned  long sec=0;
  14. void anjian();
  15. void delayms(int x);
  16. void displayo(uchar miao,uchar fen,uchar shi);
  17. void display();

  18. void anjian()
  19. {

  20.                                  
  21. static  uchar press,press1;
  22.           //tiao shizhong
  23.         if(!s1||!s2||!s3)
  24.         {
  25.                 delayms(10);
  26.                 if(!s1||!s2||!s3)
  27.                 {
  28.                         if(!s1)
  29.                         {
  30.                                 press++;
  31.                                                                                                              k++;
  32.                                                                                                         delayms(200);
  33.                                                                                                         if(k==7)
  34.                                                                                                                 k=0;
  35.                                                                                                
  36.                                 if(press==4)
  37.                                 {
  38.                                         press=0;
  39.                                 }
  40.                                                                                                                                 while(!s1);
  41.                         }
  42.                         if(!s2 && press!=0)
  43.                         {
  44.                                 if(press==1)
  45.                                 {
  46.                                                                                                                                        
  47.                                         shi++;
  48.                                         if(shi>23)
  49.                                                                                                                                                                         shi=0;
  50.                                                                                                                                                                
  51.                                                                                                                                                        
  52.                                        
  53.                                                                                                                         }
  54.                                 if(press==2)
  55.                                 {
  56.                                         fen++;
  57.                                         if(fen>59)fen=0;
  58.                                 }
  59.                                 if(press==3)
  60.                                 {
  61.                                         miao++;
  62.                                         if(miao>59)miao=0;
  63.                                 }
  64.                               
  65.                                                                                                                                 while(!s2)        ;
  66.                         }
  67.                         if(!s3 && press!=0)
  68.                         {
  69.                                 if(press==1)
  70.                                 {
  71.                                         shi--;
  72.                                         if(shi<0)shi=23;
  73.                                 }
  74.                                 if(press==2)
  75.                                 {
  76.                                         fen--;
  77.                                         if(fen<0)fen=59;
  78.                                 }
  79.                                 if(press==3)
  80.                                 {
  81.                                         miao--;
  82.                                         if(miao<0)miao=59;
  83.                                 }
  84.                                 
  85.                                                                                                                                 while(!s3);
  86.                         }
  87.                                                                                                  while(!s1&&!s2&&!s3);
  88.                                                                                         }
  89.                                                                                
  90.                                                                                                
  91.                                                                                 }       
  92.                                                                                                
  93.                                                                                                 //tiao naozhong
  94.                                                                                                
  95.                                                                                                        
  96.                                                                                                   if(!s4||!s2||!s3)
  97.                                                                 {
  98.                                                                                 delayms(10);               
  99.                 if(!s4||!s2||!s3)
  100.                 {
  101.                                                                                
  102.                         if(!s4)
  103.                         {
  104.                                                                                                                                        
  105.                                                                                                
  106.                                                                                                
  107.                                                                                                         delayms(10);
  108.                                                                                                        
  109.                                 press1++;
  110.                                                                                                              TR0=0;
  111.                                                                                                         displayo(smiao,sfen,sshi);
  112.                                                                                                               display();
  113.                                                                                                
  114.                                                                                                        
  115.                                                                                                
  116.                                 if(press1==4)
  117.                                 {
  118.                                         press1=0;
  119.                                                                                                                                               TR0=1;
  120.                                 }
  121.                                                                                                                                 while(!s4);
  122.                                                                                                                                
  123.                                                                                                                                                
  124.                                                                                                                                
  125.                         }
  126.                         if(!s2 && press1!=0)
  127.                         {
  128.                                                                                                                
  129.                                 if(press1==1)
  130.                                 {
  131.                                                                                                                                        
  132.                                         sshi++;
  133.                                         if(sshi>23)
  134.                                                                                                                                                                         sshi=0;
  135.                                                                                                                                                                
  136.                                                                                                                                                        
  137.                                        
  138.                                                                                                                         }
  139.                                 if(press1==2)
  140.                                 {
  141.                                         sfen++;
  142.                                         if(sfen>59)
  143.                                                                                                                                                                         sfen=0;
  144.                                 }
  145.                                 if(press1==3)
  146.                                 {
  147.                                         smiao++;
  148.                                         if(smiao>59)
  149.                                                                                                                                                                         smiao=0;
  150.                                 }
  151.                            
  152.                                                                                                                                
  153.                                                                                                                                          displayo(smiao,sfen,sshi);
  154.                                                                                                               display();
  155.                                                                                                                                
  156.                                                                                                                                 while(!s2)        ;
  157.                         }
  158.                         if(!s3 && press1!=0)
  159.                         {
  160.                                                                                                                
  161.                                 if(press1==1)
  162.                                 {
  163.                                         sshi--;
  164.                                         if(sshi<0)
  165.                                                                                                                                                                         sshi=23;
  166.                                                                                                                                                                        
  167.                                 }
  168.                                 if(press1==2)
  169.                                 {
  170.                                         sfen--;
  171.                                         if(sfen<0)
  172.                                                                                                                                                                         sfen=59;
  173.                                                                                                                                                                                
  174.                                 }
  175.                                 if(press1==3)
  176.                                 {
  177.                                         smiao--;
  178.                                         if(smiao<0)
  179.                                                                                                                                                                         smiao=59;
  180.                                                                                                                                                                        
  181.                                 }
  182.                               
  183.                                                                                                                                 displayo(smiao,sfen,sshi);
  184.                                                                                                               display();
  185.                                                                                                                                 while(!s3);
  186.                         }
  187.                                                                                                
  188.                                                                                                
  189.                                                                                                
  190.                                                                                                
  191.                         while(!s4&&!s2&&!s3);
  192.                 }
  193.         
  194. }
  195.        
  196. }

  197.          
  198.          
  199.          
  200.         void displayo(uchar miao,uchar fen,uchar shi)
  201.        
  202.         {
  203.                  xiao[0]=duanma[shi/10];
  204.                  xiao[1]=duanma[shi%10];
  205.                  xiao[2]=0x40;         
  206.      xiao[3]=duanma[fen/10];
  207.                  xiao[4]=duanma[fen%10];
  208.                  xiao[5]=0x40;
  209.                  xiao[6]=duanma[miao/10];
  210.                  xiao[7]=duanma[miao%10];
  211.         }               
  212.        
  213.         void display()
  214.         {
  215.                  uchar i;
  216.                         for(i=0;i<8;i++)
  217.                  {
  218.                    P1=weima[i];
  219.                    P2=xiao[i];
  220.                    delayms(1);
  221.                          P3=duanma[k];
  222.                          delayms(5);
  223.                          
  224.                
  225.                  }
  226.         }
  227. void delayms(uint x)  
  228. {
  229.       uint i,  j;
  230.       for(j=0;j<x;j++)
  231.            for(i=0;i<120;i++);
  232. }
  233. void main()
  234. {
  235.   
  236.    EA=1;
  237.    TMOD=0x01;
  238.    TH0=15536/256;
  239.    TL0=15536%256;
  240.    ET0=1;
  241.    TR0=1;
  242.   while(1)
  243.    {

  244.                 display();
  245.                  anjian();
  246.                         
  247.                  }
  248.                  }
  249. void time() interrupt 1
  250. {
  251.          TH0=15536/256;
  252.            TL0=15536%256;
  253.            cnt++;

  254.            if(cnt==20)
  255.            {
  256.              cnt=0;
  257.                    miao++;
  258.                          if(miao==60)
  259.                          {
  260.                                         miao=0;
  261.                                  fen++;
  262.                                  if(fen==60)
  263.                                  {
  264.                                                 fen=0;
  265.                                          shi++;
  266.                                          if(shi==24)
  267.                                          {
  268.                                                         shi=0;
  269.                                          }
  270.                                  }
  271.                          }
  272.                
  273.           }
  274.                 displayo(miao,fen,shi);
  275. }
  276.    
  277.   
复制代码
回复

使用道具 举报

ID:213173 发表于 2020-6-17 23:19 | 显示全部楼层
hhhjjjj 发表于 2020-6-17 15:31
(按S1  到数码管为4再按S4进入闹钟设置模式,)还有就是为什么我按S4进入闹钟模式时,displayo(smiao,sf ...

给你写的示例,有详细注释,你看明白了就能解决你目前所有问题。 按键长短按时钟 闹钟仿真.zip (139.41 KB, 下载次数: 11)
回复

使用道具 举报

ID:702201 发表于 2020-6-18 11:18 | 显示全部楼层
wulin 发表于 2020-6-17 23:19
给你写的示例,有详细注释,你看明白了就能解决你目前所有问题。
51hei.png
进入闹钟模式,为什么秒位不显示?

回复

使用道具 举报

ID:702201 发表于 2020-6-20 21:40 | 显示全部楼层
wulin 发表于 2020-6-17 23:19
给你写的示例,有详细注释,你看明白了就能解决你目前所有问题。
  1. 为什么改为锁存器就没有用了?
复制代码
  1. #include<reg52.h>
  2. #define key_S 20     
  3. #define key_L key_S*35      
  4. #define key_I key_S*27   

  5. sbit s1=P3^0;
  6. sbit s2=P3^1;
  7. sbit s3=P3^2;
  8. sbit LED=P3^3;
  9. sbit buzzer=P3^4;

  10. sbit scduan=P2^2;
  11. sbit scwei=P2^3;
  12. sbit xian=P1;

  13. unsigned char code table[]={//12ÑôêyÂë1ü¶ÎÂë"0~f-."
  14.                 0xc0,0xf9,0xa4,0xb0,
  15.                 0x99,0x92,0x82,0xf8,
  16.                 0x80,0x90,0x88,0x83,
  17.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  18. unsigned char code welai[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  19. unsigned char buf[]={0,0,0xbf,0,0,0xbf,0,0};

  20. char shi=0,fen=0,sec=0,sshi=0,sfen=0;
  21. unsigned char press;
  22. unsigned char num=0;
  23. bit bell=0;
  24. bit voice=0;
  25. //Ñóê±oˉêy
  26. void delayms(unsigned int k)        
  27. {
  28.         unsigned int i,j;
  29.         for(i=k;i>0;i--)
  30.                 for(j=110;j>0;j--);
  31. }
  32. //°′¼üé¨Ãè
  33. void keyscan()
  34. {
  35.         static unsigned int time=0;
  36.         if(!s1||!s2||!s3)
  37.         {
  38.                 time++;
  39.                 if(time>key_L)
  40.                         time=key_I;
  41.                 if(time==key_S)
  42.                 {
  43.                         if(!s1)
  44.                         {
  45.                                 press++;
  46.                                 if(press>6)
  47.                                 {
  48.                                         press=0;
  49.                                 }
  50.                         }
  51.                 }
  52.                 if(time==key_S||time==key_L)
  53.                 {
  54.                         if(!s2 && press!=0)
  55.                         {
  56.                                 if(press==1)
  57.                                 {
  58.                                         shi++;
  59.                                         if(shi>23)shi=0;
  60.                                 }
  61.                                 if(press==2)
  62.                                 {
  63.                                         fen++;
  64.                                         if(fen>59)fen=0;
  65.                                 }
  66.                                 if(press==3)
  67.                                 {
  68.                                         sec++;
  69.                                         if(sec>59)sec=0;
  70.                                 }
  71.                                 if(press==4)
  72.                                 {
  73.                                         sshi++;
  74.                                         if(sshi>23)sshi=0;
  75.                                 }
  76.                                 if(press==5)
  77.                                 {
  78.                                         sfen++;
  79.                                         if(sfen>59)sfen=0;
  80.                                 }
  81.                                 if(press==6)
  82.                                 {
  83.                                         bell=~bell;
  84.                                 }
  85.                         }
  86.                         if(!s3 && press!=0)
  87.                         {
  88.                                 if(press==1)
  89.                                 {
  90.                                         shi--;
  91.                                         if(shi<0)shi=23;
  92.                                 }
  93.                                 if(press==2)
  94.                                 {
  95.                                         fen--;
  96.                                         if(fen<0)fen=59;
  97.                                 }
  98.                                 if(press==3)
  99.                                 {
  100.                                         sec--;
  101.                                         if(sec<0)sec=59;
  102.                                 }
  103.                                 if(press==4)
  104.                                 {
  105.                                         sshi--;
  106.                                         if(sshi<0)sshi=23;
  107.                                 }
  108.                                 if(press==5)
  109.                                 {
  110.                                         sfen--;
  111.                                         if(sfen<0)sfen=59;
  112.                                 }
  113.                                 if(press==6)
  114.                                 {
  115.                                         bell=~bell;
  116.                                 }
  117.                         }
  118.                 }
  119.         }
  120.         else time=0;
  121. }

  122. void display()
  123. {
  124.         static unsigned char i=0;
  125.         if(press<4)//ê±Öó
  126.         {
  127.                 buf[0]=table[shi/10];
  128.                 buf[1]=table[shi%10];
  129.                 buf[3]=table[fen/10];
  130.                 buf[4]=table[fen%10];
  131.                 buf[6]=table[sec/10];
  132.                 buf[7]=table[sec%10];
  133.         }
  134.         else //ÄÖÖó
  135.         {
  136.                 buf[0]=table[sshi/10];
  137.                 buf[1]=table[sshi%10];
  138.                 buf[3]=table[sfen/10];
  139.                 buf[4]=table[sfen%10];               
  140.                 if(bell)
  141.                 {
  142.                         buf[6]=0xa3;//'OK'
  143.                         buf[7]=0x8f;
  144.                 }
  145.                 else  
  146.                 {
  147.                         buf[6]=0xab;//'NO'
  148.                         buf[7]=0xa3;   
  149.                 }
  150.         }
  151.                 xian=0x00;   
  152.         scduan=1;
  153.         scduan=0;
  154.         
  155.         
  156.         P1=welai[i];
  157.         scwei=1;
  158.         scwei=0;
  159.         

  160.         if(press==1&&i==1)
  161.                 P1=buf[i]&0x7f;
  162.         else if(press==2&&i==4)
  163.                 P1=buf[i]&0x7f;
  164.         else if(press==3&&i==7)
  165.                 P1=buf[i]&0x7f;
  166.         else if(press==4&&i==1)
  167.                 P1=buf[i]&0x7f;
  168.         else if(press==5&&i==4)
  169.                 P1=buf[i]&0x7f;
  170.         else if(press==6&&i==7)
  171.                 P1=buf[i]&0x7f;
  172.         else if(press==0&&i==7&&bell==1)
  173.                 P1=buf[i]&0x7f;
  174.         else P1=buf[i];
  175. scduan=1;
  176.         scduan=0;  
  177.         i++,i%=8;     

  178. }

  179. void InitTimer(void)
  180. {
  181.         TMOD = 0x21;
  182.         TH0 = 0x3C;
  183.         TL0 = 0xB0;
  184.         TL1 = 0x38;
  185.         TH1 = 0x38;
  186.         EA = 1;
  187.         ET0 = 1;
  188.         ET1 = 1;
  189.         TR0 = 1;
  190.         TR1 = 0;
  191. }

  192. void alarm()
  193. {
  194.         if((shi==sshi)&&(fen==sfen)&&(sec<30)&&(bell==1)&&(voice==0))
  195.         {
  196.                 TR1=1;
  197.         }
  198.         else
  199.         {
  200.                 TR1=0;
  201.                 buzzer=1;
  202.         }
  203. }

  204. void main()
  205. {
  206.         InitTimer();
  207.         while(1)
  208.         {
  209.                 keyscan();
  210.                 display();
  211.                 alarm();
  212.                 delayms(1);
  213.         }
  214. }

  215. void Timer0Interrupt() interrupt 1
  216. {
  217.         TH0 = 0x3C;
  218.         TL0 = 0xB0;
  219.         num++;
  220.         if(num%5==0)
  221.                 voice=~voice;        
  222.         if(num==20)
  223.         {
  224.                 num=0;
  225.                 sec++;
  226.                 LED=~LED;
  227.                 if(sec>59)
  228.                 {
  229.                         sec=0;
  230.                         fen++;
  231.                         if(fen>59)
  232.                         {
  233.                                 fen=0;
  234.                                 shi++;
  235.                                 if(shi>23)
  236.                                 shi=0;
  237.                         }
  238.                 }
  239.         }
  240. }

  241. void Timer1Interrupt() interrupt 3
  242. {
  243.         buzzer=~buzzer;        
  244. }
复制代码

新建文件夹.zip (103.99 KB, 下载次数: 2)
回复

使用道具 举报

ID:702201 发表于 2020-6-21 10:44 | 显示全部楼层
wulin 发表于 2020-6-17 23:19
给你写的示例,有详细注释,你看明白了就能解决你目前所有问题。

为什么我用锁存器就不能正常显示??

新建文件夹.zip

103.99 KB, 下载次数: 3

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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