2035|14

202

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

如何才能按键按下一次,单片机就发送一次数据到串口助手,而且灯会点亮? [复制链接]

 
本帖最后由 xbxdbd 于 2024-1-25 14:11 编辑

第一次尝试写代码程序,我想按键按下一次,单片机就发送一次数据到串口助手,而且灯会点亮,按另外一个按键,发送一次另外的数据指令,灯会灭,但是我这边串口助手一直重复接收,按第二个按键串口助手还没有任何的反应,会是按键灵敏度的问题吗?还是说这个程序的逻辑是有问题的?偶尔才能收到第二个按键关闭的指令,求大佬帮忙是什么原因?我应该怎么修改

void Channel_control()
{
    if(key_flag1==1)
    {
        memset(buf,'\0',10);
        buf[0]=0x55;
        buf[1]=0xA5;
        buf[2]=0x01;
        buf[3]=0x00;
        buf[4]=0x00;
        buf[5]=0x00;
        buf[6]=0x21;
        buf[7]=0x2D;
        buf[8]=0x21;
        buf[9]=0x21;
        HAL_Delay(2000);
    }
    if(key_flag1==2)
    {
        memset(buf,'\0',10);
        buf[0]=0x55;
        buf[1]=0xA5;
        buf[2]=0;
        buf[3]=0;
        buf[4]=0;
        buf[5]=0;
        buf[6]=0x21;
        buf[7]=0x2D;
        buf[8]=0x21;
        buf[9]=0x21;
        key_flag1=0;
        HAL_Delay(2000);
    }
    
    if(key_flag6==1)
    {
        memset(buf,'\0',10);
        brightness1=brightness1+1;
        buf[0]=0x55;
        buf[1]=0xA5;
        buf[2]=0x01;
        buf[3]=0;
        buf[4]=0;
        buf[5]=0;
        buf[6]=brightness1;
        buf[7]=0x21;
        buf[8]=0x21;
        buf[9]=0x21;
        key_flag6=0;
    }
    if(key_flag11==1)
    {
        memset(buf,'\0',10);
        brightness1=brightness1-1;
        buf[0]=0x55;
        buf[1]=0xA5;
        buf[2]=0x01;
        buf[3]=0;
        buf[4]=0;
        buf[5]=0;
        buf[6]=brightness1;
        buf[7]=0x21;
        buf[8]=0x21;
        buf[9]=0x21;
        key_flag11=0;
    }
    HAL_UART_Transmit(&huart1, (uint8_t*)buf, sizeof(buf), 10);
    HAL_Delay(200);
}  

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  while (1)
  {
      key_scan();
      HAL_Delay(200);    
     JPEG_Display(0x00);//屏幕开机页面
     HAL_Delay(200);    
        
        Channel_control();
      Channe2_control();
        Channe3_control();
        Channe4_control();
        Toghter_Control();
        
        
        Draw_Trangle(0xBC40,46,75,90,261);
        Draw_Trangle(0x001F,185,75,230,261);
        Draw_Trangle(0x07E0,308,75,352,261);
        Draw_Trangle(0xF800,406,75,450,261);

  }
}

 

最新回复

你需要做按鍵防彈跳處理. 你可以利用變數達到你要的功能. 不難的,思考一下.     详情 回复 发表于 2024-1-31 16:42
点赞 关注
 
 

回复
举报

6591

帖子

9

TA的资源

版主

沙发
 

你这就是一直收啊,key_flag1==1,key_flag1==2才key_flag1=0,如果想只发一次,发送完就直接key_flag1=0

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

6591

帖子

9

TA的资源

版主

板凳
 

在key_flag1==1里清key_flag1,在key_flag2==1里清key_flag2

点评

那就没有关闭的状态了,就是我第一段指令按键一按下去松开代表灯亮,第二段代表我再次按下按键灯关,如果我把key_flag==1后面清key_flag1=0,那么就不会收到第二段灯灭的指令,你明白我的意思吗  详情 回复 发表于 2024-1-25 16:30
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

4
 
秦天qintian0303 发表于 2024-1-25 15:39 在key_flag1==1里清key_flag1,在key_flag2==1里清key_flag2

那就没有关闭的状态了,就是我第一段指令按键一按下去松开代表灯亮,第二段代表我再次按下按键灯关,如果我把key_flag==1后面清key_flag1=0,那么就不会收到第二段灯灭的指令,你明白我的意思吗

点评

key_flag1和key_flag2是在哪里被置1的,正常你通过不管是轮询还是外部中断去判断按键,发现触发一次才会将key_flag1或key_flag2置位,你贴出来的程序已经是处理程序了,应该是在while中循环检测的,你不清就会一直执  详情 回复 发表于 2024-1-25 16:35
 
 
 

回复

6591

帖子

9

TA的资源

版主

5
 
xbxdbd 发表于 2024-1-25 16:30 那就没有关闭的状态了,就是我第一段指令按键一按下去松开代表灯亮,第二段代表我再次按下按键灯关,如果 ...

