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

標題: 單片機程序 卡在K2按鍵可以進行模式加一這一步和K3的模式減一這一步 [打印本頁]

作者: 深層次    時間: 2023-10-29 08:42
標題: 單片機程序 卡在K2按鍵可以進行模式加一這一步和K3的模式減一這一步
我的問題就卡在K2按鍵可以進行模式加一這一步和K3的模式減一這一步,我不知道到這里我應該如何將我之前編好的那八個模式導進去,因為我把它們都封裝成函數,請大佬們給點提示,孩子真的寫不出來了。沒有任何思路

單片機源程序如下:
#include <reg52.h>

#define uchar unsigned  char
#define uint unsigned int
sbit key0=P0^0;
sbit key1=P0^1;
sbit key2=P0^2;
sbit key3=P0^3;
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED從高位往低位移
uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED從1個亮到8個都點亮(從低位往高位)
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點亮(從高位往低位)
uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED從8個全亮到一個都不亮(從低位往高位)
uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED從8個全亮到一個都不亮(從高位往低位)
uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED從低位往高位移(最低位始終為0)
uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED從高位往低位移(最高位始終為0)
uchar keyflag=0;//按鍵標志位
void keyscan();//按鍵檢測函數
uchar i,j,a;
void delayms(uint xms);


void disp0()  //狀態0 全亮
{    P1=0x00;
    delayms(500);   
}


void disp1()                        //狀態1 低位到高位依次亮
{
                for(i=0;i<8;i++)
                {
                P1=table0[ i];
                delayms(500);
                }
            P1=0xff;
                 
}
void disp2() //狀態2  LED從高位到低位依次亮
{  P1=0xff;
for(i=0;i<8;i++)
  {        P1=table1[ i];
        delayms(500);
  }
           
}
void disp3()  // 狀態3 LED閃爍3次
{   for(i=0;i<3;i++)
     {        P1=0X00;
     delayms(500);
        P1=0xff;
      delayms(500);
      }
           
}
void disp4()                        //狀態4 LED自上而下逐漸點亮
{
        
        for(i=0;i<8;i++)
        {
                P1=table3[ i];
                delayms(100);
        }
        P1=0xff;
}
void disp5()                        //狀態5 從LED全部亮到全不亮
{
        for(i=0;i<9;i++)
        {
                P1=table5[ i];
                delayms(100);
        }
        delayms(300);
}
void disp6()                        //狀態6 逐步逆時針點亮P1的LED,熄滅
{
   P1=0xff;
        for(j=0;j<2;j++)
        {
                for(i=0;i<8;i++)
                {
               
                        P1=table2[ i];
                        delayms(100);
                }
             P1=0xff;
               
        }
}




void disp7()   //狀態7 全滅
{   P1=0XFF;
    delayms(500);
}


void main()
{
  while(1)
  {   keyscan();
      switch(keyflag)
      {case 1:disp0();break;
        case 2:     break;
        case 3:     break;
        case 4:disp7();break;
      }
  }  
}
void delayms(uint xms)
{ uint i,j;
   for(i=0;i<xms;i++)
     for(j=0;j<120;j++);
}
void keyscan()
{ P0=0xff;//輸入先寫“1”
  if((P0&0x0f)!=0x0f)//檢測有按鍵按下
  {delayms(10);//延時去抖
   if(key0==0)//key0按鍵按下
   keyflag=1;//設標志位1
   if(key1==0)//key1按鍵按下
   keyflag=2;//設標志位2
   if(key2==0)//key2按鍵按下
   keyflag=3;//設標志位3
   if(key3==0)//key3按鍵按下
   keyflag=4;//設標志位4
   while(!key0);
   while(!key1);
   while(!key2);
   while(!key3);
  }
}

屏幕截圖 2023-10-29 083824.png (63.94 KB, 下載次數: 91)

屏幕截圖 2023-10-29 083824.png

作者: tyrl800    時間: 2023-10-29 17:28
你這個程序基本沒用,都死在子函數里了
作者: 深層次    時間: 2023-10-29 17:57
tyrl800 發表于 2023-10-29 17:28
你這個程序基本沒用,都死在子函數里了

那我應該怎么去寫比較好呢?這個的K2和K3思路是什么?
作者: tyrl800    時間: 2023-10-29 19:35
深層次 發表于 2023-10-29 17:57
那我應該怎么去寫比較好呢?這個的K2和K3思路是什么?

