找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2298|回復(fù): 12
收起左側(cè)

單片機(jī)程序 卡在K2按鍵可以進(jìn)行模式加一這一步和K3的模式減一這一步

[復(fù)制鏈接]
ID:1096616 發(fā)表于 2023-10-29 08:42 | 顯示全部樓層 |閱讀模式
我的問題就卡在K2按鍵可以進(jìn)行模式加一這一步和K3的模式減一這一步,我不知道到這里我應(yīng)該如何將我之前編好的那八個模式導(dǎo)進(jìn)去,因?yàn)槲野阉鼈兌挤庋b成函數(shù),請大佬們給點(diǎn)提示,孩子真的寫不出來了。沒有任何思路

單片機(jī)源程序如下:
#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個都點(diǎn)亮(從低位往高位)
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點(diǎn)亮(從高位往低位)
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;//按鍵標(biāo)志位
void keyscan();//按鍵檢測函數(shù)
uchar i,j,a;
void delayms(uint xms);


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


void disp1()                        //狀態(tài)1 低位到高位依次亮
{
                for(i=0;i<8;i++)
                {
                P1=table0[ i];
                delayms(500);
                }
            P1=0xff;
                 
}
void disp2() //狀態(tài)2  LED從高位到低位依次亮
{  P1=0xff;
for(i=0;i<8;i++)
  {        P1=table1[ i];
        delayms(500);
  }
           
}
void disp3()  // 狀態(tài)3 LED閃爍3次
{   for(i=0;i<3;i++)
     {        P1=0X00;
     delayms(500);
        P1=0xff;
      delayms(500);
      }
           
}
void disp4()                        //狀態(tài)4 LED自上而下逐漸點(diǎn)亮
{
        
        for(i=0;i<8;i++)
        {
                P1=table3[ i];
                delayms(100);
        }
        P1=0xff;
}
void disp5()                        //狀態(tài)5 從LED全部亮到全不亮
{
        for(i=0;i<9;i++)
        {
                P1=table5[ i];
                delayms(100);
        }
        delayms(300);
}
void disp6()                        //狀態(tài)6 逐步逆時針點(diǎn)亮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()   //狀態(tài)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;//設(shè)標(biāo)志位1
   if(key1==0)//key1按鍵按下
   keyflag=2;//設(shè)標(biāo)志位2
   if(key2==0)//key2按鍵按下
   keyflag=3;//設(shè)標(biāo)志位3
   if(key3==0)//key3按鍵按下
   keyflag=4;//設(shè)標(biāo)志位4
   while(!key0);
   while(!key1);
   while(!key2);
   while(!key3);
  }
}
屏幕截圖 2023-10-29 083824.png
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2023-10-29 17:28 | 顯示全部樓層
你這個程序基本沒用,都死在子函數(shù)里了
回復(fù)

使用道具 舉報(bào)

ID:1096616 發(fā)表于 2023-10-29 17:57 | 顯示全部樓層
tyrl800 發(fā)表于 2023-10-29 17:28
你這個程序基本沒用,都死在子函數(shù)里了

那我應(yīng)該怎么去寫比較好呢?這個的K2和K3思路是什么?
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2023-10-29 19:35 | 顯示全部樓層
深層次 發(fā)表于 2023-10-29 17:57
那我應(yīng)該怎么去寫比較好呢?這個的K2和K3思路是什么?

用定時器延時
回復(fù)

使用道具 舉報(bào)

ID:180919 發(fā)表于 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個都點(diǎn)亮(從低位往高位)
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點(diǎn)亮(從高位往低位)
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;//按鍵標(biāo)志位
void keyscan();//按鍵檢測函數(shù)
uchar i,j,a;
void delayms(uint xms);


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


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

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

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

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

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

void disp6()                        //狀態(tài)6 逐步逆時針點(diǎn)亮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()   //狀態(tài)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++;//設(shè)標(biāo)志位2
               
                if(key2==0 && keyflag>2)//key2按鍵按下
                keyflag--;//設(shè)標(biāo)志位3
               
                if(key3==0)//key3按鍵按下
                keyflag=8;//設(shè)標(biāo)志位4
                       
                while(!key0);
                while(!key1);
                while(!key2);
                while(!key3);
  }
}

回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2023-10-29 21:15 | 顯示全部樓層
深層次 發(fā)表于 2023-10-29 17:57
那我應(yīng)該怎么去寫比較好呢?這個的K2和K3思路是什么?

給你一個例子
  1. void disp1()                        //狀態(tài)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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-10-30 09:11 | 顯示全部樓層
深層次 發(fā)表于 2023-10-29 17:57
那我應(yīng)該怎么去寫比較好呢?這個的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個都點(diǎn)亮(從低位往高位)
  11. uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED從1個亮到8個都點(diǎn)亮(從高位往低位)
  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;//按鍵標(biāo)志位

  17. void keyscan();//按鍵檢測函數(shù)
  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. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:1095802 發(fā)表于 2023-10-31 12:20 來自觸屏版 | 顯示全部樓層
wulin 發(fā)表于 2023-10-30 09:11
這就是一個花樣流水燈的程序,給你改好了。

1、主循環(huán)中的j是啥作用
2、按鍵中count為啥取10,是掃描10次消抖
3、沒用中斷,主循環(huán)時間長會丟鍵嗎
能說明下嗎,沒看明白,有點(diǎn)像用狀態(tài)機(jī)原理
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-10-31 16:33 | 顯示全部樓層
殿堂之上 發(fā)表于 2023-10-31 12:20
1、主循環(huán)中的j是啥作用
2、按鍵中count為啥取10,是掃描10次消抖
3、沒用中斷,主循環(huán)時間長會丟鍵嗎
...

沒有用定時器,在主循環(huán)中用delayms(1);使主循環(huán)周期大約1ms,按鍵掃描10次消抖,j計(jì)數(shù)250ms,控制流水燈移動速度。
回復(fù)

使用道具 舉報(bào)

ID:1096616 發(fā)表于 2023-11-4 09:10 | 顯示全部樓層
wulin 發(fā)表于 2023-10-30 09:11
這就是一個花樣流水燈的程序,給你改好了。

太厲害了,就是要這種效果,原來還可以這樣子實(shí)現(xiàn)
回復(fù)

使用道具 舉報(bào)

ID:1096616 發(fā)表于 2023-11-4 09:10 | 顯示全部樓層

嗯嗯,明白了
回復(fù)

使用道具 舉報(bào)

ID:1096616 發(fā)表于 2023-11-4 09:11 | 顯示全部樓層
changhz 發(fā)表于 2023-10-29 20:11
程序修改可以了,不過效率太低了,要用定時器才行。
#include
#define uchar unsigned  char

很不錯的想法,給我一種新思路了
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2023-11-8 10:41 | 顯示全部樓層
今天遇到一個有趣的32燈流水及按鍵復(fù)用,題主電路。
51hei.png
我的電路。
2.gif

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表