矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: JuncoJet

有想学编程的吗,可以接龙,不是灌水认真脸

[复制链接]
     
 楼主| 发表于 2024-9-5 19:17:41 | 显示全部楼层
aidn 发表于 2024-9-5 18:19
怎么用C这按键处理?低电平有效,不能阻塞,需要识别按下,放开,双击,按下的时长。有3个按键需要处理

记录下按键按下的时间,抬起的时间
如果MCU有自带计时函数的话直接计时
没有的话就Timer中断来计时,存全局变量
  1. unsigned long b,c,kd;
  2. byte i=0,kc=0,disp=0;
  3. bool bl=false,kb;
  4. void getKey(){
  5.   byte k=digitalRead(BOOT);
  6.   if(kd){
  7.     if(c>kd){
  8.       if(k){//kdown
  9.         if(++kc>10){//长按2秒
  10.           Serial.println("lngClick");
  11.           can.clrErrs();
  12.           kb=1;
  13.           kc=kd=0;
  14.           return;
  15.         }
  16.       }else{//kup 单击
  17.         if(!kb){
  18.           Serial.println("Click");
  19.           disp=!disp;
  20.         }
  21.         kb=kc=kd=0;
  22.         return;
  23.       }
  24.       kd=c+200;
  25.     }
  26.   }else if(k){
  27.     kd=c+200;//200ms去抖动
  28.   }
  29. }
  30. void loop(){
  31.   c=millis();
  32.   getKey();
  33.   if(c>b){
  34.     //test();
  35.     can.getRpm();
  36.     //can.getSpeed();
  37.     if(!disp){
  38.       byte g=can.gear;
  39.       if(!g)g=17;
  40.       else if(g>6)g=10;
  41.       leds.show(g);
  42.     }
  43.     b=c+333;
  44.   }
  45.   can.response();
  46.   digitalWrite(K9,can.rpm>7200);//转速提示
  47.   if(disp)leds.vshow(can.oiltmp);
  48. }
复制代码
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-5 19:21:58 | 显示全部楼层
ssffzz1 发表于 2024-9-5 18:54
严格说还是有点区别。

能跑是一回事。

透彻
另外修BUG也算工时,无论代码好坏,能跑通,
程序猿就能有钱赚,所以就不会有工匠精神
不可预料的问题不要去想
回复 支持 反对

使用道具 举报

     
发表于 2024-9-5 19:28:01 | 显示全部楼层
ssffzz1 发表于 2024-9-5 18:54
严格说还是有点区别。

能跑是一回事。

我没杠硬抬一下

> 对100w条数据排序,写的不好的可能需要10个小时完成... 写的好的,可能一台老机器10分钟就完成了...
20年前的老机器排序100w条正常的数据,不上魔法的话,大概应该在1秒以内完成
但现在的确有人能做到10个小时才干完这活
比如:我们公司的大数据团队处理几千万条数据,用几台配置很高的服务器,需要几个小时
而我在笔记本上做同样的处理,同样规模的数据,可以实时(<100ms)计算出结果,我甚至只用了一个线程

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-9-5 19:40:23 | 显示全部楼层
scu319hy 发表于 2024-9-5 19:28
我没杠硬抬一下

> 对100w条数据排序,写的不好的可能需要10个小时完成... 写的好的,可能一台老 ...


理解,理解。我只是举个例子,可能不恰当。

你100W个整数,还是100W条记录,不一样对吧。数据格式,值的范围对结果影响很大。机器的架构,寻址方式等等,也有影响对吧。
回复 支持 反对

使用道具 举报

发表于 2024-9-5 19:55:23 | 显示全部楼层
scu319hy 发表于 2024-9-5 19:28
我没杠硬抬一下

> 对100w条数据排序,写的不好的可能需要10个小时完成... 写的好的,可能一台老 ...

你那数据跟人家那数据是一回事吗?人家那是数据库查询,硬盘阵列呼呼转,走通信协议,中途经过很多路由器和交换机,跟你单机在内存读取是一个套路吗?
回复 支持 反对

使用道具 举报

发表于 2024-9-5 20:58:35 来自手机 | 显示全部楼层
minGW 安裝 libqrencoder, 死活沒成功 好像抱錯沒有 autoconfigure
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-5 21:08:22 | 显示全部楼层
xiaolaba 发表于 2024-9-5 20:58
minGW 安裝 libqrencoder, 死活沒成功 好像抱錯沒有 autoconfigure

你这是编译静态库吧,
使用静态库只需要配置lib目录和-l库名就行
回复 支持 反对

使用道具 举报

     
发表于 2024-9-6 21:11:45 来自手机 | 显示全部楼层
ssffzz1 发表于 2024-9-5 18:56
单片机吗?



