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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵程序運行不正常,幫忙看一下

[復制鏈接]
跳轉到指定樓層
樓主
K 是 開關機鍵。
k1,k2,k3,k4 是開機后,是操作鍵。鍵不能正常操作。


#include"stc8h.h"

sbit LEDR = P1^0;

sbit LEDB  = P1^4;
sbit LEDR0 = P1^5;
sbit LEDG0 = P1^6;
sbit LEDB0 = P1^7;


sbit KEY  = P3^7;
sbit KEY1 = P3^6;
sbit KEY2 = P3^5;
sbit KEY3 = P3^4;
sbit KEY4 = P3^3;

unsigned char keyshort; //短按鍵標志
unsigned char keylong;  //長按鍵標志

unsigned char keyshort1; //短按鍵標志
unsigned char keylong1;  //長按鍵標志

unsigned char keyshort2; //短按鍵標志
unsigned char keylong2;  //長按鍵標志

unsigned char keyshort3; //短按鍵標志
unsigned char keylong3;  //長按鍵標志

unsigned char keyshort4; //短按鍵標志
unsigned char keylong4;  //長按鍵標志

unsigned char LEDON;    //開燈狀態
unsigned char flag1ms;  //1ms標志
unsigned char flag1ms1;  //1ms標志
unsigned char flag1ms2;  //1ms標志
unsigned char flag1ms3;  //1ms標志
unsigned char flag1ms4;  //1ms標志

void key_Proc(); //按鍵處理
void led_Proc();  //燈處理

void key_Proc1(); //按鍵處理
void led_Proc1();  //燈處理

void key_Proc2(); //按鍵處理
void led_Proc2();  //燈處理

void key_Proc3(); //按鍵處理
void led_Proc3();  //燈處理

void key_Proc4(); //按鍵處理
void led_Proc4();  //燈處理

void Timer0Init(); //中斷初始化

void main()
{
    P0 = 0;
    P1 = 0;
    P2 = 0;

    Timer0Init();  //中斷初始化

    while(1)
    {
    key_Proc();   //按鍵處理
    led_Proc();  //燈處理
            
        key_Proc1();   //按鍵處理
    led_Proc1();  //燈處理
    key_Proc2();   //按鍵處理
    led_Proc2();  //燈處理
    key_Proc3();   //按鍵處理
    led_Proc3();  //燈處理            
    key_Proc4();   //按鍵處理
    led_Proc4();  //燈處理        
        }
}

void key_Proc()    //按鍵處理
{
      unsigned int keyTim; //按鍵時間
    if(flag1ms)  //1ms時間標志
    {
        flag1ms = 0;
        if(KEY)
        {
        if((keyTim>10)&&(keyTim<1000))  //按鍵時間大于10ms小于50ms,是短按鍵
        {
        keyshort = 1;   //短按鍵標志
        }
        keyTim = 0;        //按鍵時間清零
        }
        else
        {
        if(keyTim<5000)    //按鍵時間小于10S
        keyTim++;           //按鍵時間加
        if(keyTim==1500)    //按鍵時間為1S
        {
        keylong = 1;    //長按鍵標志
        }
        }      
    }
}