用定時器延時
作者: changhz    時間: 2023-10-29 20:11
程序修改可以了,不過效率太低了,要用定時器才行。
#include <reg52.h>
#define uchar unsigned  char
#define uint unsigned int
sbit key0=P0^0;
sbit key1=P0^1;
sbit key2=P0^2;
sbit key3=P0^3;
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED從高位往低位移
uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED從1個亮到8個都點亮(從低位往高位)
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點亮(從高位往低位)
uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED從8個全亮到一個都不亮(從低位往高位)
uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED從8個全亮到一個都不亮(從高位往低位)
uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED從低位往高位移(最低位始終為0)
uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED從高位往低位移(最高位始終為0)
uchar keyflag=0;//按鍵標志位
void keyscan();//按鍵檢測函數
uchar i,j,a;
void delayms(uint xms);


void disp0()  //狀態0 全亮
{   
        P1=0x00;
    delayms(500);   
}


void disp1()                        //狀態1 低位到高位依次亮
{   
         P1=0xff;
     for(i=0;i<8;i++)
     {
         P1=table0[i];
         delayms(500);
     }
                     
}

void disp2() //狀態2  LED從高位到低位依次亮
{  
        P1=0xff;
    for(i=0;i<8;i++)
   {        
           P1=table1[i];
       delayms(500);
   }           
}

void disp3()  // 狀態3 LED閃爍3次
{   
        for(i=0;i<3;i++)
     {        
                 P1=0X00;
         delayms(500);
         P1=0xff;
         delayms(500);
      }           
}

void disp4()                        //狀態4 LED自上而下逐漸點亮
{
     for(i=0;i<8;i++)
        {
            P1=table3[ i];
            delayms(100);
        }
        P1=0xff;
}

void disp5()                        //狀態5 從LED全部亮到全不亮
{
        for(i=0;i<9;i++)
        {
                P1=table5[ i];
                delayms(100);
        }
        delayms(300);
}

void disp6()                        //狀態6 逐步逆時針點亮P1的LED,熄滅
{
   P1=0xff;
        for(j=0;j<2;j++)
        {
          for(i=0;i<8;i++)
          {               
               P1=table2[ i];
              delayms(100);
          }
             P1=0xff;               
        }
}

void disp7()   //狀態7 全滅
{   P1=0XFF;
    delayms(500);
}


void main()
{
   while(1)
  {  
       
    keyscan();
      switch(keyflag)
      {
                  case 1:disp0();break;
                  case 2:disp1();break;
                  case 3:disp2();break;
                  case 4:disp3();break;
                  case 5:disp4();break;
                  case 6:disp5();break;
                  case 7:disp6();break;
                  case 8:disp7();break;
      }
  }
   
}
void delayms(uint xms)
{ uint i,j;
   for(i=0;i<xms;i++)
     for(j=0;j<120;j++);
}


void keyscan()
{

  if((P0&0x0f)!=0x0f)//檢測有按鍵按下
   {
            delayms(10);//延時去抖
          
                if(key0==0)//key0按鍵按下
                keyflag=1;
               
                if(key1==0 && keyflag<7)//key1按鍵按下
                keyflag++;//設標志位2
               
                if(key2==0 && keyflag>2)//key2按鍵按下
                keyflag--;//設標志位3
               
                if(key3==0)//key3按鍵按下
                keyflag=8;//設標志位4
                       
                while(!key0);
                while(!key1);
                while(!key2);
                while(!key3);
  }
}


作者: lkc8210    時間: 2023-10-29 21:15
深層次 發表于 2023-10-29 17:57
那我應該怎么去寫比較好呢?這個的K2和K3思路是什么?

給你一個例子
  1. void disp1()                        //狀態1 低位到高位依次亮
  2. {
  3.         static uchar i = 0;
  4.         static uint delay = 500;
  5.         if(delay++>=500)
  6.         {
  7.                 delay = 0;
  8.                 P1=table0[i];
  9.                 i++;
  10.                 if(i>=8)i=0;
  11.         }
  12.         delayms(1);
  13. }
復制代碼

作者: wulin    時間: 2023-10-30 09:11
深層次 發表于 2023-10-29 17:57
那我應該怎么去寫比較好呢?這個的K2和K3思路是什么?

