找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么这个代码按键会有延时就是调时的时候会闪,但是按键要按2到3下才有响应...

[复制链接]
跳转到指定楼层
楼主
ID:787264 发表于 2020-6-26 23:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   #include<reg51.h>
sbit LED=P3^1;
sbit BEEP=P3^2;
sbit PWM=P3^0;
sbit INA=P2^4;
sbit INB=P2^5;
sbit INC=P2^6;
sbit IND=P2^7;  
unsigned char code led_mod[10]={0x3f,0x06,0x5b,0x4f,
          0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code led_sel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char DisplayCode[8]={0x00,0x00,0x00,0x3f,0x3f,0x40,0x3f,0x3f};
unsigned char code f_rotation[8]={0xfe,0xfd,0xfb,0xf7,0x7f,0xbf,0xdf,0xef};
unsigned char code b_rotation[4]={0X6F,0x3F,0x9F,0xCF }; typedef unsigned int u16; typedef unsigned char u8;
  bit king_flag=0 ;
bit Time_adjust=0;////????????????????????????     
bit timer_1sec_flag=0;//???????????1???????????
bit alarm_flag=0;//?????????????????????????????
bit alarm_fen_flag=0;
bit alarm_h_flag=0;  
bit led_flag=0;//????????????LED??10????
unsigned int motor=32;//?????????????????
bit dir=1;//???岽????????????????????????
bit r_run=0;    bit timer_1min_flag=0;     bit flag=0;      
unsigned char min=0;
unsigned char h=0;               u8 Motor_Step=0;
unsigned char alarm_min=10;//????????
unsigned char alarm_h=0;//?????С?
unsigned char key_value;
unsigned char led_timer_counter;        double count=2;unsigned char ID;unsigned char kind;  
sbit K1=P1^0;//????1
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
unsigned char  pre_sta[5]={1,1,1,1,1};//??????????????I/O????λ
unsigned char cur_sta[5]={1,1,1,1,1};//??????????????I/O????λ
unsigned char key_buff[5]={0xff,0xff,0xff,0xff,0xff};
void delay(unsigned int z)//??????
{
  unsigned int i,j;
for(i=0;i<z;i++)
  for(j=0;j<125;j++);
}
void led7seg_scan()//??????????
{
unsigned char i;
    for(i=0;i<4;i++)
   {
   P2=led_sel[i];//λ????????????λ????????
   P0=DisplayCode[i];//????????????????????
   delay(1);//delay 1ms
   P0=0x00;//?????????
   }
}
void Motor_Delay1ms(u16 c)   //??? 0us
{
for (; c>0; c--)
{
//   for (b=199;b>0;b--)
//   {
//     
//   }      
}
     
}
     void Motor_Run(bit dir)
{      
         
      if(r_run){
    switch(Motor_Step)
     {
      case 0: INA=1;INB=0;INC=0;IND=0;Motor_Step++;delay(12);break;
         
      case 1: INA=1;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
        
      case 2: INA=0;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
        
      case 3: INA=0;INB=1;INC=1;IND=0;Motor_Step++;delay(12);break;
        
      case 4: INA=0;INB=1;INC=0;IND=0;Motor_Step++;delay(12);break;
        
      case 5: INA=0;INB=1;INC=0;IND=0;Motor_Step++;delay(12);break;
        
      case 6: INA=0;INB=1;INC=1;IND=0;Motor_Step++;delay(12);break;
         
      case 7: INA=0;INB=0;INC=1;IND=0;Motor_Step++;delay(12);break;
      case 8: INA=1;INB=0;INC=0;IND=0;Motor_Step=0;delay(12);break;
         
     /* case 9: INA=0;INB=1;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
        
      case 10: INA=0;INB=0;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
        
      case 11: INA=0;INB=1;INC=1;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
        
      case 12: INA=0;INB=1;INC=0;IND=0;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
        
      case 13: INA=0;INB=1;INC=0;IND=1;if(dir)Motor_Step++;else Motor_Step--;Motor_Delay1ms(20);break;
        
      case 14: INA=0;INB=0;INC=0;IND=1;if(dir)Motor_Step=0;else Motor_Step--;Motor_Delay1ms(20);break;   */
         
        
      
     }
  } else INA=0;INB=0;INC=0;IND=0;  
     delay(2);
}  
void   timer0_init()
{                                             
  TR0=1;//???????0
TMOD=0x11;//????????0??1????????????????????????1
EA=1;//???ж????ж?
ET0=1;//???????0???ж?
ET1=1;//???????1???ж?
TR1=0;//???????1
    TH0=(65536-4000)/256;//?????0????????   
TL0=(65536-4000)%256;
  TH1=(65536-4000)/256; //?????1????????  
TL1=(65536-4000)%256;
}           
void key_action(unsigned char key_value)//???????????
{        
if(key_value==1)
delay(100);//?????????????
{      
if(key_value==1) {
  LED=~LED;  king_flag=~king_flag;
  TR1=~TR1; delay(100);
  }
            else if(key_value==2)//?????????????
{        if(king_flag)
    {  if(K2==0)  {   delay(2); //????????????????????ж???????
  if(K2==0)  {   count+=1; //?????μ???????????0.5
     if(count>=8)     //???????????
   {  count=2; }  } while(!K1);  }  } }
  
else if(key_value==3 )//??3??????
{    if(king_flag) ID++;if(ID==3){
ID=0;
  }  }
//Motor_Run(dir);               }   
     
   
  
  else if(key_value==4)//????4????
{ if(king_flag){   kind++;if(kind==4){
kind=0; }    }
  
/* else if(key_value==5)
      delay(100);  
  { if(key_value==5)if(king_flag) {

    if(alarm_fen_flag)//???????????????£??????????????
  {  
   alarm_min++;
    if(alarm_min==60) alarm_min=0;
   DisplayCode[3]=led_mod[alarm_min%10];
   DisplayCode[2]=led_mod[alarm_min/10];
    }
  
  }      

  else  if(alarm_h_flag)//???????????????£??????????????
  {
   alarm_h++;
    if(alarm_h==24) alarm_h=0;
   DisplayCode[1]=led_mod[alarm_h%10];
   DisplayCode[0]=led_mod[alarm_h/10];
    }
  
  }      }   */
   
   
     
  }  }
} unsigned char key_scan(void)//???????
{
unsigned char i;
unsigned char key_value=0;
for(i=0;i<5;i++)
{
if(cur_sta[i]!=pre_sta[i])//??????????????????
  {
   if(pre_sta[i]==1)//???????????,????????
   {
     key_value=i+1;
       }
    pre_sta[i]=cur_sta[i];//??????????????
    }
}
  return (key_value);//?????????????????????????????????
}
void cur_sta_update()//???????????
{
unsigned char i;
  key_buff[0]=(key_buff[0]<<1)|K1;//??????????K1?????key_buff[0]?е?????λ
key_buff[1]=(key_buff[1]<<1)|K2;//??????????K2?????key_buff[1]?е?????λ
key_buff[2]=(key_buff[2]<<1)|K3;//??????????K3?????key_buff[2]?е?????λ
key_buff[3]=(key_buff[3]<<1)|K4;//??????????K4?????key_buff[3]?е?????λ
key_buff[4]=(key_buff[4]<<1)|K5;//??????????K4?????key_buff[3]?е?????λ
for(i=0;i<5;i++)
{
  if((key_buff[i]&0x0f)==0x00)//???????4?γ???????
  {
   cur_sta[i]=0;//????μ????0
  }
  else if((key_buff[i]&0x0f)==0x0f)//???????4?γ???????
  {
  cur_sta[i]=1;//????μ????1
  }
}
}
void DisplayCode_update_time()//??????????????
{
if(Time_adjust==0)//?????δ???????????£??????1????У????????????С?????
{
   if(timer_1sec_flag)//1 sec ?????
  {
   timer_1sec_flag=0;
     
   
    min++;
      if(min==60)
     {
      min=0;
      h++;
        if(h==24)
        h=0;
          }
      }   
   
   if(alarm_flag==0)//????δ???????????????????????????
   {DisplayCode[3]=led_mod[min%10];
   DisplayCode[2]=led_mod[min/10];         
   DisplayCode[1]=led_mod[h%10];
   DisplayCode[0]=led_mod[h/10];
   } delay(1);
}  
} void DisplayCode_update_time25()//??????????????
{
if(flag)//?????δ???????????£??????1????У????????????С?????
{
   if(timer_1min_flag)//1 sec ?????
  {
   timer_1min_flag=0;
   
   
    alarm_min--;
      if(alarm_min==0)
     {    alarm_min=10;
    kind=0;  ID=0;LED=~LED;PWM=0;TR1=~TR1;
          }
      }   
    }}
void main()
{     unsigned char i,j;
    unsigned char k=0;
unsigned char key_value;LED=0;r_run=0;dir=0;
timer0_init(); IT0=1;
  while(1)
{      
  led7seg_scan();
  key_value=key_scan();
  key_action(key_value);
  DisplayCode_update_time();
  DisplayCode_update_time25();
      if(key_value!=0)  
  {    delay(2);
  while(key_value==0);
  if(key_value!=0)
  {
  for(i=10;i>0;i--){
  for(j=5;j>0;j--){
  BEEP=0;
  delay(1);
  BEEP=1;
  delay(1);
  }
  }
  BEEP=1;
  }
  }      
      
      
   
  
   switch(ID)
        {
         case 0: r_run=0; break;    //??/??
         case 1: r_run=1; break;    //???
        
        }
        if(r_run) Motor_Run(dir);
   switch(kind)
        {
         case 0: alarm_flag=0; break;    //??/??
         case 1: alarm_flag=1;alarm_fen_flag=1; break;    //???
         case 2:  alarm_flag=1;alarm_h_flag=1;alarm_fen_flag=0;DisplayCode[3]=led_mod[alarm_min%10];
    DisplayCode[2]=led_mod[alarm_min/10];      break;  //???
         case 3: alarm_flag=1;alarm_h_flag=0;alarm_fen_flag=0;flag=1;DisplayCode[1]=led_mod[alarm_h%10];
    DisplayCode[0]=led_mod[alarm_h/10];  DisplayCode[3]=led_mod[alarm_min%10];
    DisplayCode[2]=led_mod[alarm_min/10];     break;
        }  
      
      
      
  if(key_value==5)
      delay(100);if(key_value==5){if(king_flag) {
      
    if(alarm_fen_flag)//???????????????£??????????????
  {  
   alarm_min++;
    if(alarm_min==60) alarm_min=0;
   DisplayCode[3]=led_mod[alarm_min%10];
   DisplayCode[2]=led_mod[alarm_min/10];while(key_value!=5);}
   else  if(alarm_h_flag)//???????????????£??????????????
  {
   alarm_h++;
    if(alarm_h==24) alarm_h=0;
   DisplayCode[1]=led_mod[alarm_h%10];
   DisplayCode[0]=led_mod[alarm_h/10];}}delay(100); while(key_value!=5);} }
}                                       
void timer0_4ms() interrupt 1
{   
static unsigned char timer_count=0; static unsigned char count=0;static unsigned char count_timer=0;static unsigned char timer_count12=0;
         key_value=key_scan();
      
  TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
                                 
    timer_count++;
if(timer_count==250)//1 sec
{
      
    timer_count=0;   
  timer_1sec_flag=1;
  }  
    if(alarm_flag)
{        
if(alarm_fen_flag){if(count_timer==100)  DisplayCode[3]=led_mod[alarm_min%10];  
  if(count_timer==100)  DisplayCode[2]=led_mod[alarm_min/10];  
    count_timer++;
    if(count_timer==170){  count_timer=0;
   DisplayCode[3]=0x00;  
    DisplayCode[2]=0x00;   
   
    }         

  }}if(alarm_h_flag)//???????????????£??????????????
   
  {if(count==100)  DisplayCode[1]=led_mod[alarm_h%10];  
  if(count==100)  DisplayCode[0]=led_mod[alarm_h/10];  
    count++;
    if(count==170){  count=0;
   DisplayCode[1]=0x00;  
    DisplayCode[0]=0x00;   
    }         

  }  if(flag)
  {
  timer_count12++;
  if(timer_count12==250)
  {
  timer_count=0;
  timer_1min_flag=1;
  }
}   
  cur_sta_update();  {
}   
}void timer1_1ms() interrupt 3
{     
  static unsigned char led_timer_counter=0;   
     TR1=0;
     TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
          TR1=1;
      led_timer_counter++;
     //????
      
{      
  if(led_timer_counter<count)   //count?????
  {
PWM=1;    //???????
   
  }
  else
PWM=0;
   
  if(led_timer_counter>8)
  {
led_timer_counter=0;
      
  }
   
}      
           }

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

使用道具 举报

沙发
ID:787264 发表于 2020-6-27 00:21 | 只看该作者
请大神们给点思路
回复

使用道具 举报

板凳
ID:394424 发表于 2020-6-27 08:16 | 只看该作者
按键扫描没那么复杂 你需要做处理 比如说按下去触发   只触发一次
回复

使用道具 举报

地板
ID:94031 发表于 2020-6-27 09:23 | 只看该作者
中断里不应该处理那么多事情,中断只设标志,处理在外边。
回复

使用道具 举报

5#
ID:787264 发表于 2020-6-27 12:17 | 只看该作者
可是我还像这样子设是按下去触发一次
回复

使用道具 举报

6#
ID:787264 发表于 2020-6-27 13:57 | 只看该作者
可是去掉了还是会延迟
回复

使用道具 举报

7#
ID:110606 发表于 2020-6-27 17:04 | 只看该作者
我建议你这样做,不一定管用,你可以试试
回复

使用道具 举报

8#
ID:110606 发表于 2020-6-27 17:09 | 只看该作者
不要把按键检测和按键动作函数放在while循环中,因为这个时间是不一定的,你这样做很有可能是导致按键不相应,while中做定时器时间判断,比如1S检测一次按键是否按下,同时进行按键动作相应,这样不好用的话,在这个时间判断里面做一个led灯闪烁的语句,看看是否什么地方延时过长,导致while循环时间过长,或者把按键检测函数扔到定时器里面(正常不能这样写,为了找出问提),你可以这样试试
回复

使用道具 举报

9#
ID:787264 发表于 2020-6-28 03:19 | 只看该作者
青龙书生 发表于 2020-6-27 17:09
不要把按键检测和按键动作函数放在while循环中,因为这个时间是不一定的,你这样做很有可能是导致按键不相 ...

谢谢大神,我把按键检测函数放进去就不会有延时了谢谢
回复

使用道具 举报

10#
ID:787264 发表于 2020-6-28 03:27 | 只看该作者
青龙书生 发表于 2020-6-27 17:09
不要把按键检测和按键动作函数放在while循环中,因为这个时间是不一定的,你这样做很有可能是导致按键不相 ...

谢谢大神,我把按键检测放到定时器里就不会延时了
回复

使用道具 举报

11#
ID:636538 发表于 2020-6-28 09:20 | 只看该作者
我自己也菜,每次看到上面这种代码,就没有看下去的欲望,太乱
回复

使用道具 举报

12#
ID:787264 发表于 2020-6-28 19:27 | 只看该作者
怎么删帖子
回复

使用道具 举报

13#
ID:787264 发表于 2020-6-29 01:54 | 只看该作者
能不能看看怎么实现按键长按加1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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