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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2761|回復: 5
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
單片機源程序如下:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. void delayMS(uint x);
  5. void KeyProcess(uchar Key);
  6. uchar GetKey();


  7. //延時函數
  8. void delayMS(uint x)
  9. {
  10.     uchar i;

  11. while (x--)
  12. for(i=0;i<120; i++) ;
  13. }

  14. //檢測按鍵

  15. uchar GetKey()

  16. {

  17. uchar k;

  18. if(P1==0xFF)
  19. return 0;

  20. delayMS(10);

  21. switch (P1)

  22. {

  23. case 0xF7: k=1;break;

  24. case 0xFB: k=2;break;

  25. case 0xFD: k=3;break;

  26. case 0xFE: k=4;break;

  27. default: k=0;

  28. }

  29. while (P1 != 0xFF);//等待釋放按鍵(釋放按鍵時退出循環)

  30. return k;
  31. }
  32. //鍵盤按鍵處理


  33. void KeyProcess(uchar Key)

  34. {

  35. switch (Key)

  36. {

  37. case 1://led燈全部點亮

  38. P0=0x00;
  39. break;

  40. case 2://以流水燈形式點亮
  41. P0=0x7f;
  42. while(1)
  43. P0>>=1;
  44. break;
  45. case 3: //led燈進行閃爍
  46. if(Key==3)
  47. {
  48. P0=0x00;
  49. delayMS(100);
  50. P0=0xff;
  51. delayMS(100);
  52. }
  53. while(Key!=3);
  54. break;
  55. case 4://全部關閉
  56. P0=0xff;
  57. break;
  58. }

  59. }
  60. //主程序

  61. //--------------------------------------------------------------------

  62. void main()

  63. {

  64. uchar Key;

  65. P0=P1=0xFF;

  66. while(1)

  67. {

  68. Key=GetKey();

  69. if(Key!=0)  KeyProcess(Key);

  70. }

  71. }
復制代碼


用上面程序的hex文件后,按了按鍵沒反應,將檢測按鍵直接刪去后有一點反應,但達不到預期效果。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89515 發表于 2020-10-5 12:54 來自觸屏版 | 只看該作者
你的按鍵接的高四位吧?按鍵2,3的功能有邏輯問題。
回復

使用道具 舉報

板凳
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:332444 發表于 2020-10-6 09:58 | 只看該作者
按鍵釋放后主程序再次調用按鍵就被賦值0,因此,思路需重新考慮。
回復

使用道具 舉報

5#
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);
               
                }
}
回復

使用道具 舉報

6#
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;

}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热精品在线观看 | 啪啪毛片 | 欧美黄色大片在线观看 | 黄色免费在线观看网址 | 亚洲第一天堂 | 日韩精品国产精品 | 国产精品区二区三区日本 | 日韩在线免费视频 | 黄色国产大片 | 国产精品久久久久久久免费大片 | 午夜爱爱网 | 黄视频网站免费观看 | av网站在线看 | 国产精品第2页 | 欧美激情亚洲天堂 | 成人网av| 国产精品久久久久久久久久 | 日本久久久一区二区三区 | 久久久久久综合 | 久久日韩粉嫩一区二区三区 | 中文字幕日韩欧美一区二区三区 | 亚洲精品在线看 | 福利视频大全 | 欧美不卡 | 国产成人av在线播放 | 一区二区中文 | 欧洲一区二区在线 | 亚洲一区二区三区在线观看免费 | 亚洲乱码一区二区三区在线观看 | 国产欧美日韩一区 | 日日欧美 | 91精品国产一区二区三区蜜臀 | 久久精品无码一区二区三区 | 偷牌自拍 | 中国xxxx性xxxx产国 | 日韩精品 电影一区 亚洲 | 丝袜久久 | 毛片大全 | 在线观看中文字幕视频 | 成人亚洲视频 | 亚洲精品电影 |