key_flag1和key_flag2是在哪里被置1的,正常你通过不管是轮询还是外部中断去判断按键,发现触发一次才会将key_flag1或key_flag2置位,你贴出来的程序已经是处理程序了,应该是在while中循环检测的,你不清就会一直执行

点评

没有key_flag2啊,若是我再key_flag1==1后清零,那我再次按下按键表示关闭灯亮度,收不到这个关闭,这个key_flag1==2就是代表着我再次按下按键这个灯关闭,这个清零难道不是应该再关闭这里清零嘛,key_flag1==1代表  详情 回复 发表于 2024-1-25 17:21
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

3243

帖子

0

TA的资源

五彩晶圆(中级)

6
 

程序的逻辑有问题,搞不明白的话自己画程序的流程图。

 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

7
 
秦天qintian0303 发表于 2024-1-25 16:35 key_flag1和key_flag2是在哪里被置1的,正常你通过不管是轮询还是外部中断去判断按键,发现触发一次才会 ...

没有key_flag2啊,若是我再key_flag1==1后清零,那我再次按下按键表示关闭灯亮度,收不到这个关闭,这个key_flag1==2就是代表着我再次按下按键这个灯关闭,这个清零难道不是应该再关闭这里清零嘛,key_flag1==1代表我按一次按键,灯亮,key_flag1==2代表我再按这个按键,灯关

点评

[attachimg]781350[/attachimg]  再这个按键前面有这个函数,然后就没有了  详情 回复 发表于 2024-1-25 17:22
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

8
 
xbxdbd 发表于 2024-1-25 17:21 没有key_flag2啊,若是我再key_flag1==1后清零,那我再次按下按键表示关闭灯亮度,收不到这个关闭,这个k ...

  再这个按键前面有这个函数,然后就没有了

点评

你能在线调试吗?我怀疑key_flag1++之后超过了2,可以看一下key_flag1的实时值,如果不能在线调试,把程序key_flag1==2改为key_flag1>=2,看一下现象  详情 回复 发表于 2024-1-26 09:05
我看做了,你这是同一个按键,我现在理解一下你的逻辑,按一下,开启串口发送和开灯,这个时候的串口是一直发送的,再按一下,发送一次串口并关灯后就关闭  详情 回复 发表于 2024-1-26 09:01
 
 
 

回复

6591

帖子

9

TA的资源

版主

9
 
本帖最后由 秦天qintian0303 于 2024-1-26 09:02 编辑
xbxdbd 发表于 2024-1-25 17:22   再这个按键前面有这个函数,然后就没有了

我看错了,你这是同一个按键,我现在理解一下你的逻辑,按一下,开启串口发送和开灯,这个时候的串口是一直发送的,再按一下,发送一次串口并关灯后就关闭

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

6591

帖子

9

TA的资源

版主

10
 
xbxdbd 发表于 2024-1-25 17:22   再这个按键前面有这个函数,然后就没有了

你能在线调试吗?我怀疑key_flag1++之后超过了2,可以看一下key_flag1的实时值,如果不能在线调试,把程序key_flag1==2改为key_flag1>=2,看一下现象

点评

我重新添加了一个标识符,现在是不会一直收到指令,但是一直有个现象,会有按键按下去接收不到指令,需要再次按下,不知道是灵敏度的问题还是因为轮询导致时间过长  详情 回复 发表于 2024-1-26 11:38
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

11
 
秦天qintian0303 发表于 2024-1-26 09:05 你能在线调试吗?我怀疑key_flag1++之后超过了2,可以看一下key_flag1的实时值,如果不能在线调试,把程 ...

我重新添加了一个标识符,现在是不会一直收到指令,但是一直有个现象,会有按键按下去接收不到指令,需要再次按下,不知道是灵敏度的问题还是因为轮询导致时间过长

点评

你全程用的延时,很有可能就掠过去了    详情 回复 发表于 2024-1-26 13:49
 
 
 

回复

6591

帖子

9

TA的资源

版主

12
 
xbxdbd 发表于 2024-1-26 11:38 我重新添加了一个标识符,现在是不会一直收到指令,但是一直有个现象,会有按键按下去接收不到指令,需要 ...

你全程用的延时,很有可能就掠过去了  

点评

这个应该怎么修改?    详情 回复 发表于 2024-1-26 14:15
现在我用标识符标识关闭状态,但是串口助手不能收到我的关闭指令    详情 回复 发表于 2024-1-26 14:15
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

13
 
秦天qintian0303 发表于 2024-1-26 13:49 你全程用的延时,很有可能就掠过去了  

现在我用标识符标识关闭状态,但是串口助手不能收到我的关闭指令  

 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

14
 
秦天qintian0303 发表于 2024-1-26 13:49 你全程用的延时,很有可能就掠过去了  

这个应该怎么修改?

 

 
 
 

回复

114

帖子

6

TA的资源

一粒金砂(中级)

15
 

你需要做按鍵防彈跳處理.

你可以利用變數達到你要的功能.

不難的,思考一下.

 

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表