這就是一個花樣流水燈的程序,給你改好了。
  1. #include <reg52.h>
  2. #define uchar unsigned  char
  3. #define uint unsigned int
  4. sbit key0=P0^0;
  5. sbit key1=P0^1;
  6. sbit key2=P0^2;
  7. sbit key3=P0^3;
  8. uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移
  9. uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED從高位往低位移
  10. uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED從1個亮到8個都點亮(從低位往高位)
  11. uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點亮(從高位往低位)
  12. uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED從8個全亮到一個都不亮(從低位往高位)
  13. uchar code table5[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED從8個全亮到一個都不亮(從高位往低位)
  14. uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED從低位往高位移(最低位始終為0)
  15. uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED從高位往低位移(最高位始終為0)

  16. uchar keyflag=0;//按鍵標志位

  17. void keyscan();//按鍵檢測函數
  18. void delayms(uint xms);


  19. void main()
  20. {
  21.         uchar i,j;

  22.         while(1)
  23.         {
  24.                 keyscan();
  25.                 if(++j>=250)
  26.                 {
  27.                         j=0;
  28.                         switch(keyflag)
  29.                         {
  30.                                 case 0:P1=0xff; break;
  31.                                 case 1:P1=0x00; break;
  32.                                 case 2:P1=table0[i]; break;
  33.                                 case 3:P1=table1[i]; break;
  34.                                 case 4:P1=table2[i]; break;
  35.                                 case 5:P1=table3[i]; break;
  36.                                 case 6:P1=table4[i]; break;
  37.                                 case 7:P1=table5[i]; break;
  38.                                 case 8:P1=table6[i]; break;
  39.                                 case 9:P1=table7[i]; break;
  40.                         }
  41.                         i=++i%8;
  42.                 }
  43.                 delayms(1);
  44.         }  
  45. }

  46. void delayms(uint xms)
  47. {
  48.         uint i,j;
  49.         for(i=0;i<xms;i++)
  50.                 for(j=0;j<120;j++);
  51. }
  52. void keyscan()
  53. {
  54.         static uchar count=0;
  55.         static bit sign=0;
  56.         uchar temp;
  57.         temp=P0&0x0f;
  58.         if(temp!=0x0f)//檢測有按鍵按下
  59.         {
  60.                 if(++count==10 && temp!=0x0f && !sign)
  61.                 {
  62.                         sign=1;//自鎖
  63.                         switch(temp)
  64.                         {
  65.                                 case 0x0e: keyflag=1; break;
  66.                                 case 0x0d: if(keyflag<9)keyflag++; break;
  67.                                 case 0x0b: if(keyflag>1)keyflag--; break;
  68.                                 case 0x07: keyflag=0; break;
  69.                         }
  70.                 }
  71.         }
  72.         else//松手
  73.         {
  74.                 count=0;
  75.                 sign=0;
  76.         }
  77. }
復制代碼


作者: 殿堂之上    時間: 2023-10-31 12:20
wulin 發表于 2023-10-30 09:11
這就是一個花樣流水燈的程序,給你改好了。

1、主循環中的j是啥作用
2、按鍵中count為啥取10,是掃描10次消抖
3、沒用中斷,主循環時間長會丟鍵嗎
能說明下嗎,沒看明白,有點像用狀態機原理
作者: wulin    時間: 2023-10-31 16:33
殿堂之上 發表于 2023-10-31 12:20
1、主循環中的j是啥作用
2、按鍵中count為啥取10,是掃描10次消抖
3、沒用中斷,主循環時間長會丟鍵嗎
...

沒有用定時器,在主循環中用delayms(1);使主循環周期大約1ms,按鍵掃描10次消抖,j計數250ms,控制流水燈移動速度。
作者: 深層次    時間: 2023-11-4 09:10
wulin 發表于 2023-10-30 09:11
這就是一個花樣流水燈的程序,給你改好了。

太厲害了,就是要這種效果,原來還可以這樣子實現

作者: 深層次    時間: 2023-11-4 09:10
lkc8210 發表于 2023-10-29 21:15
給你一個例子

嗯嗯,明白了

作者: 深層次    時間: 2023-11-4 09:11
changhz 發表于 2023-10-29 20:11
程序修改可以了,不過效率太低了,要用定時器才行。
#include
#define uchar unsigned  char

很不錯的想法,給我一種新思路了

作者: xianfajushi    時間: 2023-11-8 10:41
今天遇到一個有趣的32燈流水及按鍵復用,題主電路。

我的電路。







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 天天看天天操 | 韩日一区 | 一级做a爰片性色毛片16 | 在线免费黄色 | caoporon| 亚洲精品一区二区三区 | 国产美女一区二区三区 | 日韩国产一区二区三区 | 91久久精品一区二区二区 | 天天操 天天操 | 久在线视频播放免费视频 | av二区三区 | h在线看 | 精品久久中文字幕 | 99re在线播放 | 正在播放国产精品 | 污免费网站 | 亚洲视频在线播放 | 99精品视频网 | 激情黄色在线观看 | 欧美精品综合在线 | 精品久久电影 | 国产精品视频在线观看 | 欧美日韩国产一区二区 | 丁香六月伊人 | 成人黄色在线视频 | 亚洲一区二区三区四区五区中文 | 亚洲伦理自拍 | 亚洲成人久久久 | 手机在线不卡av | 欧美激情视频一区二区三区在线播放 | 亚洲成人免费视频 | 国产成人免费视频网站高清观看视频 | 久久精品国产免费看久久精品 | av在线一区二区 | 日韩在线| 91精品入口蜜桃 | 九九久久精品 | 四虎永久影院 | 婷婷综合五月天 | 欧美黑人又粗大 |