void led_Proc()   //燈處理
{
    if((LEDON==0)&&(keyshort==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keyshort = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR = 1;     //RGB燈亮白光
    }        
    if((LEDON==1)&&(keylong==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong = 0;  //長按鍵松開
        LEDON = 0;    //開燈時就關燈
        LEDR = 0;     //RGB燈滅
    }
}

void key_Proc1()    //按鍵處理
{
      unsigned int keyTim; //按鍵時間
    if(flag1ms1)  //1ms時間標志
    {
        flag1ms1 = 0;
        if(KEY1)
        {
        if((keyTim>10)&&(keyTim<1000))  //按鍵時間大于10ms小于50ms,是短按鍵
        {
        keyshort1 = 1;   //短按鍵標志
        }
        keyTim = 0;        //按鍵時間清零
        }
        else
        {
         if(keyTim<5000)    //按鍵時間小于10S
         keyTim++;           //按鍵時間加
         if(keyTim==1500)    //按鍵時間為1S
         {
         keylong1 = 1;    //長按鍵標志
         }
        }      
    }
}

void led_Proc1()   //燈處理
{
    if((LEDON==1)&&(keyshort1==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keyshort1 = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR0 = 1;     //RGB燈亮白光
        LEDG0 = 0;
        LEDB0 = 0;
    }        
    if((LEDON==1)&&(keylong1==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong1 = 0;  //長按鍵松開
        LEDON = 1;    //開燈時就關燈
        LEDR0 = 0;     //RGB燈滅
        LEDG0 = 0;
        LEDB0 = 0;
    }
}

void key_Proc2()    //按鍵處理
{
    if(flag1ms2)  //1ms時間標志
    {
                unsigned int keyTim; //按鍵時間
        flag1ms2 = 0;
        if(KEY2)
        {
        if((keyTim>10)&&(keyTim<1000))  //按鍵時間大于10ms小于50ms,是短按鍵
         {
         keyshort2 = 1;   //短按鍵標志
         }
         keyTim = 0;        //按鍵時間清零
        }
        else
        {
         if(keyTim<5000)    //按鍵時間小于10S
         keyTim++;           //按鍵時間加
         if(keyTim==1500)    //按鍵時間為1S
          {
          keylong2 = 1;    //長按鍵標志
          }
        }      
    }
}

void led_Proc2()   //燈處理
{
    if((LEDON==1)&&(keyshort2==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keyshort2 = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR0 = 0;     //RGB燈亮白光
        LEDG0 = 1;
        LEDB0 = 0;
    }        
    if((LEDON==1)&&(keylong2==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong2 = 0;  //長按鍵松開
        LEDON = 1;    //開燈時就關燈
        LEDR0 = 0;     //RGB燈滅
        LEDG0 = 0;
        LEDB0 = 0;
    }
}

void key_Proc3()    //按鍵處理
{
        unsigned int keyTim; //按鍵時間
    if(flag1ms3)  //1ms時間標志
    {
        flag1ms3 = 0;
        if(KEY3)
        {
        if((keyTim>10)&&(keyTim<1000))  //按鍵時間大于10ms小于50ms,是短按鍵
         {
         keyshort3 = 1;   //短按鍵標志
         }
         keyTim = 0;        //按鍵時間清零
        }
        else
        {
         if(keyTim<5000)    //按鍵時間小于10S
         keyTim++;           //按鍵時間加
         if(keyTim==1500)    //按鍵時間為1S
          {
          keylong3 = 1;    //長按鍵標志
          }
        }      
    }
}

void led_Proc3()   //燈處理
{
    if((LEDON==1)&&(keyshort3==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keyshort3 = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR0 = 0;     //RGB燈亮白光
        LEDG0 = 0;
        LEDB0 = 1;
    }        
    if((LEDON==1)&&(keylong3==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong3 = 0;  //長按鍵松開
        LEDON = 1;    //開燈時就關燈
        LEDR0 = 0;     //RGB燈滅
        LEDG0 = 0;
        LEDB0 = 0;
    }
    }
void key_Proc4()    //按鍵處理
{
        unsigned int keyTim; //按鍵時間
    if(flag1ms4)  //1ms時間標志
    {
        flag1ms4 = 0;
        if(KEY4)
        {
        if((keyTim>10)&&(keyTim<1000))  //按鍵時間大于10ms小于50ms,是短按鍵
         {
         keyshort4 = 1;   //短按鍵標志
         }
         keyTim = 0;        //按鍵時間清零
        }
        else
        {
         if(keyTim<5000)    //按鍵時間小于10S
         keyTim++;           //按鍵時間加
         if(keyTim==1500)    //按鍵時間為1S
          {
          keylong4 = 1;    //長按鍵標志
          }
        }      
    }
}

void led_Proc4()   //燈處理
{
    if((LEDON==1)&&(keyshort4==1))  //關燈狀態同時長按鍵按下就開燈
    {   
        keyshort4 = 0;  //長按鍵松開
        LEDON = 1;    //關燈時就開燈
        LEDR0 = 0;     //RGB燈亮白光
        LEDG0 = 0;
        LEDB = 1;
    }        
    if((LEDON==1)&&(keylong4==1)) //開燈狀態同時長按鍵按下就關燈
    {   
        keylong4 = 0;  //長按鍵松開
        LEDON = 0;    //開燈時就關燈
        LEDR0 = 0;     //RGB燈滅
        LEDG0 = 0;
        LEDB  = 0;
    }
    }

void Timer0Init()   //中斷初始化
{
    TMOD &= 0XF0; //中斷0模式1
    TMOD |= 0X01;
    TH0 = 0XFC;   //初值1ms
    TL0 = 0X66;
    ET0 = 1;     //允許T0中斷
    TR0 = 1;    //定時器0開始計時
    EA = 1;       //開中斷
    }

void interruptTimer0() interrupt 1
{
    TH0 = 0XFC;
    TL0 = 0X66;
    flag1ms = 1; //1ms標志
    flag1ms1 = 1; //1ms標志
      flag1ms2 = 1; //1ms標志
      flag1ms3 = 1; //1ms標志
      flag1ms4 = 1; //1ms標志
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2023-5-7 18:16 | 只看該作者
關于 I/O 的注意事項:
1、 P3.0 和 P3.1 口上電后的狀態為弱上拉/準雙向口模式
2、 除 P3.0 和 P3.1 外,其余所有 IO 口上電后的狀態均為高阻輸入狀態,用戶在使用 IO 口
前必須先設置 IO 口模式
3、 芯片上電時如果不需要使用 USB 進行 ISP 下載,P3.0/P3.1/P3.2 這 3 個 I/O 口不能同時
為低電平,否則會進入 USB 下載模式而無法運行用戶代碼
4、 芯片上電時,若 P3.0 和 P3.1 同時為低電平,P3.2 口會短時間由高阻輸入狀態切換到雙
向口模式,用以讀取 P3.2 口外部狀態來判斷是否需要進入 USB 下載模式
5、 當使用 P5.4 當作復位腳時,這個端口內部的 4K 上拉電阻會一直打開;但 P5.4 做普通
I/O 口時,基于這個 I/O 口與復位腳共享管腳的特殊考量,端口內部的 4K 上拉電阻依
然會打開大約 6.5 毫秒時間,再自動關閉(當用戶的電路設計需要使用 P5.4 口驅動外
部電路時,請務必考慮上電瞬間會有 6.5 毫秒時間的高電平的問題)

void main()
{
//所有端口初始化為準雙向口
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        P6M0 = 0x00;
        P6M1 = 0x00;
        P7M0 = 0x00;
        P7M1 = 0x00;


        P0 = 0;
        P1 = 0;
        P2 = 0;       
        Timer0Init();  //中斷初始化       
        while(1)
        {

評分

參與人數 1黑幣 +15 收起 理由
ldc2000 + 15 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:97678 發表于 2023-5-7 18:47 | 只看該作者
wulin 發表于 2023-5-7 18:16
關于 I/O 的注意事項:
1、 P3.0 和 P3.1 口上電后的狀態為弱上拉/準雙向口模式
2、 除 P3.0 和 P3.1 外 ...

還是不對!
還是部分操作正確,部分不正確。
回復

使用道具 舉報

地板
ID:213173 發表于 2023-5-7 19:16 | 只看該作者
jovew 發表于 2023-5-7 18:47
還是不對!
還是部分操作正確,部分不正確。

你的按鍵代碼問題嚴重,一二十行代碼的事情你洋洋灑灑寫了這么多?
回復

使用道具 舉報

5#
ID:161164 發表于 2023-5-7 22:16 | 只看該作者
static unsigned int keyTim; //按鍵時間
回復

使用道具 舉報

6#
ID:97678 發表于 2023-5-8 06:26 來自手機 | 只看該作者
wulin 發表于 2023-5-7 19:16
你的按鍵代碼問題嚴重,一二十行代碼的事情你洋洋灑灑寫了這么多?

我需要幫助。請您指出我的問題在哪里行嗎?。
回復

使用道具 舉報

7#
ID:97678 發表于 2023-5-8 08:15 | 只看該作者
lkc8210 發表于 2023-5-7 22:16
static unsigned int keyTim; //按鍵時間

還是不行! 我的程序,一個按鍵就可以工作。增加到5個按鍵,就不行了。
回復

使用道具 舉報

8#
ID:213173 發表于 2023-5-8 09:43 | 只看該作者
jovew 發表于 2023-5-7 18:47
還是不對!
還是部分操作正確,部分不正確。

給你把按鍵掃描部分改了,燈處理按自己意圖補充完善。
  1. //K 是 開關機鍵。
  2. //k1,k2,k3,k4 是開機后,是操作鍵。鍵不能正常操作。
  3. #include"stc8h.h"
  4. /*
  5. sbit KEY  = P3^7;
  6. sbit KEY1 = P3^6;
  7. sbit KEY2 = P3^5;
  8. sbit KEY3 = P3^4;
  9. sbit KEY4 = P3^3;
  10. */
  11. unsigned char Key_value;//鍵值
  12. unsigned int keyTim; //按鍵時長
  13. bit flag1ms;//1ms中斷標志

  14. void Timer0Init();  //T0初始化       
  15. void key_scan();    //按鍵掃描
  16. void led_Proc();   //燈處理

  17. void main()
  18. {
  19.         P0M0 = 0x00;
  20.         P0M1 = 0x00;
  21.         P1M0 = 0x00;
  22.         P1M1 = 0x00;
  23.         P2M0 = 0x00;
  24.         P2M1 = 0x00;
  25.         P3M0 = 0x00;
  26.         P3M1 = 0x00;
  27.         P4M0 = 0x00;
  28.         P4M1 = 0x00;
  29.         P5M0 = 0x00;
  30.         P5M1 = 0x00;
  31.         P6M0 = 0x00;
  32.         P6M1 = 0x00;
  33.         P7M0 = 0x00;
  34.         P7M1 = 0x00;       
  35.         P1=0x00;//P1用于演示鍵值
  36.         Timer0Init();  //T0初始化
  37.         while(1)
  38.         {
  39.                 key_scan();
  40.                 led_Proc();
  41.         }
  42. }

  43. void interruptTimer0() interrupt 1
  44. {
  45.         flag1ms = 1;    //1ms標志
  46. }

  47. void Timer0Init(void)//1毫秒@11.0592MHz
  48. {
  49.         AUXR |= 0x80;                //定時器時鐘1T模式
  50.         TMOD &= 0xF0;                //設置定時器自動重載模式
  51.         TL0 = 0xCD;                        //設置定時初始值
  52.         TH0 = 0xD4;                        //設置定時初始值
  53.         TF0 = 0;                                //清除TF0標志
  54.         TR0 = 1;                                //定時器0開始計時
  55.         ET0 = 1;                                //允許T0中斷
  56.         EA = 1;                                //開總中斷
  57. }

  58. void key_scan()    //按鍵掃描
  59. {
  60.         unsigned char temp;//臨時變量
  61.         if(flag1ms)  //1ms時間標志
  62.         {
  63.                 flag1ms = 0;//1ms時間標志清0
  64.                 temp=P3&0xf8;//5個獨立按鍵P3.3~3.7
  65.                 if(temp!=0xf8)
  66.                 {
  67.                         if(++keyTim>1000)keyTim=1001;//防止溢出

  68.                         if(keyTim==10) //大于10ms小于1s算短按
  69.                         {
  70.                                 switch(temp)
  71.                                 {
  72.                                         case 0xf0: Key_value=0x01; break;
  73.                                         case 0xe8: Key_value=0x02; break;
  74.                                         case 0xd8: Key_value=0x03; break;
  75.                                         case 0xb8: Key_value=0x04; break;
  76.                                         case 0x78: Key_value=0x05; break;
  77.                                 }
  78.                         }
  79.                         if(keyTim==1000) //達到1s算長按
  80.                         {
  81.                                 Key_value|=0x10;
  82.                         }
  83.                 }
  84.                 else keyTim=0;        //按鍵松手keyTim清0
  85.         }
  86. }

  87. void led_Proc()   //燈處理
  88. {//短按等松手響應,長按達1s不論是否松手即響應
  89.         if((keyTim==0||keyTim==1000) && Key_value!=0x00)
  90.         {
  91.                 switch(Key_value)
  92.                 {
  93.                         case 0x01: P1=0x01; break;//短按1任務
  94.                         case 0x02: P1=0x02; break;//短按2任務
  95.                         case 0x03: P1=0x03; break;//短按3任務
  96.                         case 0x04: P1=0x04; break;//短按4任務
  97.                         case 0x05: P1=0x05; break;//短按5任務
  98.                         case 0x11: P1=0x11; break;//長按1任務
  99.                         case 0x12: P1=0x12; break;//長按2任務
  100.                         case 0x13: P1=0x13; break;//長按3任務
  101.                         case 0x14: P1=0x14; break;//長按4任務
  102.                         case 0x15: P1=0x15; break;//長按5任務
  103.                 }
  104.                 Key_value=0x00;//任務完成后鍵值清0
  105.         }
  106. }

復制代碼
回復

使用道具 舉報

9#
ID:161164 發表于 2023-5-8 10:04 | 只看該作者
jovew 發表于 2023-5-8 08:15
還是不行! 我的程序,一個按鍵就可以工作。增加到5個按鍵,就不行了。

除了led_Proc4()有一點問題(已修正)其他都正常



回復

使用道具 舉報

10#
ID:97678 發表于 2023-5-8 13:28 | 只看該作者
wulin 發表于 2023-5-8 09:43
給你把按鍵掃描部分改了,燈處理按自己意圖補充完善。

謝謝!運行正常的!
我想知道我寫的這個程序,哪里有問題?
回復

使用道具 舉報

11#
ID:97678 發表于 2023-5-8 13:29 | 只看該作者
lkc8210 發表于 2023-5-8 10:04
除了led_Proc4()有一點問題(已修正)其他都正常

可以把代碼給我看看嗎?
回復

使用道具 舉報

12#
ID:97678 發表于 2023-5-8 13:57 | 只看該作者
wulin 發表于 2023-5-8 09:43
給你把按鍵掃描部分改了,燈處理按自己意圖補充完善。

我想知道這個程序有什么問題,為什么不能工作?
回復

使用道具 舉報

13#
ID:332444 發表于 2023-5-8 15:30 | 只看該作者
還以為是這樣的矩陣,按鍵時間弄那么長達幾秒有什么意義?像圖片這樣的矩陣可以演化為一組IO能實現16*4的矩陣。


回復

使用道具 舉報

14#
ID:97678 發表于 2023-5-8 19:20 來自手機 | 只看該作者
xianfajushi 發表于 2023-5-8 15:30
還以為是這樣的矩陣,按鍵時間弄那么長達幾秒有什么意義?像圖片這樣的矩陣可以演化為一組IO能實現16*4的矩 ...

在機器上,發生故障,有的是短時間,有的是長時間的。必須逐個判斷。分別處理故障。而且需要可靠。所以,一個點,就要一個鍵。
回復

使用道具 舉報

15#
ID:161164 發表于 2023-5-8 20:58 | 只看該作者
jovew 發表于 2023-5-8 13:29
可以把代碼給我看看嗎?


回復

使用道具 舉報

16#
ID:97678 發表于 2023-5-9 13:27 | 只看該作者
終于修改成功。運行正常了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 涩涩鲁亚洲精品一区二区 | 精品在线免费看 | 日本高清视频网站 | 欧美亚洲国产一区 | 日日噜噜夜夜爽爽狠狠 | 久久久久一区二区 | 欧美日韩最新 | av大全在线观看 | 国产一级片免费在线观看 | 欧美一级免费黄色片 | 国产综合在线视频 | 欧美激情精品久久久久久免费 | 久久久久久久99 | 视频一区中文字幕 | 日韩一区二区三区在线观看 | 成人a视频在线观看 | 日韩精品在线看 | 欧美爱爱视频网站 | 美女福利视频网站 | 日本人爽p大片免费看 | 国产精品久久久久久久免费大片 | 精品国产乱码久久久久久闺蜜 | 视频二区| 精品欧美乱码久久久久久 | 国产一区二区三区四区五区3d | 在线亚洲电影 | 国产毛片久久久 | 国产精品成人一区二区三区 | 日韩视频在线播放 | 嫩呦国产一区二区三区av | 国产区高清 | 亚洲第一av | 国产欧美一级二级三级在线视频 | 日韩中文在线视频 | 日日操夜夜操视频 | 成人免费一区二区三区视频网站 | 每日更新av| 欧美日韩高清 | 午夜电影在线播放 | 国产成人99久久亚洲综合精品 | 亚洲国产精品va在线看黑人 |