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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3141|回復: 7
收起左側

單片機key按鍵處理函數-長按和短按沒反應

[復制鏈接]
ID:740383 發表于 2020-8-6 16:55 | 顯示全部樓層 |閱讀模式
代碼沒反應!!!
按鍵處理函數:
長按點亮LED1
短按點亮LED1
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LONG_time  4        //定義長按設置鍵的時間               
  6. uchar        Keycount;                    //設置按鍵時長計數器
  7. uchar        skpttime;                    //設置按鍵時長
  8. uchar        longflag;                    //設置長按標志
  9. bit                skpflag;                                //設置按鍵按下標志
  10. sbit        SETKEY =P2^0;   //多功能按鍵(短按,長按)
  11. sbit  LED1   =P2^1;
  12. sbit  LED2   =P2^2;
  13. void delay1ms(uchar ms)
  14. {        
  15.         while(ms--)                                                   //每循環一次,約延遲1ms
  16.         {        
  17.                 uchar i;
  18.                 for(i=0;i<250;i++)     //循環250次,在12M晶振時約延時1ms
  19.                 {
  20.                         _nop_();                               //執行一條_nop_()指令為一個機器周期
  21.                         _nop_();
  22.                         _nop_();
  23.                         _nop_();
  24.                 }
  25.         }
  26. }        
  27. /*------------按鍵處理程序--------------------------*/
  28. void KEY_Short()          /*(短按k2)*/
  29. {
  30.         LED1=1;
  31.         LED2=0;
  32. }
  33. void KEY_Long()           /*(長按k2)*/
  34. {
  35.         LED1=0;
  36.         LED2=1;
  37. }
  38. /*----------檢測及處理多功能設置按鍵KEY-------------*/
  39. void setkeyscan()
  40. {
  41.         if(skpflag)                                                                                //判斷是否已經有鍵按下未被處理
  42.         {
  43.                 if(Keycount>LONG_time)                        //如果是長按則執行長按鍵設置功能
  44.                 {
  45.                         KEY_Long();
  46.                         skpflag=0;
  47.                         longflag=1;
  48.                 }
  49.                 else if((skpttime>0)&&(skpttime<=LONG_time))//否則如果是短按則執行短按的功能,都不是直接跳過
  50.                 {
  51.                         KEY_Short();
  52.                         skpflag=0;
  53.                 }
  54.         }
  55.         else
  56.         {
  57.                 if(!SETKEY)                                                                //按下設置鍵
  58.                 {
  59.                         delay1ms(10);                                                //鍵盤防抖
  60.                         if((!SETKEY)&&longflag==0)
  61.                         {
  62.                                 Keycount=0;                                          //初始化按鍵時長計數器
  63.                                 skpttime=0;                                                //初始化按鍵時長
  64.                                 skpflag=1;                                                //標志已經有鍵被按下
  65.                                 longflag=0;
  66.                         }
  67.                 }else
  68.                 {
  69.       longflag=0;
  70.     }
  71.         }
  72. }
  73. void key_init()
  74. {
  75.         Keycount=0;                                                  //初始化功能鍵按下時長計數器
  76.         skpttime=0;                                                        //初始化功能鍵按下的總時長
  77.         SETKEY=1;                                                          //KEY設置為輸入端口
  78.         longflag=0;
  79.         LED1=0;
  80.         LED2=0;
  81. }
  82. /*---------------主函數--------------------*/
  83. void main()
  84. {
  85.         TMOD=0X01;
  86.         TH0=(65536-50000)/256;
  87.         TL0=(65536-50000)%256;
  88.         EA=1;
  89.         ET0=1;
  90.   key_init();
  91.         while(1)
  92.         {
  93.                 setkeyscan();
  94.         }
  95. }
  96. /*************定時器中斷函數****************/
  97. void Timer0(void) interrupt 1
  98. {
  99.         if(skpflag)
  100.         {
  101.                 Keycount++;
  102.                 if(SETKEY)
  103.                         skpttime=Keycount;
  104.         }
  105. }
復制代碼


