迪文科技论坛

 找回密码
 立即注册
搜索
查看: 212|回复: 5

【提问】请教 按键返回 控件问题。谢谢

[复制链接]

2

主题

5

回帖

65

积分

注册会员

Rank: 2

积分
65
发表于 2023-5-29 10:49:41 | 显示全部楼层 |阅读模式
我想使用 按键返回 控件实现一个按钮的检测功能,不需要页面切换功能。使用屏内置的C51来读取按键返回值。


测试中发现,屏上电,按钮对应的变量地址内容为0;
                   执行按键动作,软件读取变量地址,可以读到设置的值1234;
                   然后对变量地址写0操作,结果发现读出的还是1234,软件认为一直有按键动作。

请问这个软件操作有问题吗?为什么不能将内存单元清零?或者有其他的控件可以实现这个功能?

谢谢
回复

使用道具 举报

0

主题

577

回帖

7768

积分

论坛元老

Rank: 8Rank: 8

积分
7768
发表于 2023-5-29 11:56:22 | 显示全部楼层
您开发的还是上次帖子提及的DMG10600C070_03WTC吗?能否将工程文件完整发送一下,这边给您测试一下看

默认按键值返回写入的数据,屏正常上电运行过程中,不会自动清零,如果您需要是需要,得根据条件添加程序来实现
回复

使用道具 举报

2

主题

5

回帖

65

积分

注册会员

Rank: 2

积分
65
 楼主| 发表于 2023-5-29 15:22:16 | 显示全部楼层
我这边使用屏内部的C51内核实现轮询检测按键的功能。
屏刚上电的时候,C51读按键对应的内存单元值为0,这个是正确的。
在屏幕上点击按键,C51在轮询中可以检测读到内存单元数值,数值就是预设的键值,这个也是正确的。
为避免重复检测按键,C51将按键对应的内存单元写0。但在下一次轮询中,还是读到了刚才的预设键值。----这里不对,不知道为什么?难道按键控件始终处在按下状态,一直不停地写内存单元?
回复

使用道具 举报

2

主题

5

回帖

65

积分

注册会员

Rank: 2

积分
65
 楼主| 发表于 2023-5-29 15:26:50 | 显示全部楼层
下面这个帖子也是反馈同样的问题。

T5L 按键返回值没有清零?

http://inforum.dwin.com.cn:20080 ... B%E6%8C%89%E9%94%AE


请迪文给个好用的例子。谢谢
回复

使用道具 举报

2

主题

1228

回帖

7837

积分

论坛元老

Rank: 8Rank: 8

积分
7837
发表于 2023-5-30 08:57:09 | 显示全部楼层
本帖最后由 zzs999k 于 2023-5-30 08:59 编辑
muxtttt 发表于 2023-5-29 15:26
下面这个帖子也是反馈同样的问题。

T5L 按键返回值没有清零?

发的帖子原始代码。
  1. #include "sys.h"
  2. /*
  3. 作者:熊家余
  4. 个人官网:www.fishiot.top
  5. b站视频教程:https://space.bilibili.com/442597241
  6. 如有疑问,请到迪文论坛发帖或咨询本人
  7. */


  8. #define START_WIN_BTN_ADDR                0x1000
  9. #define START_WIN_NUM_ADDR                0x2000

  10. void main(void)
  11. {   
  12.         u16 num;
  13.         u16 btn_val;
  14.         
  15.         sys_init();//系统初始化
  16.         
  17.         num = 0;
  18.         while(1)
  19.         {   
  20.                 sys_read_vp(START_WIN_BTN_ADDR,(u8*)&btn_val,1);
  21.                 if(btn_val==1)//说明按钮按下了
  22.                 {
  23.                         //将num值增1,然后显示到界面上
  24.                         num++;
  25.                         sys_delay_ms(100);
  26.                         sys_write_vp(START_WIN_NUM_ADDR,(u8*)&num,1);
  27.                         
  28.                         //清除按键值
  29. <font color="#ff0000">                        btn_val = 0;</font>
  30.         
  31.                 }
  32.         }
  33. }
复制代码
改为
#include "sys.h"
/*
作者:熊家余
个人官网:www.fishiot.top
b站视频教程:https://space.bilibili.com/442597241
如有疑问,请到迪文论坛发帖或咨询本人
*/


#define START_WIN_BTN_ADDR                0x1000
#define START_WIN_NUM_ADDR                0x2000

void main(void)
{   
        u16 num;
        u16 btn_val;
        
        sys_init();//系统初始化
        
        num = 0;
        while(1)
        {   
                sys_read_vp(START_WIN_BTN_ADDR,(u8*)&btn_val,1);
                if(btn_val==1)//说明按钮按下了
                {
                        //将num值增1,然后显示到界面上
                        num++;
                        sys_delay_ms(100);
                        sys_write_vp(START_WIN_NUM_ADDR,(u8*)&num,1);
                        
                        //清除按键值
                        btn_val = 0;
                      sys_write_vp(START_WIN_BTN_ADDR  ,(u8*)& btn_val,1);
回复

使用道具 举报

0

主题

24

回帖

351

积分

中级会员

Rank: 3Rank: 3

积分
351
发表于 2023-5-31 09:54:32 | 显示全部楼层
muxtttt 发表于 2023-5-29 15:22
我这边使用屏内部的C51内核实现轮询检测按键的功能。
屏刚上电的时候,C51读按键对应的内存单元值为0,这个 ...

你好,START_WIN_BTN_ADDR按下后并没有清除按键值,只是设置btn_val = 0的话没有用,因为START_WIN_BTN_ADDR的内存值并没有改变还是1,走下一次循环还是 sys_read_vp(START_WIN_BTN_ADDR,(u8*)&btn_val,1) 后读到1,解决方式是btn_val = 0后sys_write_vp(START_WIN_BTN_ADDR,(u8*)&btn_val = 0,1)
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-4-20 11:53 , Processed in 0.086964 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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