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

標題: 單片機程序按鈕不起作用 [打印本頁]

作者: jovew    時間: 2024-10-11 09:38
標題: 單片機程序按鈕不起作用
#include "stc8h.h"
#include "key.h"

    void main()
{
    Timer0Init();  //中斷初始化
   
    while(1)
    {
     key_Proc();   //按鍵處理
     led_Proc();  //燈處理
     key_Proc1();   //按鍵處理
     led_Proc1();  //燈處理        
         plc();   
    }
}

void plc()
{
//times = 1;   
while(1)
{   
switch(times) //一開始times=1
{
    case 0:
RED_1   =0;
YELLOW_1=0;
GREEN_1 =0;
RED_2   =0;
YELLOW_2=0;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==2){times=0;ses=0;}//s 等于0   而且回答 跳到1語句
break;            

case 1:   
RED_1   =1;
YELLOW_1=0;
GREEN_1 =0;
RED_2   =0;
YELLOW_2=0;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==2){times=2;ses=0;}//s 等于0   而且回答 跳到1語句
break;

case 2:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =0;
RED_2   =0;
YELLOW_2=0;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==1){times=3;ses=0;}//s 等于0   而且回答 跳到1語句                        
break;

case 3:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =0;
YELLOW_2=0;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==1){times=4;ses=0;}//s 等于0   而且回答 跳到1語句
break;

case 4:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =1;
YELLOW_2=0;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義  
if(ses==1){times=5;ses=0;}//s 等于0   而且回答 跳到1語句
break;

case 5:   
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =1;
YELLOW_2=1;
GREEN_2 =0;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==1){times=6;ses=0;}//s 等于0   而且回答 跳到1語句
break;

case 6:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =1;
YELLOW_2=1;
GREEN_2 =1;//位定義
GREEN_3 =0;//位定義
GREEN_4 =0;//位定義
if(ses==2){times=7;ses=0;}//s 等于0   而且回答 跳到1語句
break;
                        
case 7:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =1;
YELLOW_2=1;
GREEN_2 =1;//位定義
GREEN_3 =1;//位定義
GREEN_4 =0;//位定義
if(ses==2){times=8;ses=0;}//s 等于0   而且回答 跳到1語句
break;

case 8:
RED_1   =1;
YELLOW_1=1;
GREEN_1 =1;
RED_2   =1;
YELLOW_2=1;
GREEN_2 =1;//位定義
GREEN_3 =1;//位定義
GREEN_4 =1;//位定義
if(ses==2){times=1;ses=0;}//s 等于0   而且回答 跳到1語句
break;                        
}
}
}

void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XfC;//給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}


void interruptTimer0() interrupt 1
{
    TH0 = 0XFC;
    TL0 = 0X66;
   
    flag1ms = 1; //1ms標志
      flag1ms1 = 1; //1ms標志

    sess++; //毫秒
   
    if(sess==1000) //1000毫秒 =1s
    {
      sess=0;//ms 等于0
      ses++; //s 加1
   
    }
    }

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

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

}

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

void led_Proc1()   //燈處理
{

    if((LEDON==1)&&(keylong==0))  //關燈狀態,同時長按鍵按下就開燈
    {   
        keyshort1 = 0;  //長按鍵松開
        LEDB = 1;
        LEDW = 1;        
              times1=1;
    }        
   
    if((LEDON==1)&&(keylong1==1)) //開燈狀態,同時長按鍵按下就關燈
    {   
        keylong1 = 0;  //長按鍵松開
        LEDB = 0;
              LEDW = 0;
              times1=0;
    }
}



   
    這個程序有什么問題?


作者: lkc8210    時間: 2024-10-11 18:08
PLC()函數內為啥要加while(1)?
作者: lei848200    時間: 2024-10-11 18:36
按鍵是否做了防抖處理?按鍵按下時會有高低波動的電平。
作者: jovew    時間: 2024-10-12 08:46
lkc8210 發表于 2024-10-11 18:08
PLC()函數內為啥要加while(1)?

我是把兩個程序合并到一起的,有一些沒有刪除干凈。
作者: jovew    時間: 2024-10-12 08:47
lei848200 發表于 2024-10-11 18:36
按鍵是否做了防抖處理?按鍵按下時會有高低波動的電平。

做了。按鈕部分獨立的測試,按鈕是可以正常的工作的。合并在一起,就不行了。
作者: liang45    時間: 2024-10-12 23:51
void plc()
{
    //times = 1;   
    while(1)                  
    {   
        switch(times) //一開始times=1
        {
            case 0:
        RED_1   =0;
        YELLOW_1=0;
        GREEN_1 =0;
        RED_2   =0;
        YELLOW_2=0;
        GREEN_2 =0;//位定義


你這個while(1)這樣寫會一直跑這個循環的,都出不去,那你的按鍵處理函數都沒有跑,按鍵自然就沒有起作用,我不知道你為什么要這樣寫,你這個程序框架簡化是這樣
while(1)
{
       ,,,,,,,,
       while(1)
       {        
        ,,,,,,,
        }
}
一直跑這個while,都沒出去,你看看怎么改掉這個while
      
作者: jovew    時間: 2024-10-13 10:03
ok, 刪除程序的時候,忘記刪除這里。
作者: WL0123    時間: 2024-10-14 19:05
jovew 發表于 2024-10-13 10:03
ok, 刪除程序的時候,忘記刪除這里。

如果芯片確實是使用的ST8H;并且在key.h文件里沒有對端口模式設置。很可能是按鍵所使用的端口處于芯片默認的高阻模式。需要對相應端口進行初始化設置。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产一区91精品张津瑜 | 日韩欧美在线播放 | 中文字幕av高清 | 欧美日韩综合精品 | 国产一卡二卡三卡 | 伊人伊人 | 国产精品久久久久久久久久久久 | 欧美三区视频 | 黄色精品| 婷婷开心激情综合五月天 | 久久久久久久久久久高潮一区二区 | 成人久久18免费网站图片 | 久久久一区二区三区 | 免费黄色录像视频 | 久草资源在线视频 | 精品久久久久久久 | 国产视频久 | 羞羞视频免费在线观看 | 成人av一区 | 久久久久国产一区二区三区四区 | 精品视频一区二区三区在线观看 | 欧美中文字幕一区二区三区亚洲 | 亚洲精品1 | 久久久国产一区二区三区 | 日韩av在线免费 | 欧美成人aaa级毛片在线视频 | 免费国产一区 | 四虎永久免费地址 | 午夜视频免费网站 | 国产精选一区 | 五月婷六月丁香 | 三级在线视频 | 欧美日韩一二三区 | 国产情品 | 日韩在线播放一区 | 日韩精品一区二区三区在线观看 | 精品久久久久久久久久久久久 | 久久免费国产视频 | 国产欧美精品区一区二区三区 | 国产成年人视频 | 国产精品美女www |