找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2626|回复: 5
收起左侧

单片机STC8G1K08A单键依次点亮7种亮灯模式后,第8次循环有时能跳出有时不能跳出循环

[复制链接]
ID:957836 发表于 2021-10-24 17:02 | 显示全部楼层 |阅读模式
单片机STC8G1K08A
单键每按下一次就点亮一种模式,依次点亮7种亮灯模式后,第8次循环点亮前7种模式,但按下按键有时能跳出有时不能跳出第8种模式。

#include <stc8.h>
sbit      K=P5^5;         


void  delay (unsigned int i)
        {
                 unsigned int k,m;
                        for(m=0;m<9000;m++);
                                for(k=0;k<i;k++);
        }     


void port_mode()
        {
                P3M1=0X00;P3M0=0X00;P5M1=0X00;P5M0=0X00;
        }
       
void main()
        {   
                unsigned char i=0;        
                                       
                                        port_mode();
                                        P5=0XE0;
                                        P3=0X00;
                                        while(1)
                 {
                                        if(K==0)   
                                        {
                                                                delay(1200);     
                                                                if(K==0)         
                                                                {   
                                                                 while(!K);  
                                                                 delay(1200);
                                                                 if(++i==9)i=1;                                                                                           
                                                                }  
                                        }
                                         switch(i)            
                                        {
                                                         case  1:P3=0x02;break;
                                                         case  2:P3=0x04;break;
                                                         case  3:P3=0x08;break;
                                                         case  4:P3=0x06;break;
                                                         case  5:P3=0x0a;break;
                                                         case  6:P3=0x0c;break;
                                                         case  7:P3=0x0e;break;
                                                         case  8:                    
                                                                     P3=0x02;            
                                                                     delay(50000);                     
                                                                     P3=0x04;  
                                                                     delay(50000);                     
                                                                     P3=0x08;
                                                                     delay(50000);                     
                                                                     P3=0x06;
                                                                     delay(50000);                     
                                                                     P3=0x0a;
                                                                     delay(50000);
                                                                     P3=0x0c;
                                                                     delay(50000);                                                    
                                                                    P3=0x0e;
                                                                    delay(50000);break;
                                                                 
                                                        default:P3=0X00;break;
                                        }
                                                 
                        }   
        }

回复

使用道具 举报

ID:973695 发表于 2021-10-24 21:58 | 显示全部楼层
delay(1200);     是用执行空操作的方式来延时,所以很容易出现检测不到按键动作 。要解决的话只能用外部中断来捕捉按键动作。
回复

使用道具 举报

ID:957836 发表于 2021-10-24 22:03 | 显示全部楼层
谢谢回复,我再按您给的提示尝试一下。
回复

使用道具 举报

ID:213173 发表于 2021-10-24 22:17 | 显示全部楼层
因为按键第8次进入流水灯期间按键无效,流水灯结束时按键难以及时操作,键值 i 没有改变,所以继续进入流水灯。要在流水灯结束时键值清0。
  1. #include <stc8.h>

  2. sbit      K=P5^5;         
  3.   
  4. void delay(unsigned int k)                //@11.0592MHz
  5. {
  6.         unsigned char i, j;
  7.         while (--k)
  8.         {
  9.                 i = 15;
  10.                 j = 90;
  11.                 do
  12.                 {
  13.                         while (--j);
  14.                 } while (--i);
  15.         }
  16. }

  17. void port_mode()
  18. {
  19.         P3M1=0X00;
  20.         P3M0=0X00;
  21.         P5M1=0X00;
  22.         P5M0=0X00;
  23. }

  24. void main()
  25. {   
  26.         unsigned char i=0;        
  27.         port_mode();
  28.         P5=0XE0;
  29.         P3=0X00;
  30.         while(1)
  31.         {
  32.                 if(K==0)   
  33.                 {
  34.                         delay(20);     
  35.                         if(K==0)         
  36.                         {   
  37.                                 if(++i==9)i=1;
  38.                                 while(!K);
  39.                         }  
  40.                 }
  41.                 switch(i)            
  42.                 {
  43.                         case  1:P3=0x02;break;
  44.                         case  2:P3=0x04;break;
  45.                         case  3:P3=0x08;break;
  46.                         case  4:P3=0x06;break;
  47.                         case  5:P3=0x0a;break;
  48.                         case  6:P3=0x0c;break;
  49.                         case  7:P3=0x0e;break;
  50.                         case  8:                    
  51.                                         P3=0x02;
  52.                                         delay(1000);
  53.                                         P3=0x04;
  54.                                         delay(1000);
  55.                                         P3=0x08;
  56.                                         delay(1000);
  57.                                         P3=0x06;
  58.                                         delay(1000);
  59.                                         P3=0x0a;
  60.                                         delay(1000);
  61.                                         P3=0x0c;
  62.                                         delay(1000);
  63.                                         P3=0x0e;
  64.                                         delay(1000);
  65.                                         i=0;break;
  66.                         default:P3=0X00;break;
  67.                 }
  68.         }   
  69. }
复制代码



回复

使用道具 举报

ID:123289 发表于 2021-10-25 16:44 | 显示全部楼层
可能的原因:
1、按键防弹动未做洽当。
2、延时程序占用CPU时间。(在此时间里你按键了,但程序死在延时当中,还未出来呢)
解决建议:
1、按键用中断方式识别。
2、延时用定时器做(设立一个延时标记,在定时器中看到标记就对其它计时,到时后清除它或设置一个你希望的东东,供你延时判断用)。
3、主程序延时处理时,只判断看延时标记,有则执行你想做的事,无则立即退出。这样既办了事,又不耽误时间。
回复

使用道具 举报

ID:959346 发表于 2021-10-25 17:46 | 显示全部楼层
在执行CASE 8部分,有很长的延时,没有办法检测到按键。一直到这部分执行完,再次跑到按键检测,才能检测按键,只有在这时检测到按键了,才能退出。所以1一直按着不放,等到按键检测那;2在刚退出case 8操作时,按键按下,刚好可以检测到,而由于这个检测时间比case 8操作的时间小很多,所以有时灵有时不灵
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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