OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3005|回复: 8

以编码方式的触控按键给主控STM32解码然后双键长按失败的问题

[复制链接]

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2020-3-17 07:56:59 | 显示全部楼层 |阅读模式
1金钱
      首先,触控端用的是合泰BS83B08C单片机控制3个按键输出脉冲,由主控STM32F1对3路脉冲解码,3路脉冲码值各不相同,一一对应。解码已解好。现在是双键长按10s一直执行到单键长按10s的问题。触控端支持双键长按,双键长按我专门用了一个标志位,然后计时10s,但是一直没进入标志位,有坛友知道原因的吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-17 17:41:53 | 显示全部楼层
仿真看看,可以在长按10s后写个反馈信息,如串口打印
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2020-3-17 18:02:52 | 显示全部楼层
本帖最后由 hejun96 于 2020-3-18 11:38 编辑
  1. //global.h

  2. #ifndef    __GLOBAL_H
  3. #define    __GLOBAL_H
  4. #include  "stm32f10x.h"
  5. #include <string.h>

  6. #include <stdio.h>//用来表示串口打印的函数的标准C库


  7. /* 按键持续检测相关宏 */
  8. #define KEY_DELAY_S                                                                                                        //按键持续检测
  9. #define KEY_DELAY_S_LOW                            (0.1)                        //按键持续检测到低电平 (代表0.1s)
  10. #define KEY_DELAY_S_HIGH                           (2)                                //按键持续检测到高电平(代表2s)


  11. /*心跳包相关宏*/
  12. #define HEART_RATE_TIME                          (30)
  13. #define HEART_LOSE_TIMES                         (2 * 3)

  14. /*间断加热相关*/
  15. #define HOT_ON_TIME                                 (10) // 单位:分钟
  16. #define HOT_OFF_TIME                                (2)  // 单位:分钟

  17. /*ADC1的数据寄存器地址*/
  18. #define ADC1_DR_Address                           ((uint32_t)0x4001244C)
  19. #define BAUD_RATE                                  (9600)
  20. #define VDDA                                        (3.3)
  21. #define HIGH_AD_VALUE                              (4096)
  22. #define PRESS_PUMP_C                               (0.25)
  23. #define RELAY_CURRENT_C                            (1.1)
  24. /* 3475 = 2.8/3.3*4096 */
  25. #define PARAMETER_1                                (3825)
  26. #define PARAMETER_2                                (2000)/*缺水判断进入时间*/
  27. #define PARAMETER_3                                (2000)/*缺水判断离开时间*/
  28. #define KEY_DELAY_MS                                (121)
  29. #define BEEP_DELAY_MS                               (500)
  30. #define CHILD_DELAY_MS                              (10000)
  31. #define UVLED_DELAY_MS                              (5*60*1000)
  32. #define NTC1_TEM_PARM                                (5)
  33. #define NTC2_TEM_PARM                                (5)
  34. //#define NULL                                          (0)
  35. #define DATA_LENGTH                                  (512)
  36. #define FIFO_LENGTH                                  (10)
  37. #define CLEAN_SELF_TOTAL_TIME                        (48*60*60*1000)     /*自清洗总时间,1000(ms)*60(s)*60(min)*48(h)*/
  38. #define CLEAN_SELF_HALF_TIME                         (24*60*60*1000)    /*自清洗半程时间*/
  39. #define CLEAN_SELF_PRESSURE_PUMP_WORK_TIME           (1000*60*35)       /*自清洗时增压泵工作时间*/

  40. #define CL_TIME3                                  (1000*60*5)                /*电磁阀E工作时间长度*/
  41. #define TDS_CHECK_TIME                            (5)   /* 单位: S */
  42. #define TO_HEAT_CHECK_TIME                        (10000)    //  连续加热检测时间  单位:分钟 最小为1
  43. #define CHOOSE_0_A(n)       ((n<='9')?('0'):('7'))
  44. #define CL_WRITE_FLASH_TIME                       (1000*60*60)    /*写入flash时间*/         

  45. #define AT24C02_ADDR                    0XA0
  46. #define AT24C02_REG                     1
  47. #define AT24C02_REG_INDENTIFIER         24
  48. #define AT24C02_REG_TEM                 28
  49. #define AT24C02_REG_DATE_TIME           50
  50. #define AT24C02_REG_NO_OUT_TIME         40

  51. /*采集的通道数*/
  52. #define SampleChannelNUM  5

  53. /*一次采集的次数*/
  54. #define SampleCount  10  

  55. #define  READ_CHILD_KEY_VALUE   (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
  56. #define  READ_HOT_KEY_VALUE     (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
  57. #define  READ_COLD_KEY_VALUE    (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
  58. #define  READ_VDD_VOL_VALUE     (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1))
  59. #define  READ_LEAK_WATER_VALUE  (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2))


  60. //增加按键编码,由触摸延时改成编码形式
  61. #define LEAD_CODE_MARK  0x80
  62. #define GET_KEY_MARK    0x40
  63. #define END_CODE_MARK   0x20
  64. #define FALLING_MARK    0x10

  65. //数据前缀长度 7个固定前缀+4个数据长度+12个时间码+4个随机数+2C
  66. #define  DPL  (7+4+12+4+2)                        //

  67. extern volatile unsigned long gTick;

  68. extern volatile  u8  Receive_data[DATA_LENGTH];

  69. extern volatile  u8  Receive_data_len[3];/*缓存帧数长度*/

  70. extern volatile  u8  Rec_dat_num;

  71. extern volatile  u8  Transf_fifo[FIFO_LENGTH];

  72. extern volatile u16 TDS_ConvertedAverageValue[2];

  73. extern volatile u16 ADC_ConvertedValue[SampleChannelNUM*SampleCount];

  74. extern volatile  u8  Rfid_receive_data[DATA_LENGTH];

  75. extern volatile  u8  Rfid_rec_dat_num;

  76. extern volatile  u32 COOL_DELAY_MS;

  77. extern volatile  u32 HOT_DELAY_MS;

  78. extern volatile  u8  sta0;

  79. extern unsigned long ticker;

  80. extern volatile unsigned char isat;

  81. extern volatile unsigned long gTick2;        

  82. typedef void (*Set_Led) ( BitAction );

  83. extern volatile char ChildKeyOnFlag;

  84. typedef unsigned char (*Read_Key) (void);

  85. //编码按键结构体
  86. typedef struct{
  87.         u16 val;//
  88.         u8  cnt;//
  89.         u8  sta;//
  90.         u8  rec;//
  91.         u8  keycode;//
  92. }KEY_OBJ;
  93. extern volatile KEY_OBJ child_detect;
  94. extern volatile KEY_OBJ hot_detect;
  95. extern volatile KEY_OBJ cold_detect;

  96. typedef union{
  97.         u8 save_data[4];/*保存在AT24C02的一些数据*/
  98.         struct{
  99.                 u8    self_clean_flag;/*保存掉电前的自清洗完成状态;0:完成 1:未完成,待继续*/
  100.                 u8    machine_type;/*机器型号;有4款:DY400\DY100A\DY400B\DY75*/  
  101.                 u16   short_current;/*缺水电流 0--4000ma范围*/
  102.                 u8    software_version[12];/*软件版本号*/
  103.         }s;
  104. }SAVE_DATA_UNION;
  105. extern volatile SAVE_DATA_UNION Save_Data;

  106. typedef union{
  107.         u8 usart1_data[75];
  108.         struct{
  109.                 u8  head[7];// /S00/1/
  110.                 u8  data_lentgh[4];/*from time data to checksum data*/
  111.                 u8  datetime[12];
  112.                 u8  random_number[4];
  113.                 u8  fault_code[2];
  114.                 u8  tds1_value[4];/*原水*/
  115.                 u8  tds2_value[2];/*净水*/
  116.                 u8  ntc0_temperature[2];/*不加热*/
  117.                 u8  ntc1_temperature[2];/*热水*/
  118.                 u8  ntc2_temperature[2];/*保温*/
  119.                 u8  fixed_state[8];//固定状态
  120.                 u8  percentage_of_filter_core[6];/*1 2 3*/
  121.                 u8  total_running_time_of_water_pump[8];/*单位:秒*/               
  122. ///                u8  PressurePumpCurrent[4];//增压泵电流,单位:mA               
  123.                 u8  real_time_water_output[4];/*单位:毫升*/
  124.                 u8  the_rest_of_the_day_bucket[4];
  125.                 u8  fixtype[2];        
  126.                 u8  end0[2];
  127.         }s;
  128. }__attribute__ ((aligned (1)))USART1_TRANSFER0_DATA_UNION;
  129. extern volatile  USART1_TRANSFER0_DATA_UNION     Usart1_transf_data;

  130. typedef union{
  131.         u8 all[4];
  132.         struct{
  133.                 u8 checksum[4];
  134.                 u8 end[2];/*\r\n*/
  135.         }s;
  136. }__attribute__ ((aligned (1)))USART1_DATA_END;
  137. extern volatile  USART1_DATA_END                 Usart1_data_end;

  138. enum Work_Mode_Type
  139. {
  140.     WORK_MODE_SYNERGY = 0,
  141.     WORK_MODE_INDEPENDENCE,
  142. };

  143. enum Data_Type{
  144.         BEGIN=0,
  145.         STATE_00,
  146.         STATE_01,
  147.         STATE_02,
  148.         STATE_03,
  149.         STATE_04,
  150.         STATE_05,
  151.         REQUEST_RFID_CHANGE_06,
  152.         ORDER_REPORT_04,
  153.         WATER_ORDER_RESPONSE_05,
  154.         PRESS_PUMP_RUN_TIME_07,
  155.         STATE_08,
  156.         STATE_12,
  157.         STATE_13,
  158.         STATE_15,
  159.         STATE_16,
  160.         STATE_17,
  161.         PAD_SAT_REPORT_18,
  162.         STATE_20,
  163.         WATER_OUT_REPORT_21,
  164.         STATE_22,
  165.         STATE_23,
  166.         STATE_24,
  167.         STATE_26,
  168.         STATE_27,
  169.         STATE_28,
  170.         STATE_29,
  171.         STATE_30,
  172.         STATE_38 = 38,
  173.     STATE_42 = 42,
  174.     END,
  175. };

  176. enum{
  177.         FLAG_OFF=0,
  178.         FLAG_ON,
  179.         FLAG_PAUSE
  180. };

  181. enum{
  182.         USART_RESET=0,
  183.         USART_RECEIVING,
  184.         USART_RECEIVED_END,
  185. };

  186. enum{
  187.         TIMER_RESET=0,//定时器复位
  188.         TIMER_RUN,//定时器运行
  189.         TIMER_END,//定时器结束
  190.         TIMER_PAUSE,//定时器暂停
  191. };

  192. typedef enum{
  193.         HOT_LED=0,
  194.         NORMAL_LED,
  195.         COLD_LED,
  196.         OFF_LED,
  197. }LED_TYPE;

  198. typedef enum{
  199.         DY_100A=1,/*热冷*/
  200.         DY_400,/*一个热胆+一个冷胆,用模拟量对应的是两个热继电器,云众机,本套修改程序中选择此机型*/
  201.         DY_75,/*空*/
  202.         DY_100B,/*两个热胆,即两个热继电器*/
  203.         DY_NR
  204. }MACHINE_TYPE;
  205. extern volatile MACHINE_TYPE Machine_Type;

  206. typedef struct
  207. {
  208.     vu8 hour;
  209.     vu8 min;
  210.     vu8 sec;
  211.     vu16 w_year;
  212.     vu8  w_month;
  213.     vu8  w_date;
  214.     vu8  week;
  215. }_calendar_obj;
  216. extern _calendar_obj calendar;

  217. typedef enum{
  218.         CHILD_KEY=0,//童锁键
  219.         HOT_KEY,//热水按键
  220.         COLD_KEY,//冷水按键
  221.         RESET_KEY,//按键编码增加复位按键,这个值无效,暂时不用
  222.         OFF_KEY,//关闭键        
  223. }KEY_TYPE;
  224. extern volatile KEY_TYPE key_type;
  225. extern volatile KEY_TYPE key_type_temp;
  226.         
  227. enum{
  228.         AD_RESET=0,
  229.         AD_RUN,
  230.         AD_END,
  231. };

  232. enum{
  233.         PRESS_PUMP_AD=0,
  234.         NTC1_AD,
  235.         NTC2_AD,
  236.         NTC3_AD,
  237.   LEAK_WATER_AD,
  238. };

  239. typedef union{
  240.         u32 sta[8];
  241.         struct{
  242.                 u32 timer_flag:2;/*0:复位 1:运行 2:完成*/        
  243.                 u32 pressure_pump_timer_flag:2;//增压泵运行标志位 0:复位 1:运行 2:完成 3:暂停
  244.                 u32 wait_water_tick_flag:2;/* 0:复位 1:等待出水计时开始  2:等待出水计时开暂停 */
  245.                 u32 pressure_pump_clean_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  246.                 u32 tds1_update_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  247.                 u32 tds2_update_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  248.                 u32 tds1_delete_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  249.                 u32 tds2_delete_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  250.                 u32 tds1_update_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  251.                 u32 EUV_update_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  252.                 u32 tds2_update_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  253.                 u32 key_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  254.                 u32 beep_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  255.                 u32 data_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停  串口1发送数据时间计时*/
  256.                 u32 not_out_water_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  257.                 u32 out_water_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  258.                 u32 child_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  259.                 u32 uvled_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  260.                 u32 uvled_switch_cmd:2;/*0:关闭 1:打开 2:无效 3:无效*/
  261.                 u32 Liquid_level_switch_on_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停 缺水计时状态位*/
  262.                 u32 Liquid_level_switch_off_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停 缺水计时状态位*/
  263.                 u32 hot_water_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  264.                 u32 cold_water_timer_flag:2;/*0:复位 1:运行 2:完成 3:暂停*/
  265.                 u32 key_press_flag:2;/*0:无按键按下 1:有按键按下*/
  266.                 u32 Liquid_full_flag:2;/*0:未处于满水状态中 1:处于满水状态中*/
  267.                 u32 Liquid_shortage_flag:2;/*0:未处于缺水状态中 1:处于缺水状态中*/
  268.                 u32 Liquid_supply_flag:2;/*0:未处于补水状态中 1:处于补水状态中*/
  269.                 u32 Liquid_to_supply_flag:2;/*0:未有补水指令 1:有补水指令*/
  270.                 u32 ad_collection_flag:2;/*0:复位 1:采集过程中 2:采集完成*/        
  271.                 u32 ad_average_collection_flag:2;/*0:复位 1:采集过程中 2:采集完成*/
  272.                 u32 ad2_collection_flag:2;/*0:复位 1:采集过程中 2:采集完成*/        
  273.                 u32 ad2_average_collection_flag:2;/*0:复位 1:采集过程中 2:采集完成*/
  274.                 u32 tds1_Probe_Short_Connect:2;/*0:未短接 1:短接*/
  275.                 u32 tds2_Probe_Short_Connect:2;/*0:未短接 1:短接*/
  276.                 u32 leak_water_flag:2;/*0:未漏水 1:漏水*/
  277.                 u32 clean_self_cmd:2;/*0:未收到自清洗命令 1:已收到自清洗命令*/
  278.                 u32 clean_self_flag:2;/*0:未处于自清洗状态中 1:已处于自清洗状态中*/
  279.                 u32 rfid_balance_flag:2;/*0:余额为零 1:余额不足单次出水 2:余额充足*/
  280.                 u32 child_Tkey_on_flag:2;/*0:处于童锁状态中 1:未处于童锁状态中*/
  281.                 u32 hot_water_on_flag:2;/*0:未处于出热水状态中 1:处于出热水状态中*/
  282.                 u32 cold_water_on_flag:2;/*0:未处于出冷水状态中 1:处于出冷水状态中*/
  283.                 u32 normal_water_on_flag:2;/*0:未处于出温水状态中 1:处于出温水状态中*/
  284.                 u32 water_on_flag:2;/*0:未处于出水状态中 1:处于出水状态中*/
  285.                 u32 water_out_flag:2;/*0:未处于排水状态中 1:处于排水状态中*/
  286.                 u32 tds1_Freq_Det_Timer_Flag:2;/*0:复位状态 1:运行 2:完成*/
  287.                 u32 tds2_Freq_Det_Timer_Flag:2;/*0:复位状态 1:运行 2:完成*/
  288.                 u32 raw_water_flag:2;/*0:原水未缺水 1:原水缺水*/
  289.                 u32 heat1_water_flag:2;/*0:未加热状态 1:处于加热状态中*/
  290.                 u32 heat1_cmd_flag:2;/*0:首次加热复位 1:再次加热*/
  291.                 u32 to_heat1_cmd_flag:2;/*0:复位加热指令 1:开始加热指令*/
  292.                 u32 heat2_water_flag:2;/*0:未加热状态 1:处于加热状态中*/
  293.                 u32 heat2_cmd_flag:2;/*0:首次加热复位 1:再次加热*/
  294.                 u32 to_heat2_cmd_flag:2;/*0:复位加热指令 1:开始加热指令*/
  295.                 u32 refrigeration_water_flag:2;/*0:未制冷状态 1:处于制冷状态中*/
  296.                 u32 hot_tube1_flag:2;/*0:热罐1未发生异常 1:热罐1发生异常*/
  297.                 u32 hot_tube1_off_cmd:2;/*0:热罐1未停止加热 1:热罐1停止加热*/
  298.                 u32 hot_tube2_off_cmd:2;/*0:热罐2未停止加热 1:热罐2停止加热*/
  299.                 u32 ice_tube_off_cmd:2;/*0:冰胆未停止制冷 1:冰胆停止制冷*/
  300.                 u32 hot_tube1_on_cmd:2;/*0:热罐1收到停止制热命令 1:热罐1收到开始制热命令 2: 未收到命令*/
  301.                 u32 hot_tube2_on_cmd:2;/*0:热罐2收到停止制热命令 1:热罐2收到开始制热命令 2: 未收到命令*/
  302.                 u32 ice_tube_on_cmd:2;/*0:冰胆收到停止制冷命令 1:冰胆收到开始制冷命令 2: 未收到命令*/
  303.                 u32 ice_tube_flag:2;/*0:冰胆未处于制冷状态中 1:冰胆处于制冷状态中*/
  304.                 u32 hot_tube2_flag:2;/*0:热罐2未发生异常 1:热罐2发生异常*/
  305.                 u32 voltage_high_det_off_cmd:2;/*0:高压检测功能有效 1:高压检测功能无效*/
  306.                 u32 pump_non_stop_flag:2;/*0:泵正常停机 1:泵不停机(非正常)*/
  307.                 u32 make_water_error_flag:2;/*0:正常 1:制水异常  制水异常状态位*/
  308.                 u32 water_tank_floating_ball_flag:2;/*0:水箱浮球状态正常 1:水箱浮球状态不正常*/
  309.                 u32 water_production_flag:2;/*0:复位状态 1:制水状态中*/
  310.                 u32 water_in_cmd:2;/*0:复位状态 1:制水指令 2:停止制水指令*/
  311.                 u32 usart1_receive_flag:2;/* 0:复位状态 1:接收状态中 2:接收完成状态 */
  312.                 u32 usart3_receive_flag:2;/* 0:复位状态 1:接收状态中 2:接收完成状态 */
  313.                 u32 pad_show_flag:2;/* 0:黑屏 1:亮屏 2:菜单设置 */
  314.                 u32 rx1_wrong_flag:2;/* 0:正常 1:接收错误 */
  315.                 u32 pre_out_hot_water_flag:2;/* 0:正常 1:准备出热水标志  2:允许出热水标志 */
  316.                 u32 pre_out_cold_water_flag:2;/* 0:正常 1:准备出冷水标志  2:允许出冷水标志 */
  317.                 u32 pre_out_normal_water_flag:2;/* 0:正常 1:准备出温水标志  2:允许出温水标志 */
  318.                 u32 pad_control_out_water_flag:2;/* 0:复位 1:PAD允许底板放水  2:PAD禁止底板放水 */
  319.                 u32 pad_control_clean_cmd:2;/* 0:复位 1:PAD强制冲洗命令*/
  320.                 u32 Liquid_switch_error_flag:2;/* 0:复位 1:液位开关异常;液位开关异常标志位*/
  321.                 u32 Liquid_tem_error_flag:2;/* 0:复位 1:温度异常;温度异常标志位*/
  322.                 u32 Raw_water_short_flag:2;/* 0:复位 1:缺水;原水缺水标志位*/
  323.                 u32 Raw_water_short_tick_flag:2;/* 0:复位 1:运行;原水缺水计时标志位*/
  324.                 u32 Make_water_tick_flag:2;/* 0:复位 1:运行 2:暂停;制水状态计时标志位*/
  325.                 u32 Flushing_water_B_flag:2;/* 0:复位 1:运行 2:暂停;冲洗阀B打开计时标志位*/
  326.                 u32 nfc_tick_flag:2;/* 0:复位 1:运行 2:暂停;nfc离开计时标志位*/
  327.                 u32 Atmosphere_Led_cmd:2;/* 0:关闭 1:开启 2:暂停;氛围灯指令*/
  328.         u32 d75_water_cmd:2;/* 0:关闭 1:开启 2:暂停;d75-出水指令:出水:响一声 关水:想2声*/
  329.         u32 Update_Out_Water_Time_flag:2;/* 0:无效 1:有效 2:暂停;*/
  330.                 u32 is_allow_count1:2;/*0:禁止  1:允许*/
  331.                 u32 is_allow_count2:2;/*0:禁止  1:允许*/
  332.         u32 is_start_mea_tds1:2;/*0:禁止  1:允许*/
  333.         u32 tds1DetectionFlag:2;  // tds1 detection flag
  334.         u32 tds2DetectionFlag:2;  // tds2 detection flag
  335.         u32 isMakeCold:2;  //
  336.         u32 pump_tick_flag:2;
  337.         u32 hot1_action_flag:2; // 热罐1动作标志位 0-关闭 1-打开
  338.         u32 hot2_action_flag:2; // 热罐2动作标志位 0-关闭 1-打开
  339.         u32 scaven_end_flag:2;  // 扫码结束标志位
  340.         u32 scaven_clear_flag:2;  // 扫码清除标志位
  341.         u32 scaven_hot_flag:2;  // 扫码热水标志位
  342.         u32 scaven_timer_flag:2;  // 定时器
  343.         u32 toHeat_timer_falg:2;  // 连续加热定时器标志
  344.         u32 heart_beat_falg:2;  // 心跳包标志位
  345.         u32 work_mode:2;  // 工作模式:0-协同工作模式,需要上位机配合 1-独立工作模式,不需要上位机配合
  346.         u32 hot_close_flag:2;//热罐关闭标志: 0-关闭 1-打开
  347.         u32 first_time_cleam_flag:2; //第一次接收串口时间码
  348.     }s;
  349. }STA_UNION;
  350. extern volatile STA_UNION System_Sta;

  351. typedef struct{
  352.     u32                 heart_beat_tick;  // 心跳包计时
  353.     u32                 toHeat_tick;  // 连续加热加热定时器
  354.     u32                 toHeat1_tick;  // 连续加热1定时器
  355.     u32                 toHeat2_tick;  // 连续加热2定时器
  356.     u32      pump_tick;
  357.         u32      pump_start_tick;/*增压泵开启时的计时*/
  358.         u32      uvled_start_tick;/*UV灯开启时的计时*/
  359.         u32      tds1_detection_timer_tick;
  360.         u32      tds2_detection_timer_tick;
  361.         u32      scaven_timer_tick;
  362.         u32      timer_delay;//定时器延时
  363.         u32      EUV_update_tick;/*EUV灯更新标志位*/
  364.         u32      tds1_update_timer_tick;
  365.         u32      tds2_update_timer_tick;
  366.         u32      tds1_delete_timer_tick;
  367.         u32      tds2_delete_timer_tick;
  368.         u32      key_tick;
  369.         u32      wait_water_tick;/*等待出水计时*/
  370.         u32      beep_tick;
  371.         u32      beep_tick_div;
  372.         u32      atmos_tick;/*氛围灯计时*/
  373.         u32      atmos_tick_num;/*氛围灯计时次数*/
  374.         u32      uvled_tick;
  375.         u32      make_water_tick;/*制水计时*/
  376.         u32      flushing_water_B_tick;/*冲洗阀B打开计时*/

  377.         u32      not_out_water_tick;
  378.         u32      Liquid_level_switch_on_tick;
  379.         u32      Liquid_level_switch_off_tick;
  380.         u32      child_flag_tick;
  381.         u32      raw_water_tick;/*原水缺水计时*/
  382.         u32      data_tick;/*串口1发送数据计时*/
  383.         u32      out_water_tick;/*每次的出水量计时*/
  384.         u32      nfc_tick;/*nfc标签离开计时*/
  385.         u32      hot_water_flag_tick;
  386.         u32      hot_water_time; /*单位:秒*/
  387.         u32      cold_water_time;/*单位:秒*/
  388.         u32      cold_water_flag_tick;
  389.         u32      pressure_pump_tick;
  390.         u32      pressure_pump_clean_tick;//增压泵自清洁tick
  391.         u16      pressure_pump_one_run_time;/* 单次运行时间 单位:秒*/
  392.         u32      pressure_pump_all_run_time;/* 总共运行时间 单位:秒*/
  393.         u16      ntc1_temperature;/*热罐1的实时温度*/
  394.         u16      ntc2_temperature;/*热罐2的实时温度*/
  395.         u16      ntc3_temperature;/*tds的实时温度*/
  396.         u16                 watertank_temperature;//水箱温度
  397.         u16      tds1_measure_value; /*扩大10倍*/
  398.         u16      tds1_measure_value_ori; /*扩大10倍*/
  399.         u16      tds2_measure_value; /*扩大10倍*/
  400.         u16      tds2_measure_value_ori; /*扩大10倍*/
  401.         s16      press_pump_current; /*单位:mA*/
  402.         s16      press_pump_current_limit; /*单位:mA  默认300ma*/
  403.         s16      leak_water_current;
  404.         s16      relay_ice_tube_current;
  405.         s16      relay_hot_tube1_current;
  406.         s16      relay_hot_tube2_current;
  407.         u16      last_key_type;
  408.         u16      ntc1_setting_temperature;/*热罐1的当前设置温度*/
  409.         u16      ntc2_setting_temperature;/*热罐2的当前设置温度*/
  410.         u8       current_water_out_number[20];
  411.         u8       last_water_out_number[20];
  412.         u8       rfid_number[15];/*12位ID ,2个状态位,1个末位设备编号*/
  413.         u8       rfid_number_ascill[26];/*24位ID位ASCILL字符 2个状态位01出水 02出水暂停 03出水完成*/
  414.         u8       scanf_number[22];/*20位订单编号,2个状态位*/
  415.         u8       water_in_number[24];/*20位订单编号,4个状态位*/
  416.         u8       pump_work_time[2];/*水泵每次做工时长*/
  417.         u8       pad_flag[2];/*PAD的状态 00黑屏,01亮屏,02菜单设置*/
  418.         u8       water_out_flag[2];/*s21数据帧上报出水状态*/
  419.     u8       heart_beat_flag[2]; /*s38数据帧上报心跳包状态*/
  420.     u8       nfc_water_out_flag;/*s06数据帧上报出水状态*/
  421.         u8       fixed_state[8];/*上报开关加热制冷等状态*/
  422.         u8       machine_type;/*01单热罐;02热罐+冷罐;03双热罐*/
  423.         u8       fill_water_number[23];/*实时充水订单编号*/
  424.         u8       flash_water_flag[2];/*清洗状态 01:开始清洗 02:禁止清洗*/
  425.         float    rfid_change;
  426.         u8       rfid_change_array[6];
  427.         float    hot_water_price;
  428.         float    normal_water_price;
  429.         float    cool_water_price;
  430.         u16      usart1_tran_data_len;
  431.         u8       int_fault_code[2];
  432.         u16      real_time_water_output;
  433.         u16      the_rest_of_the_day_bucket;
  434.         u8       fixtype;        
  435.         u16      tds1_freq;
  436.         u16      tds2_freq;
  437.         u16      setting_water_cap;/*当前每次的出水量 单位ml*/
  438.         u8       chg_filt_num;/*更换的滤芯编号*/        
  439.         u16      filt_life;/*滤芯寿命*/
  440. }DATA_STRUCT;
  441. extern volatile DATA_STRUCT System_Data;


  442. //io.c

  443. //按键中断以及GPIO配置
  444. void EXTIX_Init(void)
  445. {
  446.     EXTI_InitTypeDef EXTI_InitStructure;
  447.         
  448.         GPIO_InitTypeDef GPIO_InitStructure;

  449.         /*child key*/
  450.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  451.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  452.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  453.         /*hot key*/
  454.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  455.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  456.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  457.         /*cool key*/
  458.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  459.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  460.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  461.         /*child key*/
  462.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

  463.           EXTI_InitStructure.EXTI_Line=EXTI_Line0;//PA0中断线初始化
  464.         
  465.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  466.         
  467.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising
  468.         
  469.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  470.         
  471.           EXTI_Init(&EXTI_InitStructure);         

  472.         /*hot key*/
  473.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);

  474.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;//GPIOA.1中断线初始化函数
  475.         
  476.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  477.         
  478.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising
  479.         
  480.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  481.         
  482.           EXTI_Init(&EXTI_InitStructure);         

  483.         /*cool key*/
  484.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);

  485.           EXTI_InitStructure.EXTI_Line=EXTI_Line2;//GPIOA.2中断线初始化
  486.         
  487.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  488.         
  489.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising
  490.         
  491.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  492.         
  493.           EXTI_Init(&EXTI_InitStructure);                 
  494. }


  495. //stm32f10x_it.c

  496. /*10us : arr=9 psc=107*/
  497. void TIM4Init(void)
  498. {
  499.         //Timer4 clock enable
  500.         RCC->APB1ENR|=1<<2;
  501.         
  502.         //Auto reload counter
  503.          TIM4->ARR=9;
  504.         
  505.         //Prescaler
  506.         TIM4->PSC=71;

  507.         //Allow interrupt update
  508.         TIM4->DIER|=1<<0;

  509.         //Enable timer4
  510.         TIM4->CR1|=0x01;
  511. }

  512. void TIM4_IRQHandler(void)
  513. {
  514.         /*溢出中断*/
  515.         if(TIM4->SR&0X0001)
  516.         {
  517.                 /*按键编码定时器 us级别*/
  518.                 if(child_detect.sta & FALLING_MARK)
  519.                 {
  520.                         child_detect.val+=10;
  521.                 }

  522.                 if(hot_detect.sta & FALLING_MARK)
  523.                 {
  524.                         hot_detect.val+=10;
  525.                 }

  526.                 if(cold_detect.sta & FALLING_MARK)
  527.                 {
  528.                         cold_detect.val+=10;
  529.                 }

  530.         }
  531.         /*清除中断标志位*/
  532.         TIM4->SR&=~(1<<0);
  533. }

  534. //脉冲编码按键中断
  535. volatile KEY_TYPE key_type = OFF_KEY;
  536. //电平触发按键改成编码形式的脉冲触发按键 外部中断由电平触发的延时改成脉冲触发形式2020-01-13
  537. volatile KEY_OBJ child_detect = {0};
  538. volatile KEY_OBJ hot_detect = {0};
  539. volatile KEY_OBJ cold_detect = {0};



  540. void EXTI0_IRQHandler(void)
  541. {
  542.         /*
  543.         if(TIMER_RESET==System_Sta.s.key_timer_flag)
  544.         {
  545.                 System_Sta.s.key_timer_flag = TIMER_RUN;
  546.                 key_type = CHILD_KEY;
  547.         }
  548.         */
  549.         if(READ_CHILD_KEY_VALUE)
  550.         {
  551.                 child_detect.sta |= FALLING_MARK;
  552.                 child_detect.val = 0;
  553.         }
  554.         else if(!READ_CHILD_KEY_VALUE)
  555.         {
  556.                 if(child_detect.sta & FALLING_MARK)
  557.                 {
  558.                         if(child_detect.sta & LEAD_CODE_MARK)
  559.                         {
  560.                                 child_detect.rec <<= 1;
  561.                                 if(child_detect.val>=600 && child_detect.val<=1600)//10*(600+1600)/2 = 11000us = 11ms
  562.                                 {
  563.                                         child_detect.rec |= 0;
  564.                                 }
  565.                                 else if(child_detect.val>=1700 && child_detect.val<=2700)//10*(1700+2700)/2 = 22000us = 22ms
  566.                                 {
  567.                                         child_detect.rec |= 1;
  568.                                 }
  569.                                 child_detect.cnt++;
  570.                                 if(child_detect.cnt == 8)
  571.                                 {
  572.                                         child_detect.keycode = child_detect.rec;
  573.                                         child_detect.cnt = 0;
  574.                                         child_detect.val = 0;
  575.                                         child_detect.rec = 0;
  576.                                         child_detect.sta &= ~LEAD_CODE_MARK;
  577.                                         child_detect.sta |= GET_KEY_MARK;
  578.                                         if(child_detect.keycode == 0xAA)
  579.                                         {
  580.                                                 key_type = CHILD_KEY;
  581.                                         }
  582.                                         else if(child_detect.keycode == 0x55)
  583.                                         {
  584.                                                 key_type = RESET_KEY;
  585.                                         }
  586.                                         else
  587.                                         {
  588.                                                 key_type = OFF_KEY;
  589.                                         }
  590.                                 }
  591.                         }
  592.                         else if(child_detect.val>=4000 && child_detect.val<=6000)//10*(4000+6000)/2 = 50000us = 50ms
  593.                         {
  594.                                 child_detect.sta |= LEAD_CODE_MARK;
  595.                                 child_detect.cnt = 0;
  596.                         }
  597.                         else if(child_detect.val>=9000 && child_detect.val<= 11000)//10*(9000+11000)/2 = 100000us = 100ms
  598.                         {
  599.                                 child_detect.sta |= END_CODE_MARK;
  600.                                 child_detect.sta &= ~GET_KEY_MARK;
  601.                                 key_type = OFF_KEY;
  602.                         }        
  603.                 }
  604.                 child_detect.sta &= ~FALLING_MARK;
  605.                 child_detect.val = 0;
  606.         }
  607.         EXTI_ClearITPendingBit(EXTI_Line0);
  608. }

  609. void EXTI1_IRQHandler(void)
  610. {
  611.         /*
  612.         if(TIMER_RESET==System_Sta.s.key_timer_flag)
  613.         {
  614.                 System_Sta.s.key_timer_flag = TIMER_RUN;
  615.                 key_type = HOT_KEY;
  616.         }        
  617.         */
  618.         if(READ_HOT_KEY_VALUE)
  619.         {
  620.                 hot_detect.sta |= FALLING_MARK;
  621.                 hot_detect.val = 0;
  622.         }
  623.         else if(!READ_HOT_KEY_VALUE)
  624.         {
  625.                 if(hot_detect.sta & FALLING_MARK)
  626.                 {
  627.                         if(hot_detect.sta & LEAD_CODE_MARK)
  628.                         {
  629.                                 hot_detect.rec <<= 1;
  630.                                 if(hot_detect.val>=600 && hot_detect.val<=1600)
  631.                                 {
  632.                                         hot_detect.rec |= 0;
  633.                                 }
  634.                                 else if(hot_detect.val>=1700 && hot_detect.val<=2700)
  635.                                 {
  636.                                         hot_detect.rec |= 1;
  637.                                 }
  638.                                 hot_detect.cnt++;
  639.                                 if(hot_detect.cnt == 8)
  640.                                 {
  641.                                         hot_detect.keycode = hot_detect.rec;
  642.                                         hot_detect.cnt = 0;
  643.                                         hot_detect.val = 0;
  644.                                         hot_detect.rec = 0;
  645.                                         hot_detect.sta &= ~LEAD_CODE_MARK;
  646.                                         hot_detect.sta |= GET_KEY_MARK;
  647.                                         if(hot_detect.keycode == 0xBB)
  648.                                         {
  649.                                                 key_type = HOT_KEY;
  650.                                         }
  651.                                         else
  652.                                         {
  653.                                                 key_type = OFF_KEY;
  654.                                         }
  655.                                 }
  656.                         }
  657.                         else if(hot_detect.val>=4000 && hot_detect.val<=6000)
  658.                         {
  659.                                 hot_detect.sta |= LEAD_CODE_MARK;
  660.                                 hot_detect.cnt = 0;
  661.                         }
  662.                         else if(hot_detect.val>=9000 && hot_detect.val<=11000)
  663.                         {
  664.                                 hot_detect.sta |= END_CODE_MARK;
  665.                                 hot_detect.sta &= ~GET_KEY_MARK;
  666.                                 key_type = OFF_KEY;
  667.                         }        
  668.                 }
  669.                 hot_detect.sta &= ~FALLING_MARK;
  670.                 hot_detect.val = 0;
  671.         }        
  672.         EXTI_ClearITPendingBit(EXTI_Line1);
  673. }

  674. void EXTI2_IRQHandler(void)
  675. {
  676. /*
  677.         if(TIMER_RESET==System_Sta.s.key_timer_flag)
  678.         {
  679.                 System_Sta.s.key_timer_flag = TIMER_RUN;
  680.                 key_type = COLD_KEY;
  681.         }        
  682. */
  683.         if(READ_COLD_KEY_VALUE)
  684.         {
  685.                 cold_detect.sta |= FALLING_MARK;
  686.                 cold_detect.val = 0;
  687.         }
  688.         else if(!READ_COLD_KEY_VALUE)
  689.         {
  690.                 if(cold_detect.sta & FALLING_MARK)
  691.                 {
  692.                         if(cold_detect.sta & LEAD_CODE_MARK)
  693.                         {
  694.                                 cold_detect.rec <<= 1;
  695.                                 if((cold_detect.val>=600 && cold_detect.val<=1600))
  696.                                 {
  697.                                         cold_detect.rec |= 0;
  698.                                 }
  699.                                 else if((cold_detect.val>=1700 && cold_detect.val<=2700))
  700.                                 {
  701.                                         cold_detect.rec |= 1;
  702.                                 }
  703.                                 cold_detect.cnt++;
  704.                                 if(cold_detect.cnt == 8)
  705.                                 {
  706.                                         cold_detect.keycode = cold_detect.rec;
  707.                                         cold_detect.cnt = 0;
  708.                                         cold_detect.val = 0;
  709.                                         cold_detect.rec = 0;
  710.                                         cold_detect.sta &= ~LEAD_CODE_MARK;
  711.                                         cold_detect.sta |= GET_KEY_MARK;
  712.                                         if(cold_detect.keycode == 0xCC)
  713.                                         {
  714.                                                 
  715.                                                 key_type = COLD_KEY;
  716.                                         }
  717.                                         else
  718.                                         {
  719.                                                 key_type = OFF_KEY;
  720.                                         }
  721.                                 }
  722.                         }
  723.                         else if((cold_detect.val>=4000 && cold_detect.val<=6000))
  724.                         {
  725.                                 cold_detect.sta |= LEAD_CODE_MARK;
  726.                                 cold_detect.cnt = 0;
  727.                         }
  728.                         else if((cold_detect.val>=9000 && cold_detect.val<= 11000))
  729.                         {
  730.                                 cold_detect.sta |= END_CODE_MARK;
  731.                                 cold_detect.sta &= ~GET_KEY_MARK;
  732.                                 key_type = OFF_KEY;
  733.                         }        
  734.                 }
  735.                 cold_detect.sta &= ~FALLING_MARK;
  736.                 cold_detect.val = 0;
  737.         }                        
  738.         EXTI_ClearITPendingBit(EXTI_Line2);
  739. }


  740. //system.c
  741. /*读取童锁锁定按键的状态 1:有效*/
  742. u8 Read_ChildKey(void)
  743. {
  744.         return !(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));
  745. }

  746. /*读取热水出水按键的状态 1:有效*/
  747. u8 Read_HotWaterKey(void)
  748. {
  749.         return !(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
  750. }

  751. /*读取冷水出水按键的状态 1:有效*/
  752. u8 Read_ColdWaterKey(void)
  753. {
  754.         return !(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2));
  755. }

  756. /*按键工作*/
  757. void Key_Work(void)
  758. {
  759. //        static KEY_TYPE key_type_temp = OFF_KEY;
  760.         static unsigned long ColdKeyPressTick=0;
  761.         static unsigned long HotKeyPressTick=0;
  762.         static unsigned long ChildKeyPressTick=0;
  763.         static unsigned long ResetKeyPressTick=0;
  764.         static char HotKeyLongPressStatus = 0;// status hot
  765.         static char ColdKeyLongPressStatus= 0;//status cold
  766.         static char ChildKeyLongPressStatus = 0;//童锁
  767.         static char ResetStatus = 0;
  768.         static char HotKeyChange = 0,ColdKeyChange = 0;//hot change ,cold change 设置翻转

  769. #if 1
  770.         if (key_type == CHILD_KEY)//读取童锁键值
  771.         {
  772.                 if (gTick - ChildKeyPressTick >= 9*1000)//按键去抖动时间超过9*1000ms
  773.                 {
  774.                         ChildKeyLongPressStatus = 1;
  775.                 }
  776.         }
  777.         else
  778.         {
  779.                 ChildKeyLongPressStatus = 0;
  780.                 ChildKeyPressTick = gTick;
  781.         }
  782.         if (ChildKeyLongPressStatus)
  783.         {
  784.                 ChildKeyLongPressStatus = 0;
  785.                 ChildKeyPressTick = gTick;
  786.                 System_Sta.s.clean_self_cmd = FLAG_ON;
  787.                 //开启蜂鸣器
  788.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  789.                 {
  790.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  791.                 }
  792.         }
  793. #endif
  794.     #if 1
  795.         //增加复位键
  796.         if(key_type == RESET_KEY)
  797.         {
  798.                 if(gTick - ResetKeyPressTick >= 9*1000)
  799.                 {
  800.                                 ResetStatus = 1;
  801.                 }
  802.         }
  803.         else
  804.         {
  805.                 ResetStatus = 0;
  806.                 ResetKeyPressTick = gTick;
  807.         }

  808.         if(key_type == HOT_KEY)
  809.         {
  810.                 if(gTick-HotKeyPressTick>=9*1000)//使用复位功能
  811.                 {
  812.                         HotKeyLongPressStatus = 1;
  813.                 }
  814.         }
  815.         else
  816.         {
  817.                 HotKeyLongPressStatus = 0;
  818.                 HotKeyPressTick = gTick;
  819.         }
  820.         
  821.         if(key_type == COLD_KEY)
  822.         {
  823.     if(gTick - ColdKeyPressTick >= 9*1000)//使用复位功能
  824.                 {
  825.                         ColdKeyLongPressStatus = 1;
  826.                 }
  827.         }
  828.         else
  829.         {
  830.                 ColdKeyLongPressStatus = 0;
  831.                 ColdKeyPressTick = gTick;
  832.         }        

  833.         if(ResetStatus)//if(1 == HotKeyLongPressStatus && 1 == ColdKeyLongPressStatus)
  834.         {
  835.                 Save_Data.s.self_clean_flag = 0;
  836.                 i2cWriteBuffer1(AT24C02_ADDR,AT24C02_REG,sizeof(SAVE_DATA_UNION),(u8*)&Save_Data);/*写入数据*/

  837.                 for(int i=0;i<sizeof(STA_UNION);i++)
  838.                 {
  839.                         System_Sta.sta[i] = 0;
  840.                 }

  841.                 memset((void *)(&System_Data),0,sizeof(DATA_STRUCT));
  842.                 //开启蜂鸣器
  843.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  844.                 {
  845.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  846.                 }
  847.                 System_Data.flash_water_flag[0]='0';
  848.                 System_Data.flash_water_flag[1]='2';/*停止清洗*/
  849.                 Trans_dat_append(STATE_23);
  850.                 while(1);
  851.         }

  852.         if(HotKeyLongPressStatus == 1 && READ_COLD_KEY_VALUE == 0)        
  853.         {
  854.                 if(key_type == HOT_KEY)
  855.                 {
  856.                         HotKeyChange = !HotKeyChange;//hot change
  857.                         key_type = OFF_KEY;
  858.                         if(1 == HotKeyChange)//System_Sta.s.hot_close_flag == 1
  859.                         {
  860.                                 if(Bit_RESET==Read_WaterShortagDetection())
  861.                                 {
  862.                                         System_Data.fixed_state[1] = '1';
  863.                                        
  864.           ///System_Sta.s.hot_close_flag = 0;
  865.                                         System_Data.ntc1_setting_temperature = 95;
  866.                                         if (Save_Data.s.machine_type != DY_100B)
  867.                                         {
  868.                                                         System_Data.ntc2_setting_temperature = 95;
  869.                                         }
  870.                                         else
  871.                                         {
  872.                                                 System_Data.ntc2_setting_temperature = 0;
  873.                                         }
  874.                                         // u8 tem[2] = {0};
  875.                                         // tem[0] = System_Data.ntc1_setting_temperature;
  876.                                         // tem[1] = System_Data.ntc2_setting_temperature;
  877.                                         // i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  878.                                         u8 tem[2] = {0};
  879.                                         tem[0] = System_Data.ntc1_setting_temperature;
  880.                                         tem[1] = System_Data.ntc2_setting_temperature;
  881.                                         i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  882.                                         Trans_dat_append(STATE_12);

  883.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  884.                                         Block_Timer(50);//阻塞时间50ms
  885.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  886.                                         Block_Timer(200);//阻塞时间200ms
  887.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  888.                                         Block_Timer(50);//阻塞时间50ms
  889.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  890.                                         // GPIO_WriteBit(GPIOC, GPIO_Pin_12, 1);
  891.                                         // GPIO_WriteBit(GPIOA, GPIO_Pin_13, 1);
  892.                                         System_Sta.s.to_heat1_cmd_flag = FLAG_ON;
  893.                                         System_Sta.s.to_heat2_cmd_flag = FLAG_ON;
  894.                                         Trans_dat_append(STATE_03);
  895.                                 }
  896.                                 else
  897.                                 {        
  898.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  899.                                         Block_Timer(50);
  900.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  901.                                         Block_Timer(200);
  902.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  903.                                         Block_Timer(50);
  904.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  905.                                         Block_Timer(200);
  906.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  907.                                         Block_Timer(50);
  908.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  909.                                         HotKeyChange = 0;//hot change
  910.                                 }
  911.                         }                  
  912.                         else
  913.                         {
  914.                                 // GPIO_WriteBit(GPIOC, GPIO_Pin_12, 0);
  915.                                 // GPIO_WriteBit(GPIOA, GPIO_Pin_13, 0);
  916.                                 System_Data.ntc1_setting_temperature = 0;
  917.                                 if (Save_Data.s.machine_type == DY_100B)
  918.                                 {
  919.                                          System_Data.ntc2_setting_temperature = 0;
  920.                                 }
  921.                                 else
  922.                                 {
  923.                                          System_Data.ntc2_setting_temperature = 0;
  924.                                 }
  925.                                 u8 tem[2] = {0};
  926.                                 tem[0] = System_Data.ntc1_setting_temperature;
  927.                                 tem[1] = System_Data.ntc2_setting_temperature;
  928.                                 i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  929.                                 Trans_dat_append(STATE_12);
  930.                                 
  931.                                 System_Data.fixed_state[1] = '0';
  932.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  933.                                 Block_Timer(50);
  934.                                 System_Sta.s.beep_timer_flag = TIMER_RESET;
  935.                                 Set_HotTube_1(Bit_RESET);
  936.                                 Set_HotTube_2(Bit_RESET);
  937.         ///System_Sta.s.hot_close_flag = 1;
  938.                                 Trans_dat_append(STATE_03);
  939.                         }
  940.                 }
  941.         }
  942.         if(ColdKeyLongPressStatus == 1 && READ_HOT_KEY_VALUE == 0)        
  943.         {
  944.                 if(key_type == COLD_KEY)
  945.                 {
  946.                                 ColdKeyChange = !ColdKeyChange;//冷键翻转
  947.                                 //GPIO_WriteBit(GPIOA, GPIO_Pin_14, ColdKeyChange);
  948.                                 key_type = OFF_KEY;
  949.                                 Trans_dat_append(STATE_02);
  950.                                 if(ColdKeyChange)
  951.                                 {
  952.                                         System_Data.fixed_state[2] = '1';
  953.                                         Set_IceTube(Bit_SET);
  954.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  955.                                         Block_Timer(50);
  956.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  957.                                         Block_Timer(200);
  958.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  959.                                         Block_Timer(50);
  960.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  961.                                 }
  962.                                 else
  963.                                 {
  964.                                         System_Data.fixed_state[2] = '0';
  965.                                         Set_IceTube(Bit_RESET);
  966.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  967.                                         Block_Timer(50);
  968.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  969.                                 }
  970.                                 Trans_dat_append(STATE_02);
  971.                 }
  972.         }
  973.         if(Bit_SET==Read_WaterShortagDetection()||System_Data.ntc1_temperature>=95||System_Data.ntc2_temperature>=95)
  974.         {
  975.                 GPIO_WriteBit(GPIOC, GPIO_Pin_12, 0);//hot tube 1
  976.                 GPIO_WriteBit(GPIOA, GPIO_Pin_13, 0);//hot tube 2
  977.                 HotKeyChange = 0;
  978.         }
  979. #endif


  980.         if(Save_Data.s.machine_type==DY_75)/*按键失效*/
  981.         {
  982.                 System_Sta.s.key_timer_flag = TIMER_RESET;
  983.         }
  984.         else if(Save_Data.s.machine_type==DY_400)/*童锁键改为温水键*/
  985.         {
  986.                 Child_Key_On_Flag = 1;
  987.         }
  988. <blockquote>if(child_detect.sta & GET_KEY_MARK)
复制代码

1208 发表于 2020-3-17 17:41
仿真看看,可以在长按10s后写个反馈信息,如串口打印


打印过了,两个定时器的变量,串口中的打印一直在计其中一个,另一个没记
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-18 17:06:34 | 显示全部楼层
本帖最后由 1208 于 2020-3-18 17:08 编辑
hejun96 发表于 2020-3-17 18:02
1208 发表于 2020-3-17 17:41
仿真看看,可以在长按10s后写个反馈信息,如串口打印

分别单独测试看看,还有试着改下定时器arr和pschttp://www.openedv.com/forum.php?mod=viewthread&tid=274729
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2020-3-18 21:27:33 | 显示全部楼层
1208 发表于 2020-3-18 17:06
分别单独测试看看,还有试着改下定时器arr和pschttp://www.openedv.com/forum.php?mod=viewthread&tid=27 ...

3路按键脉冲各自都能对应进行解码,所以和定时器中断还是无关的吧
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2020-3-19 09:16:20 | 显示全部楼层
1208 发表于 2020-3-18 17:06
分别单独测试看看,还有试着改下定时器arr和pschttp://www.openedv.com/forum.php?mod=viewthread&tid=27 ...

但是这个是编码协议,不能用高低电平的做法延时
COLD_KEY解码.jpg
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-19 15:09:13 | 显示全部楼层
hejun96 发表于 2020-3-19 09:16
但是这个是编码协议,不能用高低电平的做法延时

原来你是这样做的,那就可能跟定时器无关
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2020-3-20 23:38:08 | 显示全部楼层
1208 发表于 2020-3-19 15:09
原来你是这样做的,那就可能跟定时器无关

结果我查到是合泰触控的BS83B08C程序没有写好,然后短按保持解码方式不变,长按按键改成高低电平触发,高低电平需要上升沿和下降沿触发标志位和持续检测时间
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
 楼主| 发表于 2020-3-27 20:29:55 | 显示全部楼层
本帖最后由 hejun96 于 2020-3-28 08:58 编辑
1208 发表于 2020-3-18 17:06
分别单独测试看看,还有试着改下定时器arr和pschttp://www.openedv.com/forum.php?mod=viewthread&tid=27 ...
  1. volatile unsigned long ColdKeyPressTick=0;
  2. volatile unsigned long HotKeyPressTick=0;
  3. /*按键工作*/
  4. void Key_Work(void)
  5. {
  6. //        static KEY_TYPE key_type_temp = OFF_KEY;
  7.         ///static unsigned long ColdKeyPressTick=0;
  8.         ///static unsigned long HotKeyPressTick=0;
  9.         static unsigned long ChildKeyPressTick=0;
  10.         static unsigned long ResetKeyPressTick=0;
  11.         static char HotKeyLongPressFlag = 0;// status hot
  12.         static char ColdKeyLongPressFlag= 0;//status cold
  13.         static char ChildKeyLongPressFlag = 0;//童锁
  14.         static char ResetStatus = 0;
  15.         static char HotKeyChange = 0,ColdKeyChange = 0;//hot change ,cold change 设置翻转
  16.         

  17. #if 1
  18.         if (key_type == CHILD_KEY)//读取童锁键值
  19.         {
  20.                 if (gTick - ChildKeyPressTick >= 9*1000)//按键去抖动时间超过9*1000ms
  21.                 {
  22.                         ChildKeyLongPressFlag = 1;
  23.                 }
  24.         }
  25.         else
  26.         {
  27.                 ChildKeyLongPressFlag = 0;
  28.                 ChildKeyPressTick = gTick;
  29.         }
  30.         if (ChildKeyLongPressFlag)
  31.         {
  32.                 ChildKeyLongPressFlag = 0;
  33.                 ChildKeyPressTick = gTick;
  34.                 System_Sta.s.clean_self_cmd = FLAG_ON;
  35.                 //开启蜂鸣器
  36.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  37.                 {
  38.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  39.                 }
  40.         }
  41. #endif
  42.     #if 1
  43.         //增加复位键
  44.         if(key_type == RESET_KEY)
  45.         {
  46.                 if(gTick - ResetKeyPressTick >= 9*1000)
  47.                 {
  48.                         ResetStatus = 1;
  49.                 }
  50.         }
  51.         else
  52.         {
  53.                 ResetStatus = 0;
  54.                 ResetKeyPressTick = gTick;
  55.         }
  56.         if(key_type == HOT_KEY)
  57.         {
  58.                 //
  59.                 if(gTick-HotKeyPressTick>=9*1000)//热水键长按10s
  60.                 {
  61.                         HotKeyLongPressFlag = 1;//热水按键单独长按10s标志位进入
  62.                         ///HotKeyPressTick = gTick;
  63.                 }
  64.         }
  65.         else
  66.         {
  67.                 HotKeyLongPressFlag = 0;
  68.                 HotKeyPressTick = gTick;
  69.         }
  70.         if(key_type == COLD_KEY)
  71.         {
  72.                 if(gTick - ColdKeyPressTick >= 9*1000)//冷水键单独长按10s
  73.                 {
  74.                         ColdKeyLongPressFlag = 1;//冷水按键单独长按标志位置1
  75.                         ///ColdKeyPressTick = gTick;
  76.                 }
  77.         }
  78.         else
  79.         {
  80.                 ColdKeyLongPressFlag = 0;
  81.                 ColdKeyPressTick = gTick;
  82.         }        
  83.         if(ResetStatus)//双键长按标志位两个都为1///if(ResetStatus) 复位按键
  84.         {        
  85.                 Save_Data.s.self_clean_flag = 0;
  86.                 i2cWriteBuffer1(AT24C02_ADDR,AT24C02_REG,sizeof(SAVE_DATA_UNION),(u8*)&Save_Data);/*写入数据*/
  87.                
  88.                 for(int i=0;i<sizeof(STA_UNION);i++)
  89.                 {
  90.                         System_Sta.sta[i] = 0;
  91.                 }

  92.                 memset((void *)(&System_Data),0,sizeof(DATA_STRUCT));
  93.                 //开启蜂鸣器
  94.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  95.                 {
  96.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  97.                 }
  98.                 System_Data.flash_water_flag[0]='0';
  99.                 System_Data.flash_water_flag[1]='2';/*停止清洗*/
  100.                 Trans_dat_append(STATE_23);
  101.                 while(1);               
  102.         }
  103.         if(HotKeyLongPressFlag == 1 && READ_COLD_KEY_VALUE == 0)        
  104.         {
  105.                 if(key_type == HOT_KEY)
  106.                 {
  107.                         HotKeyChange = !HotKeyChange;//hot change
  108.                         key_type = OFF_KEY;
  109.                         if(1 == HotKeyChange)//System_Sta.s.hot_close_flag == 1
  110.                         {
  111.                                 if(Bit_RESET==Read_WaterShortagDetection())
  112.                                 {
  113.                                         System_Data.fixed_state[1] = '1';
  114.                                        
  115.                                         ///System_Sta.s.hot_close_flag = 0;
  116.                                         System_Data.ntc1_setting_temperature = 92;//原值为95
  117.                                         if (Save_Data.s.machine_type != DY_100B)
  118.                                         {
  119.                                                 System_Data.ntc2_setting_temperature = 92;//原值为95
  120.                                         }
  121.                                         else
  122.                                         {
  123.                                                 System_Data.ntc2_setting_temperature = 0;
  124.                                         }
  125.                                         // u8 tem[2] = {0};
  126.                                         // tem[0] = System_Data.ntc1_setting_temperature;
  127.                                         // tem[1] = System_Data.ntc2_setting_temperature;
  128.                                         // i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  129.                                         u8 tem[2] = {0};
  130.                                         tem[0] = System_Data.ntc1_setting_temperature;
  131.                                         tem[1] = System_Data.ntc2_setting_temperature;
  132.                                         i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  133.                                         Trans_dat_append(STATE_12);

  134.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  135.                                         Block_Timer(50);//阻塞时间50ms
  136.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  137.                                         Block_Timer(200);//阻塞时间200ms
  138.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  139.                                         Block_Timer(50);//阻塞时间50ms
  140.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  141.                                         // GPIO_WriteBit(GPIOC, GPIO_Pin_12, 1);
  142.                                         // GPIO_WriteBit(GPIOA, GPIO_Pin_13, 1);
  143.                                         System_Sta.s.to_heat1_cmd_flag = FLAG_ON;
  144.                                         System_Sta.s.to_heat2_cmd_flag = FLAG_ON;
  145.                                         Trans_dat_append(STATE_03);
  146.                                 }
  147.                                 else
  148.                                 {        
  149.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  150.                                         Block_Timer(50);
  151.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  152.                                         Block_Timer(200);
  153.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  154.                                         Block_Timer(50);
  155.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  156.                                         Block_Timer(200);
  157.                                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  158.                                         Block_Timer(50);
  159.                                         System_Sta.s.beep_timer_flag = TIMER_RESET;
  160.                                         HotKeyChange = 0;//hot change
  161.                                 }
  162.                         }                  
  163.                         else
  164.                         {
  165.                                 // GPIO_WriteBit(GPIOC, GPIO_Pin_12, 0);
  166.                                 // GPIO_WriteBit(GPIOA, GPIO_Pin_13, 0);
  167.                                 System_Data.ntc1_setting_temperature = 0;
  168.                                 if (Save_Data.s.machine_type == DY_100B)
  169.                                 {
  170.                                          System_Data.ntc2_setting_temperature = 0;
  171.                                 }
  172.                                 else
  173.                                 {
  174.                                          System_Data.ntc2_setting_temperature = 0;
  175.                                 }
  176.                                 u8 tem[2] = {0};
  177.                                 tem[0] = System_Data.ntc1_setting_temperature;
  178.                                 tem[1] = System_Data.ntc2_setting_temperature;
  179.                                 i2cWriteBuffer1(AT24C02_ADDR, AT24C02_REG_TEM, sizeof(tem), (u8*)&tem);/*写入数据*/
  180.                                 Trans_dat_append(STATE_12);
  181.                                 
  182.                                 System_Data.fixed_state[1] = '0';
  183.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  184.                                 Block_Timer(50);
  185.                                 System_Sta.s.beep_timer_flag = TIMER_RESET;
  186.                                 Set_HotTube_1(Bit_RESET);
  187.                                 Set_HotTube_2(Bit_RESET);
  188.         ///System_Sta.s.hot_close_flag = 1;
  189.                                 Trans_dat_append(STATE_03);
  190.                         }
  191.                 }
  192.         }
  193.         if(ColdKeyLongPressFlag == 1 && READ_HOT_KEY_VALUE == 0)        
  194.         {
  195.                 if(key_type == COLD_KEY)
  196.                 {
  197.                         ColdKeyChange = !ColdKeyChange;//冷键翻转
  198.                         //GPIO_WriteBit(GPIOA, GPIO_Pin_14, ColdKeyChange);
  199.                         key_type = OFF_KEY;
  200.                         Trans_dat_append(STATE_02);
  201.                         if(ColdKeyChange)
  202.                         {
  203.                                 System_Data.fixed_state[2] = '1';
  204.                                 Set_IceTube(Bit_SET);
  205.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  206.                                 Block_Timer(50);
  207.                                 System_Sta.s.beep_timer_flag = TIMER_RESET;
  208.                                 Block_Timer(200);
  209.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  210.                                 Block_Timer(50);
  211.                                 System_Sta.s.beep_timer_flag = TIMER_RESET;
  212.                         }
  213.                         else
  214.                         {
  215.                                 System_Data.fixed_state[2] = '0';
  216.                                 Set_IceTube(Bit_RESET);
  217.                                 System_Sta.s.beep_timer_flag = TIMER_RUN;
  218.                                 Block_Timer(50);
  219.                                 System_Sta.s.beep_timer_flag = TIMER_RESET;
  220.                         }
  221.                         Trans_dat_append(STATE_02);
  222.                 }
  223.         }
  224.         if(Bit_SET==Read_WaterShortagDetection()||System_Data.ntc1_temperature>=95||System_Data.ntc2_temperature>=95)
  225.         {
  226.                 GPIO_WriteBit(GPIOC, GPIO_Pin_12, 0);//hot tube 1
  227.                 GPIO_WriteBit(GPIOA, GPIO_Pin_13, 0);//hot tube 2
  228.                 HotKeyChange = 0;
  229.         }
  230. #endif
  231.         

  232.         if(Save_Data.s.machine_type==DY_75)/*按键失效*/
  233.         {
  234.                 System_Sta.s.key_timer_flag = TIMER_RESET;
  235.         }
  236.         else if(Save_Data.s.machine_type==DY_400)/*童锁键改为温水键*/
  237.         {
  238.                 ChildKeyOnFlag = 1;
  239.         }
  240.         //等待捕捉到稳定按键值


  241.         if(child_detect.sta & GET_KEY_MARK)
  242.         {
  243.                 //更新按键值
  244.                 key_type_temp = key_type;
  245.                 ///key_type |= CHILD_KEY;
  246.                 //开启蜂鸣器
  247.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  248.                 {
  249.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  250.                 }
  251.                 child_detect.sta &= ~GET_KEY_MARK;//清除bit位
  252.                
  253.         }
  254.         if(cold_detect.sta & GET_KEY_MARK)
  255.         {
  256.                 //更新按键值
  257.                 key_type_temp = key_type;
  258.                 ///key_type |= COLD_KEY;
  259.                 //开启蜂鸣器
  260.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  261.                 {
  262.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  263.                 }
  264.                 cold_detect.sta &= ~GET_KEY_MARK;//清除bit位
  265.                
  266.         }
  267.         if(hot_detect.sta & GET_KEY_MARK)
  268.         {
  269.                 //更新按键值
  270.                 key_type_temp = key_type;
  271.                 ///key_type |= HOT_KEY;
  272.                 //开启蜂鸣器
  273.                 if(TIMER_RESET==System_Sta.s.beep_timer_flag)
  274.                 {
  275.                         System_Sta.s.beep_timer_flag = TIMER_RUN;
  276.                 }
  277.                 hot_detect.sta &= ~GET_KEY_MARK;//清除bit位
  278.                
  279.         }
  280.         
  281.         
  282.         if (System_Data.fill_water_number[sizeof(System_Data.fill_water_number)-3] == '0' &&\
  283.                 System_Data.fill_water_number[sizeof(System_Data.fill_water_number)-2] == '1' &&\
  284.                 System_Data.fill_water_number[sizeof(System_Data.fill_water_number)-1] == '2'
  285.          )
  286.         {
  287.                  if (key_type_temp != System_Data.last_key_type)
  288.                  {
  289.                                  key_type_temp = OFF_KEY;
  290.         //            return;
  291.                  }
  292.         }
  293.         //处理按键值
  294.         switch(key_type_temp)
  295.         {
  296.                 case CHILD_KEY://此case为选择童锁按键
  297.                         //System_Data.child_flag_tick = 0;
  298.                         if(Save_Data.s.machine_type==DY_400)//DY_400为一个热水泵+一个冷水泵                        
  299.                         {
  300.                                 if((CHILD_KEY==System_Data.last_key_type&&FLAG_ON==System_Sta.s.water_on_flag)||\
  301.                                                  (System_Sta.s.Liquid_shortage_flag == FLAG_ON))
  302.                                 {
  303.                                         Set_NormalWaterValve_H(Bit_RESET);
  304.                                         //System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  305.                                         System_Sta.s.child_timer_flag = TIMER_RESET;
  306.                                         System_Data.child_flag_tick = 0;
  307.                                         System_Sta.s.normal_water_on_flag = FLAG_OFF;
  308.                                         System_Sta.s.pre_out_normal_water_flag = 0;
  309.                                 }
  310.                                 else /*准备打开温水开关*/
  311.                                 {
  312.                                         System_Sta.s.pre_out_normal_water_flag = 1;
  313.                                         if(TIMER_RESET!=System_Sta.s.nfc_tick_flag)
  314.                                         {
  315.                                                 Trans_dat_append(REQUEST_RFID_CHANGE_06);/*上报数据*/
  316.                                                 System_Data.rfid_number_ascill[24]='0';
  317.                                                 System_Data.rfid_number_ascill[25]='0';
  318.                                         }
  319.                                         Trans_dat_append(STATE_22);/*上报数据 请求出水*/
  320.                                 }
  321.                         }
  322.                         else
  323.                         {
  324.                                 System_Sta.s.child_timer_flag = TIMER_RUN;
  325.                                 ChildKeyOnFlag = 1;/*解锁*/
  326.                         }
  327.                         break;
  328.                
  329.                 case HOT_KEY://此case为热键
  330.                   
  331.                                 
  332.                                 if((FLAG_OFF==ChildKeyOnFlag) || \
  333.                                    (HOT_KEY==System_Data.last_key_type&&FLAG_ON==System_Sta.s.water_on_flag)||\
  334.                                    (System_Sta.s.Liquid_shortage_flag == FLAG_ON))
  335.                                 {               
  336.                                         ///printf("Turn off HotWaterValve\n\n");
  337.                                         Set_HotWaterValve_F(Bit_RESET);
  338.                                         System_Data.hot_water_time += System_Data.hot_water_flag_tick/1000;
  339.                                         System_Sta.s.hot_water_timer_flag = TIMER_RESET;
  340.                                         System_Data.hot_water_flag_tick = 0;
  341.                                         System_Sta.s.hot_water_on_flag = FLAG_OFF;
  342.                                         System_Sta.s.pre_out_hot_water_flag = 0;
  343.                                         if(FLAG_OFF==ChildKeyOnFlag)
  344.                                         {
  345.                                                 System_Data.water_out_flag[0] = '0';
  346.                                                 System_Data.water_out_flag[1] = '4';//童锁未解锁拒绝出水
  347.                                                 Trans_dat_append(WATER_OUT_REPORT_21);//上报数据

  348.                                                 if(System_Sta.s.nfc_tick_flag == TIMER_RUN)//nfc出水中
  349.                                                 {
  350.                                                         System_Data.rfid_number_ascill[24] = '0';
  351.                                                         System_Data.rfid_number_ascill[25] = '4';
  352.                                                         Trans_dat_append(REQUEST_RFID_CHANGE_06);//上报数据
  353.                                                 }

  354.                                                 if(FLAG_OFF==System_Sta.s.scaven_end_flag)
  355.                                                 {
  356.                                                         System_Sta.s.scaven_hot_flag =  FLAG_ON;
  357.                                                         Trans_dat_append(ORDER_REPORT_04);//上报数据
  358.                                                 }
  359.                                         }
  360.                                 }
  361.                                 else //准备打开热水开关
  362.                                 {
  363.                                         System_Sta.s.pre_out_hot_water_flag = 1;
  364.                                         Trans_dat_append(STATE_22);//上报数据 请求出水
  365.                                         if(TIMER_RESET!=System_Sta.s.nfc_tick_flag)
  366.                                         {
  367.                                                 Trans_dat_append(REQUEST_RFID_CHANGE_06);//上报数据
  368.                                                 System_Data.rfid_number_ascill[24]='0';
  369.                                                 System_Data.rfid_number_ascill[25]='0';
  370.                                         }
  371.                                         if(Save_Data.s.machine_type!=DY_400)
  372.                                         {
  373.                                                 System_Data.child_flag_tick = 0;//清0童锁计数器
  374.                                         }
  375.                                 }
  376.                      
  377.                         break;
  378.                
  379.                 case COLD_KEY:
  380.                        
  381.                                 
  382.                                 if((COLD_KEY==System_Data.last_key_type&&FLAG_ON==System_Sta.s.water_on_flag)||\
  383.                                    (System_Sta.s.Liquid_shortage_flag == FLAG_ON))
  384.                                 {
  385.                                         Set_ColdWaterValve_G(Bit_RESET);
  386.                                         System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  387.                                         System_Sta.s.cold_water_timer_flag = TIMER_RESET;
  388.                                         System_Data.cold_water_flag_tick = 0;
  389.                                         System_Sta.s.cold_water_on_flag = FLAG_OFF;
  390.                                         System_Sta.s.pre_out_cold_water_flag = 0;
  391.                                 }
  392.                                 else //准备打开冷水开关
  393.                                 {
  394.                                         System_Sta.s.pre_out_cold_water_flag = 1;
  395.                                         Trans_dat_append(STATE_22);//上报数据 请求出水
  396.                                         if(TIMER_RESET!=System_Sta.s.nfc_tick_flag)
  397.                                         {
  398.                                                 Trans_dat_append(REQUEST_RFID_CHANGE_06);//上报数据
  399.                                                 System_Data.rfid_number_ascill[24]='0';
  400.                                                 System_Data.rfid_number_ascill[25]='0';
  401.                                         }        
  402.                                 }        
  403.                      
  404.                         break;
  405.                
  406.                 case OFF_KEY:
  407.                         
  408.                         break;
  409.                         
  410.                 default :
  411.                         break;
  412.         }
  413.         //更新上次的有效按键
  414.         if(OFF_KEY!=key_type_temp && CHILD_KEY!=key_type_temp)
  415.         {
  416.                 System_Data.last_key_type = key_type_temp;
  417.         }
  418.         if(Save_Data.s.machine_type==DY_400)
  419.         {
  420.                 if(CHILD_KEY == key_type_temp)
  421.                 {
  422.                         System_Data.last_key_type = key_type_temp;
  423.                 }
  424.         }
  425.         key_type_temp = OFF_KEY;


  426.         if(System_Sta.s.pre_out_cold_water_flag==1||\
  427.            System_Sta.s.pre_out_normal_water_flag ==1||\
  428.            System_Sta.s.pre_out_hot_water_flag ==1)
  429.         {
  430.                 if(TIMER_RESET==System_Sta.s.wait_water_tick_flag)
  431.                 {
  432.                         System_Sta.s.wait_water_tick_flag = TIMER_RUN;
  433.                 }
  434.         }
  435.         else
  436.         {
  437.                 System_Sta.s.wait_water_tick_flag = TIMER_RESET;
  438.                 System_Data.wait_water_tick = 0;
  439.         }
  440.         if(System_Data.wait_water_tick>5000)
  441.         {
  442.                 System_Sta.s.pre_out_cold_water_flag=0;
  443.                 System_Sta.s.pre_out_normal_water_flag =0;
  444.                 System_Sta.s.pre_out_hot_water_flag =0;
  445.                 System_Sta.s.wait_water_tick_flag = TIMER_RESET;
  446.                 System_Data.wait_water_tick = 0;
  447.         }
  448.         //允许热水出水
  449.         if(System_Sta.s.pre_out_hot_water_flag == 2)
  450.         {
  451.                 ///printf("Turn on HotWaterValve\n\n");
  452.                 Set_HotWaterValve_F(Bit_SET);
  453.                 Set_ColdWaterValve_G(Bit_RESET);
  454.                 Set_NormalWaterValve_H(Bit_RESET);
  455.                 if(TIMER_RESET==System_Sta.s.hot_water_timer_flag)
  456.                 {
  457.                         System_Sta.s.hot_water_timer_flag = TIMER_RUN;
  458.                 }
  459.                 System_Sta.s.hot_water_on_flag = FLAG_ON;
  460.                 System_Sta.s.pre_out_hot_water_flag = 0;
  461.                 System_Sta.s.pre_out_cold_water_flag = 0;
  462.                
  463.                 if(System_Sta.s.cold_water_on_flag)/*更新 切换出水相关标志位*/
  464.                 {
  465.                         System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  466.                 }
  467.                
  468.                 if(Save_Data.s.machine_type==DY_400&&System_Sta.s.child_timer_flag==1)/*更新 切换出水相关标志位*/
  469.                 {
  470.                         System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  471.                 }
  472.                
  473.                 if(Save_Data.s.machine_type==DY_400)
  474.                 {
  475.                         /*停止温水*/
  476.                         System_Data.child_flag_tick = 0;
  477.                         System_Sta.s.child_timer_flag = TIMER_RESET;
  478.                         System_Sta.s.normal_water_on_flag = FLAG_OFF;
  479.                         Set_NormalWaterValve_H(Bit_RESET);               
  480.                 }

  481.                 /*停止冷水*/
  482.                 System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  483.                 System_Data.cold_water_flag_tick = 0;
  484.                 System_Sta.s.cold_water_timer_flag = TIMER_RESET;
  485.                 System_Sta.s.cold_water_on_flag = FLAG_OFF;
  486.                 Set_ColdWaterValve_G(Bit_RESET);               
  487.         }
  488.         //允许冷水出水
  489.         else if(System_Sta.s.pre_out_cold_water_flag == 2)
  490.         {               
  491.                 Set_ColdWaterValve_G(Bit_SET);
  492.                 Set_HotWaterValve_F(Bit_RESET);
  493.                 Set_NormalWaterValve_H(Bit_RESET);
  494.                 if(TIMER_RESET==System_Sta.s.cold_water_timer_flag)
  495.                 {
  496.                         System_Sta.s.cold_water_timer_flag = TIMER_RUN;
  497.                 }
  498.                 System_Sta.s.cold_water_on_flag = FLAG_ON;
  499.                 System_Sta.s.pre_out_cold_water_flag = 0;
  500.                 System_Sta.s.pre_out_hot_water_flag = 0;
  501.                

  502.                 if(System_Sta.s.hot_water_on_flag)/*更新 切换出水相关标志位*/
  503.                 {
  504.                         System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  505.                 }
  506.                
  507.                 if(Save_Data.s.machine_type==DY_400&&System_Sta.s.child_timer_flag==1)/*更新 切换出水相关标志位*/
  508.                 {
  509.                         System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  510.                 }
  511.                
  512.                 /*停止热水*/
  513.                 System_Data.hot_water_time += System_Data.hot_water_flag_tick/1000;
  514.                 System_Data.hot_water_flag_tick = 0;
  515.                 System_Sta.s.hot_water_timer_flag = TIMER_RESET;
  516.                 System_Sta.s.hot_water_on_flag = FLAG_OFF;
  517.                 Set_HotWaterValve_F(Bit_RESET);
  518.                
  519.                 if(Save_Data.s.machine_type==DY_400)
  520.                 {
  521.                         /*停止温水*/
  522.                         System_Data.child_flag_tick = 0;
  523.                         System_Sta.s.child_timer_flag = TIMER_RESET;
  524.                         System_Sta.s.normal_water_on_flag = FLAG_OFF;
  525.                         Set_NormalWaterValve_H(Bit_RESET);               
  526.                 }
  527.         }
  528.         if(Save_Data.s.machine_type==DY_400)
  529.         {
  530.                 //允许温水出水
  531.                 if(System_Sta.s.pre_out_normal_water_flag == 2)
  532.                 {
  533.                         Set_HotWaterValve_F(Bit_RESET);
  534.                         Set_ColdWaterValve_G(Bit_RESET);
  535.                         Set_NormalWaterValve_H(Bit_SET);
  536.                         if(TIMER_RESET==System_Sta.s.child_timer_flag)
  537.                         {
  538.                                 System_Sta.s.child_timer_flag = TIMER_RUN;
  539.                         }
  540.                         System_Sta.s.normal_water_on_flag = FLAG_ON;
  541.                         System_Sta.s.pre_out_hot_water_flag = 0;
  542.                         System_Sta.s.pre_out_cold_water_flag = 0;
  543.                         System_Sta.s.pre_out_normal_water_flag = 0;
  544.                         
  545.                         
  546.                         if(System_Sta.s.cold_water_on_flag)/*更新 切换出水相关标志位*/
  547.                         {
  548.                                 System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  549.                         }

  550.                         if(System_Sta.s.hot_water_on_flag)/*更新 切换出水相关标志位*/
  551.                         {
  552.                                 System_Sta.s.Update_Out_Water_Time_flag = FLAG_ON;
  553.                         }
  554.                                 
  555.                         /*停止热水*/
  556.                         System_Data.hot_water_time += System_Data.hot_water_flag_tick/1000;
  557.                         System_Data.hot_water_flag_tick = 0;
  558.                         System_Sta.s.hot_water_timer_flag = TIMER_RESET;
  559.                         System_Sta.s.hot_water_on_flag = FLAG_OFF;
  560.                         Set_HotWaterValve_F(Bit_RESET);
  561.                         /*停止冷水*/
  562.                         System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  563.                         System_Data.cold_water_flag_tick = 0;
  564.                         System_Sta.s.cold_water_timer_flag = TIMER_RESET;
  565.                         System_Sta.s.cold_water_on_flag = FLAG_OFF;
  566.                         Set_ColdWaterValve_G(Bit_RESET);
  567.                 }
  568.                 /*温水键工作*/
  569.                 if((TIMER_RUN==System_Sta.s.child_timer_flag) && (System_Data.child_flag_tick>HOT_DELAY_MS))
  570.                 {
  571.                         //System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  572.                         System_Data.child_flag_tick = 0;
  573.                         System_Sta.s.child_timer_flag = TIMER_RESET;
  574.                         System_Sta.s.normal_water_on_flag = FLAG_OFF;
  575.                         Set_NormalWaterValve_H(Bit_RESET);
  576.                 }
  577.         }
  578.         else
  579.         {
  580.                 /*童锁键工作*/
  581.                 if((FLAG_ON==ChildKeyOnFlag) && \
  582.                    (CHILD_DELAY_MS>System_Data.child_flag_tick) && \
  583.                    (FLAG_ON==System_Sta.s.hot_water_on_flag))
  584.                 {
  585.                         System_Data.child_flag_tick = 0;
  586.                 }
  587.                 else if(CHILD_DELAY_MS<=System_Data.child_flag_tick)
  588.                 {
  589.                         System_Data.child_flag_tick = 0;
  590.                         System_Sta.s.child_timer_flag = TIMER_RESET;
  591.                         ChildKeyOnFlag = 0;
  592.                 }
  593.         }
  594.    
  595.         /*热水键工作*/
  596.         if((TIMER_RUN==System_Sta.s.hot_water_timer_flag) && (System_Data.hot_water_flag_tick>HOT_DELAY_MS))
  597.         {
  598.                 System_Data.hot_water_time += System_Data.hot_water_flag_tick/1000;
  599.                 System_Data.hot_water_flag_tick = 0;
  600.                 System_Sta.s.hot_water_timer_flag = TIMER_RESET;
  601.                 System_Sta.s.hot_water_on_flag = FLAG_OFF;
  602.                 Set_HotWaterValve_F(Bit_RESET);
  603.         }
  604.         
  605. //  if( (TIMER_RUN==System_Sta.s.hot_water_timer_flag) &&\
  606. //                  (0<System_Data.hot_water_flag_tick) &&\
  607. //                  (HOT_DELAY_MS>System_Data.hot_water_flag_tick) &&\
  608. //            (TIMER_RUN==System_Sta.s.hot_water_timer_flag) )
  609. //        {
  610. //               
  611. //        }

  612.         /*冷水键工作*/
  613.         if((TIMER_RUN==System_Sta.s.cold_water_timer_flag) && (System_Data.cold_water_flag_tick>COOL_DELAY_MS))
  614.         {
  615.                 System_Data.cold_water_time += System_Data.cold_water_flag_tick/1000;
  616.                 System_Data.cold_water_flag_tick = 0;
  617.                 System_Sta.s.cold_water_timer_flag = TIMER_RESET;
  618.                 System_Sta.s.cold_water_on_flag = FLAG_OFF;
  619.                 Set_ColdWaterValve_G(Bit_RESET);
  620.         }
  621. }
复制代码
版主,上次的触控按键部分的问题解决了,这个问题是STM32F103主控端在按键10s长按的时候会打开短按的功能,那么我在长按的时候不需要打开短按根据上面的代码要如果处理一下呢?短按的时间一般不超过2s,长按的标志位和短按要分开写吗?还是说一个标志位可以表示这个按键的长短按,执行长按时标志位置1,短按和长按互斥?

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 23:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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