我现在基本实现功能,但只是不按键时不阻塞,按下键就有问题了,用是能用但非常不好用。不知问题在那想借鉴学习一下,识别时长主要是长按5秒和3秒是不同功能。现在是时灵时不灵。用了一个计时器按下就启动计时器10mS中断一次如果按键还是按下就记录并启动计时器,没按下就停止。现在怀疑是主循环的循环时间不定导致时灵时不灵。
回复 支持 反对

使用道具 举报

     
发表于 2024-9-6 21:19:47 来自手机 | 显示全部楼层
JuncoJet 发表于 2024-9-5 19:17
记录下按键按下的时间,抬起的时间
如果MCU有自带计时函数的话直接计时
没有的话就Timer中断来计时,存 ...

谢谢,我貌似没有处理好释放事件,看来得重新梳理才行
回复 支持 反对

使用道具 举报

     
发表于 2024-9-6 21:25:44 | 显示全部楼层
本帖最后由 fshwen 于 2024-9-6 21:31 编辑
aidn 发表于 2024-9-6 21:11
我现在基本实现功能,但只是不按键时不阻塞,按下键就有问题了,用是能用但非常不好用。不知问题在那想借 ...


一直用定时起检测,把定时器时间设短点比如2毫秒什么的,在定时中断中检测按键,按下计中断次数,松开时检查中断次数,在主程序里用中断次数来判断是点按还是长按3或5秒;
不过话讲回来,不是自己搞的东西有些细节还是很难具体说清的
回复 支持 反对

使用道具 举报

     
发表于 2024-9-6 21:59:02 | 显示全部楼层
本帖最后由 ssffzz1 于 2024-9-6 22:06 编辑
aidn 发表于 2024-9-6 21:11
我现在基本实现功能,但只是不按键时不阻塞,按下键就有问题了,用是能用但非常不好用。不知问题在那想借 ...


我只能给个思路:

这个事情需要设计一个状态机,还需要一个定时器,或者操作系统的多任务切换。

状态机需要几种状态,

1、按键空闲,就是没有按下。

2、按下

3、按下超过一定时间

4、抬起


拿多任务操作系统过来说,时间片为1ms(1毫秒),那么每个时间片内去读按键状态。

假设,当前状态机是空闲,本次读取到按下,那么状态迁移到按下。
下一个时间片,读到的还是按下,因为上一次状态是按下,那么这次状态不迁移,只需要增加按下的计时器。

如果反复,譬如:

1、如果本次还是按下,并且计时器超过5秒,那么判定为长按。
2、如果本次是抬起,此时判断计时器小于3秒,那么判定为短按。
3、如果本次是抬起,计时器小于5秒,那么判定为中按。

将判定好的按键状态,通过消息传递给另一个任务进行处理即可。这个任务就做这个事情,判断按键状态。


因为是时间片切换,这个程序的定时会有一定的误差,看你当前的任务多少,这个任务的优先级多少。

不过一般没有判断按键是3秒,还是5秒的。你看 计算机键盘,一般不这么判断。因为无论什么系统,一个任务的具体执行时间,是不十分确定的。就是实时操作系统也是如此,除非你把读键盘这件事的优先级提的很高,但这个事显然不太符合常理。




做编程,最难得不是单片机本身(就那么多寄存器,弄熟了就好了),也不是语言本身(汇编也好,C也好就那么多东西,勤奋点也能会)。最难做的就是算法,譬如状态机这个也算算法的一部分,这个就不太好弄。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2024-9-7 10:58:59 | 显示全部楼层
JuncoJet 发表于 2024-9-5 21:08
你这是编译静态库吧,
使用静态库只需要配置lib目录和-l库名就行

請問實際怎樣做
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-9-7 14:41:37 | 显示全部楼层
xiaolaba 发表于 2024-9-7 10:58
請問實際怎樣做

成品的库自己编译,一般
./configure 配置环境
make 编译
make install 安装
但需要有编译环境

autoconfig
cmake nmake qmake之类种类繁多
这个也不能一概而论
回复 支持 反对

使用道具 举报

     
发表于 2024-9-7 15:38:08 | 显示全部楼层
坛友好,请教您,想通过电脑3.5话筒接口,在Windoes上开发一个应用,具体就是话筒接口两根线,断开,接通,在电脑上用软件获取这个通断信号,略懂c sharp,c,能不能给指点下

以前记得有虚拟逻辑分析仪还是什么设备,就是利用3.5mm话筒接口采集数据,不记得什么品牌型号了
回复 支持 反对

使用道具 举报

发表于 2024-9-7 15:47:22 | 显示全部楼层
可以包教包会吗?很想学
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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