亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機多個獨立按鍵控制不同功能的led燈,檢測按鍵部分好像出了問題,求解

查看數: 3045 | 評論數: 5 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2020-10-4 17:00

正文摘要:

單片機源程序如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int void delayMS(uint x); void KeyProcess(uchar Key); uchar GetKey(); //延時函數 void delayMS(uint x) { &n ...

回復

ID:827243 發表于 2020-10-9 18:53
暈死, 按鍵高4位, 你判斷低4位,錯了。

switch (P1)

{

case 0xF7: k=1;break;

case 0xFB: k=2;break;

case 0xFD: k=3;break;

case 0xFE: k=4;break;

default: k=0;

}
ID:275826 發表于 2020-10-6 09:58
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Kport  P3
#define Ledport  P1
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移
unsigned char kscancnt;        //記錄進入中斷的次數,滿一個周期清零

void timer0_init();                        //定時器0初始化
void delayMS(uint x);           //延時函數
void KeyProcess(uchar Key);         //按鍵處理函數
bit flag;
uchar knum;
uint F3cnt,F2cnt,Pwmcnt,T0cnt;
uchar temp=0xff,temp1;
uchar sh_cnt;
//延時函數
void delayMS(uint x)
{
    uchar i;

   while (x--)
      for(i=0;i<120; i++) ;
}
/***************************************************
*                                定時器0初始化子函數
*                        工作方式2,每1000us中斷一次
****************************************************/
void timer0_init(void)
{
        TMOD = 0x01;                //采用定時器0,工作方式2,
        TH0 = (65536-1000)/256;                         //定時器設置,每隔20us發起一次中斷。
        TL0 = (65536-1000)%256;         
        ET0 = 1;                        //開定時器0中斷
        EA = 1;                                 //開總中斷
        TR0 = 1;                        //打開定時器
}

//檢測按鍵

uchar GetKey(uchar kscancnt)

{  
   uchar ktmp;
   if(kscancnt==0)
         {
          temp=(Kport&0xf0)>>4;
          ktmp=~temp &(temp1);
          if(ktmp)knum=ktmp;
          temp1=temp;
         }
   return knum;

}

//鍵盤按鍵處理

void KeyProcess(uchar Key)
  {
   
   switch (Key)
        {
           case 1:Ledport=0x00;                        
                       break;
               
           case 2:if(F2cnt==200){sh_cnt=++sh_cnt%8;F2cnt=0;}
                          Ledport=table0[sh_cnt];
                      break;
           case 4:if(T0cnt==300)
                    {F3cnt=F3cnt+10;T0cnt=0;}
                          if(F3cnt==130){F3cnt=0;flag=!flag;}
                  Pwmcnt=++Pwmcnt%100;

                          if(flag)
                            {if(Pwmcnt>F3cnt)Ledport=0x00;else Ledport=0xff;}
                          else
                            {if(Pwmcnt>F3cnt)Ledport=0xff;else Ledport=0x00;}
                  break;

           case 8:Ledport=0xff; //全部關閉
                          break;

        }

}

/***************************************************
*               中斷服務子函數
*****************************************************/
void time0(void) interrupt 1
{
    TH0 = (65536-1000)/256;                         //定時器設置,每隔20us發起一次中斷。
    TL0 = (65536-1000)%256;  
        kscancnt=++ kscancnt%10;
        if(knum==2)         {F2cnt++; }
    if(knum==4)         {T0cnt++; }
}


//--------------------------------------------------------------------

void main(void)

{  
        uchar Key;
        P0=P1=0xFF;
        timer0_init();
        while(1)
                   {
                 Key=GetKey(kscancnt);
                 KeyProcess(Key);
               
                }
}
ID:332444 發表于 2020-10-6 09:58
按鍵釋放后主程序再次調用按鍵就被賦值0,因此,思路需重新考慮。
ID:275826 發表于 2020-10-6 09:56
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Kport  P3
#define Ledport  P1
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED從低位往高位移
unsigned char kscancnt;        //記錄進入中斷的次數,滿一個周期清零

void timer0_init();                        //定時器0初始化
void delayMS(uint x);           //延時函數
void KeyProcess(uchar Key);         //按鍵處理函數
bit flag;
uchar knum;
uint F3cnt,F2cnt,Pwmcnt,T0cnt;
uchar temp=0xff,temp1;
uchar sh_cnt;
//延時函數
void delayMS(uint x)
{
    uchar i;

   while (x--)
      for(i=0;i<120; i++) ;
}
/***************************************************
*                                定時器0初始化子函數
*                        工作方式2,每1000us中斷一次
****************************************************/
void timer0_init(void)
{
        TMOD = 0x01;                //采用定時器0,工作方式2,
        TH0 = (65536-1000)/256;                         //定時器設置,每隔20us發起一次中斷。
        TL0 = (65536-1000)%256;         
        ET0 = 1;                        //開定時器0中斷
        EA = 1;                                 //開總中斷
        TR0 = 1;                        //打開定時器
}

//檢測按鍵

uchar GetKey(uchar kscancnt)

{  
   uchar ktmp;
   if(kscancnt==0)
         {
          temp=(Kport&0xf0)>>4;
          ktmp=~temp &(temp1);
          if(ktmp)knum=ktmp;
          temp1=temp;
         }
   return knum;

}

//鍵盤按鍵處理

void KeyProcess(uchar Key)
  {
   
   switch (Key)
        {
           case 1:Ledport=0x00;                        
                       break;
               
           case 2:if(F2cnt==200){sh_cnt=++sh_cnt%8;F2cnt=0;}
                          Ledport=table0[sh_cnt];
                      break;
           case 4:if(T0cnt==300)
                    {F3cnt=F3cnt+10;T0cnt=0;}
                          if(F3cnt==130){F3cnt=0;flag=!flag;}
                  Pwmcnt=++Pwmcnt%100;

                          if(flag)
                            {if(Pwmcnt>F3cnt)Ledport=0x00;else Ledport=0xff;}
                          else
                            {if(Pwmcnt>F3cnt)Ledport=0xff;else Ledport=0x00;}
                  break;

           case 8:Ledport=0xff; //全部關閉
                          break;

        }

}

/***************************************************
*               中斷服務子函數
*****************************************************/
void time0(void) interrupt 1
{
    TH0 = (65536-1000)/256;                         //定時器設置,每隔20us發起一次中斷。
    TL0 = (65536-1000)%256;  
        kscancnt=++ kscancnt%10;
        if(knum==2)         {F2cnt++; }
    if(knum==4)         {T0cnt++; }
}


//--------------------------------------------------------------------

void main(void)

{  
        uchar Key;
        P0=P1=0xFF;
        timer0_init();
        while(1)
                   {
                 Key=GetKey(kscancnt);
                 KeyProcess(Key);
               
                }
}
先把程序理解
ID:89515 發表于 2020-10-5 12:54
你的按鍵接的高四位吧?按鍵2,3的功能有邏輯問題。

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表