#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LONG_time  4        //定義長按設置鍵的時間               
uchar        Keycount;                    //設置按鍵時長計數器
uchar        skpttime;                    //設置按鍵時長
uchar        longflag;                    //設置長按標志
bit                skpflag;                                //設置按鍵按下標志
sbit        SETKEY =P2^0;   //多功能按鍵(短按,長按)
sbit  LED1   =P2^1;
sbit  LED2   =P2^2;
void delay1ms(uchar ms)
{        
        while(ms--)                                                   //每循環一次,約延遲1ms
        {        
                uchar i;
                for(i=0;i<250;i++)     //循環250次,在12M晶振時約延時1ms
                {
                        _nop_();                               //執行一條_nop_()指令為一個機器周期
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}        
/*------------按鍵處理程序--------------------------*/
void KEY_Short()          /*(短按k2)*/
{
        LED1=1;
        LED2=0;
}
void KEY_Long()           /*(長按k2)*/
{
        LED1=0;
        LED2=1;
}
/*----------檢測及處理多功能設置按鍵KEY-------------*/
void setkeyscan()
{
        if(skpflag)                                                                                //判斷是否已經有鍵按下未被處理
        {
                if(Keycount>LONG_time)                        //如果是長按則執行長按鍵設置功能
                {
                        KEY_Long();
                        skpflag=0;
                        longflag=1;
                }
                else if((skpttime>0)&&(skpttime<=LONG_time))//否則如果是短按則執行短按的功能,都不是直接跳過
                {
                        KEY_Short();
                        skpflag=0;
                }
        }
        else
        {
                if(!SETKEY)                                                                //按下設置鍵
                {
                        delay1ms(10);                                                //鍵盤防抖
                        if((!SETKEY)&&longflag==0)
                        {
                                Keycount=0;                                          //初始化按鍵時長計數器
                                skpttime=0;                                                //初始化按鍵時長
                                skpflag=1;                                                //標志已經有鍵被按下
                                longflag=0;
                        }
                }else
                {
      longflag=0;
    }
        }
}
void key_init()
{
        Keycount=0;                                                  //初始化功能鍵按下時長計數器
        skpttime=0;                                                        //初始化功能鍵按下的總時長
        SETKEY=1;                                                          //KEY設置為輸入端口
        longflag=0;
        LED1=0;
        LED2=0;
}
/*---------------主函數--------------------*/
void main()
{
        TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
  key_init();
        while(1)
        {
                setkeyscan();
        }
}
/*************定時器中斷函數****************/
void Timer0(void) interrupt 1
{
        if(skpflag)
        {
                Keycount++;
                if(SETKEY)
                        skpttime=Keycount;
        }
}


VTX36BOJH2XSS3BQY5$[1VJ.png

Key.zip

81.75 KB, 下載次數: 6

按鍵處理程序

回復

使用道具 舉報

ID:86926 發表于 2020-8-7 08:22 | 顯示全部樓層
定時器都沒有開啟
回復

使用道具 舉報

ID:716656 發表于 2020-8-7 08:39 | 顯示全部樓層
好像沒有看到TR0
回復

使用道具 舉報

ID:332444 發表于 2020-8-7 08:49 | 顯示全部樓層
回復

使用道具 舉報

ID:740383 發表于 2020-8-7 10:03 | 顯示全部樓層
藍魄 發表于 2020-8-7 08:22
定時器都沒有開啟

謝謝謝謝,開啟了定時器,解決了
回復

使用道具 舉報

ID:740383 發表于 2020-8-7 10:04 | 顯示全部樓層

謝謝大佬,現在開啟TR0解決了
回復

使用道具 舉報

ID:790738 發表于 2020-8-7 10:14 | 顯示全部樓層
使用51單片機的io口的話則需要上拉才有足夠電流驅動,你這樣就算代碼沒問題也亮不了
回復

使用道具 舉報

ID:146782 發表于 2020-8-7 11:59 | 顯示全部樓層
定時器0沒有啟動,沒法計時
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费视频成人国产精品网站 | 91精品国产一区二区三区香蕉 | 欧美精品在线一区二区三区 | 久久精品国产免费看久久精品 | 欧日韩在线观看 | 日韩免费成人av | 国产精品成人免费 | 日日干日日射 | 久久久青草婷婷精品综合日韩 | 久久99精品久久久久婷婷 | 成年人网站在线观看视频 | 亚洲视频中文字幕 | 在线欧美 | 国产日韩欧美激情 | 欧美精品一区二区三区在线 | 久在线| 欧美性网站 | 亚洲欧美激情国产综合久久久 | 精品美女久久久 | 夜夜骑综合 | 成人午夜 | 成人在线观看免费 | 365夜爽爽欧美性午夜免费视频 | 精品久久一区二区三区 | 欧美黄色精品 | 91电影在线 | 国产一区二区三区色淫影院 | 成人精品一区二区三区 | 欧美aaa级| 午夜精品视频 | 久久人人爽人人爽人人片av免费 | 久久久久久久综合色一本 | a在线视频观看 | 黄色高清视频 | 色婷婷综合久久久久中文一区二区 | 国产精品欧美一区二区三区不卡 | 91免费在线 | 国产高清免费视频 | 成人在线精品 | 国产精品欧美一区二区三区不卡 | 久久久91精品国产一区二区三区 |