久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2221|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区二区三 | 综合久久av | 国产sm主人调教女m视频 | 国产区精品 | 成人免费视屏 | 亚洲精品日本 | 国产婷婷在线视频 | 欧美中文一区 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 亚洲日韩欧美一区二区在线 | 日本久久网 | 欧美成人在线网站 | 99精品欧美一区二区蜜桃免费 | 在线视频中文字幕 | 日本三级线观看 视频 | www.中文字幕av | 91九色视频| 91精品一区二区 | 狠狠狠| 精品产国自在拍 | 91精品在线播放 | 欧美三级在线 | 日韩欧美一区二区三区免费看 | 男女视频在线免费观看 | 91看片网 | 欧美精品一区二区三 | 在线一区二区三区 | 91一区二区 | 日韩中文字幕 | 麻豆精品一区二区三区在线观看 | 国产精品免费一区二区 | 久久成人综合 | 久草在线 | 国产999精品久久久久久 | 日韩综合在线视频 | 免费小视频在线观看 | 天天干天天操 | 国产黄色大片网站 | 国产一区二区三区四区hd | 91精品国产综合久久久久久蜜臀 | 欧美日韩综合精品 |