找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 957|回复: 7
打印 上一主题 下一主题
收起左侧

单片机程序按钮不起作用

[复制链接]
跳转到指定楼层
楼主
ID:97678 发表于 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;
    }
}



   
    这个程序有什么问题?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2024-10-11 18:08 | 只看该作者
PLC()函数内为啥要加while(1)?
回复

使用道具 举报

板凳
ID:1041695 发表于 2024-10-11 18:36 | 只看该作者
按键是否做了防抖处理?按键按下时会有高低波动的电平。
回复

使用道具 举报

地板
ID:97678 发表于 2024-10-12 08:46 | 只看该作者
lkc8210 发表于 2024-10-11 18:08
PLC()函数内为啥要加while(1)?

我是把两个程序合并到一起的,有一些没有删除干净。
回复

使用道具 举报

5#
ID:97678 发表于 2024-10-12 08:47 | 只看该作者
lei848200 发表于 2024-10-11 18:36
按键是否做了防抖处理?按键按下时会有高低波动的电平。

做了。按钮部分独立的测试,按钮是可以正常的工作的。合并在一起,就不行了。
回复

使用道具 举报

6#
ID:484491 发表于 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
      
回复

使用道具 举报

7#
ID:97678 发表于 2024-10-13 10:03 | 只看该作者
ok, 删除程序的时候,忘记删除这里。
回复

使用道具 举报

8#
ID:1133081 发表于 2024-10-14 19:05 | 只看该作者
jovew 发表于 2024-10-13 10:03
ok, 删除程序的时候,忘记删除这里。

如果芯片确实是使用的ST8H;并且在key.h文件里没有对端口模式设置。很可能是按键所使用的端口处于芯片默认的高阻模式。需要对相应端口进行初始化设置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表