main.cb2 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //#define IsDebug
  3. //#define tim2Led
  4. //#define RxTestDebug
  5. ////////////////////////////////////////////////////////////////////////////////
  6. #include <iostm8s003f3.h>
  7. #define KEY0 KEY[0] //����
  8. #define KEY1 KEY[1] //������ťȡ������
  9. //==============================================================
  10. __root unsigned int BUS_RevBuf[30];
  11. __root unsigned char BUS_RevIndex=0;
  12. __root unsigned char BUS_Rev_Cmd[3]; //���߽���
  13. __root unsigned int BUS_RevOverTime=0; //���߽��ճ�ʱ,200
  14. __root unsigned char Bus_RevFlag=0; //���߽��ճɹ�
  15. //==============================================================
  16. __root unsigned char Ledswitch=2; //RedLED����
  17. __root unsigned char KEY[2]={0}; //����
  18. //============================================
  19. __root unsigned char BUS_SendInex=0;
  20. __root unsigned char BUS_SendCmd[30]; //Ӧ�ò㷢������
  21. __root unsigned char BUS_SendingCmd[30]; //��ʱ�����ڴ�������
  22. //==============================================================
  23. __root unsigned long LocalTime=0;
  24. __root unsigned char RunMode=0; //0����ʾע��ģʽ��>0��ʾ��������ģʽ
  25. __root unsigned char Bus_SendLength=146; //���߷��ͳ��ȣ���ע��ģʽʱ����Ϊ
  26. //==============================================================
  27. __root unsigned char BUS_SendCnt = 0; //�ط�����
  28. __root const unsigned char BlankStr[28]="555555555555";
  29. __root const unsigned char DeviceSN[16]="SZFS20250120001";
  30. __root const unsigned char DeviceAddr[10]={0x31,0x08};
  31. __root const unsigned char *Addrp=0;
  32. void SysVar_Init(void);
  33. void BUS_RevData(void);
  34. void GPIO_KEY_Tick(void);
  35. void BUS_Rev_Tick(void);
  36. void BUS_SendData(unsigned char Length);
  37. void GPIO_MIC_SW(unsigned char status);
  38. //============================================
  39. #ifdef RxTestDebug
  40. unsigned long rxtestDebugcnt=0;
  41. #endif
  42. //==============================================================
  43. void SysVar_Init(void)
  44. {
  45. Addrp=DeviceAddr;
  46. RunMode=0;
  47. Ledswitch=2;
  48. }
  49. //==============================================================
  50. void STM8_Init(void)
  51. {
  52. CLK_CKDIVR =0x18; //16M/8=2M
  53. }
  54. //==============================================================
  55. void GPIO_EXTI_Init(void)
  56. {
  57. EXTI_CR1_PCIS=1; //PC��Ϊ�½����ж�
  58. PC_DDR_DDR7=0;
  59. PC_CR1_C17=1;
  60. PC_CR2_C27=1;
  61. }
  62. void TIM2_Init(void)
  63. {
  64. TIM2_IER = 0x00; //��ֹ�ж�
  65. TIM2_PSCR = 0x04; //����Ԥ��Ƶ�Ĵ�����
  66. TIM2_ARRH =0xFF;
  67. TIM2_ARRL =0xFF;
  68. TIM2_CNTRH=0x00; //��ֵ
  69. TIM2_CNTRL=0x00;
  70. TIM2_CR1 |= 0x01; //������ʱ��
  71. }
  72. void GPIO_KEY_Init(void)
  73. {
  74. //==============================================
  75. PA_DDR_DDR1=0;
  76. PA_DDR_DDR2=0;
  77. PA_CR1_C11=1;
  78. PA_CR1_C12=1;
  79. PA_CR2_C21=0;
  80. PA_CR2_C22=0;
  81. //==============================================
  82. //==============================================
  83. PD_DDR_DDR4=0; // 配置为输入
  84. PD_CR1_C14=1; // 上拉输入
  85. PD_CR2_C24=0; // 禁用外部中断
  86. //==============================================
  87. KEY0=0;
  88. KEY1=0;
  89. BUS_SendCnt =0;
  90. }
  91. void GPIO_LED_Init(void)
  92. {
  93. PD_DDR_DDR3 =1; //配置为输出
  94. PD_CR1_C13 =1; //推挽输出模式
  95. PD_ODR_ODR3 =1; //输出高电平,LED亮
  96. Ledswitch=2; // 初始化时LED常亮
  97. }
  98. void TIM4_1ms_Init(void)
  99. {
  100. TIM4_PSCR = 0x03; //����Ԥ��Ƶ�Ĵ�����
  101. //��8�ַ�Ƶ����1(0)��2(1)��4(2)��8(3)��16(4)��32(5)��64(6)��128(7)
  102. TIM4_ARR = 0xF9; //�����Զ���װ�ؼĴ���
  103. TIM4_IER = 0x01; //����TIM4�����¼��ж�ʹ��
  104. TIM4_CNTR = 0xF9; //����TIM4��ʱ����ֵ��ʹ�ÿ�ʼ����ʱ������һ�����
  105. TIM4_CR1_CEN= 0x01; //ʹ�ܼ���������TIM4_CR1�Ĵ���CENλΪ��1��
  106. }
  107. void TIM1_PWM_Init(void)
  108. {
  109. PC_DDR_DDR4 =1;
  110. //=============================================
  111. TIM1_PSCRH =0;
  112. TIM1_PSCRL =0; //��ʱ��1 ʱ�Ӳ���Ƶ
  113. TIM1_ARRH =0;
  114. TIM1_ARRL =19; //��ʱ��1��PWM���Ƶ�ʣ�2000 000/20=100K
  115. TIM1_CR1 &=0x8F; //���ϼ��������ض���ģʽ
  116. //=============================================
  117. TIM1_CCR4H =0;
  118. TIM1_CCR4L =10;
  119. TIM1_CCMR4 =0x60; //����CH4ΪPWMģʽ1
  120. TIM1_CCER2 &=0x1F; //����CH4�ߵ�ƽ��Ч
  121. //TIM1_CCER2 |=0x10; //ʹ��CH4���
  122. TIM1_OISR &=0xBF; //��������͵�ƽ
  123. //ͨ��4��100K_50% PWM���
  124. //=============================================
  125. TIM1_CR1 |=0x01;
  126. TIM1_BKR =0x80;
  127. }
  128. void TIM2_PWM_Init(void)
  129. {
  130. // TIM2_IER = 0x04;
  131. // PD_DDR_DDR3 =1;
  132. //=============================================
  133. TIM2_CCMR2 = TIM2_CCMR2 | 0x70; //����CH2ΪPWMģʽ1
  134. // TIM2_CCER1 &=0x1F; //����CH2�ߵ�ƽ��Ч
  135. TIM2_CCER1 = TIM2_CCER1 | 0x30; //ʹ��CH2���
  136. TIM2_ARRH =0;
  137. TIM2_ARRL = 19; //��ʱ��1��PWM���Ƶ�ʣ�2000 000/100=20K
  138. // TIM2_CR1 &=0x8F; //���ϼ��������ض���ģʽ
  139. //=============================================
  140. TIM2_CCR2H =0x0;
  141. TIM2_CCR2L =0x00;
  142. TIM2_PSCR =0; //0x03
  143. // TIM2_OISR &=0xBF; //��������͵�ƽ
  144. //ͨ��2��1K_50% PWM���
  145. //=============================================
  146. TIM2_CR1 = TIM2_CR1 |0x01;
  147. // TIM2_BKR =0x80;
  148. }
  149. void GPIO_LED_Tick(void)
  150. {
  151. static unsigned long flashTime=0;
  152. static unsigned char ledflag=0;
  153. static unsigned char ledflagbak=0;
  154. #ifdef tim2Led
  155. if(Ledswitch==1)
  156. {
  157. //PD_ODR_ODR3=1;
  158. TIM2_CCR2H =0;
  159. TIM2_CCR2L =19;
  160. ledflag =0;
  161. }
  162. else if (Ledswitch==2)
  163. {
  164. if(LocalTime>flashTime)
  165. {
  166. flashTime=LocalTime+100;
  167. ledflag ++;
  168. }
  169. if (ledflagbak == ledflag ) {
  170. return;
  171. }
  172. ledflagbak = ledflag ;
  173. if(ledflag >39 ) {
  174. ledflag =0;
  175. }
  176. TIM2_CCR2H =0x0;
  177. if (ledflag > 19 ) {
  178. TIM2_CCR2L = (ledflag-19) ;
  179. } else if (ledflag > 15 ) {
  180. TIM2_CCR2L = (19-ledflag) ;
  181. ledflag = 20;
  182. }
  183. else {
  184. TIM2_CCR2L = (19-ledflag) ;
  185. }
  186. }
  187. else
  188. {
  189. TIM2_CCR2H =0x0;
  190. TIM2_CCR2L =0x0;
  191. ledflag =0;
  192. // PD_ODR_ODR3=0;
  193. }
  194. #else
  195. if(Ledswitch==1)
  196. {
  197. PD_ODR_ODR3=1;
  198. }
  199. else if (Ledswitch==2)
  200. {
  201. PD_ODR_ODR3=1;
  202. }
  203. else
  204. {
  205. PD_ODR_ODR3=0;
  206. }
  207. #endif
  208. }
  209. void GPIO_KEY_Tick(void)
  210. {
  211. static unsigned long keyTime1=0;
  212. static unsigned char keyResTime2 =0;
  213. static unsigned long key_timeout = 0;
  214. // KEY0(紧急按钮)处理
  215. if(PA_IDR_IDR1==1) // 没有按下
  216. {
  217. keyTime1=LocalTime+120; // 重置延时
  218. }
  219. else if(LocalTime>keyTime1) // 按下且延时到
  220. {
  221. if(KEY0 == 0) // 未处理状态
  222. {
  223. KEY0 = 2; // 设置触发状态
  224. key_timeout = LocalTime + 100;
  225. }
  226. }
  227. // KEY1(取消按钮)处理
  228. if(PD_IDR_IDR4==0) // 按下
  229. {
  230. if(keyResTime2 < 50) // 消抖
  231. {
  232. keyResTime2++;
  233. if(keyResTime2 >= 50 && KEY1 == 0)
  234. {
  235. KEY1 = 2; // 设置触发状态
  236. }
  237. }
  238. }
  239. else // 松开
  240. {
  241. keyResTime2 = 0; // 重置消抖计数
  242. }
  243. }
  244. void BUS_RevData(void)
  245. {
  246. //=======================================
  247. if(((BUS_Rev_Cmd[0]!=Addrp[0])||(BUS_Rev_Cmd[1]!=Addrp[1]))&&(BUS_Rev_Cmd[2]!=0x0E))
  248. {
  249. if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF))
  250. return;
  251. }
  252. //=======================================
  253. switch(BUS_Rev_Cmd[2])
  254. {
  255. case 0:
  256. break;
  257. case 1:
  258. break;
  259. case 2:
  260. break;
  261. case 3:
  262. break;
  263. case 4:
  264. break;
  265. case 5:
  266. break;
  267. case 6:
  268. break;
  269. case 7: // 取消命令
  270. Ledswitch=0; // 收到取消命令时关闭LED
  271. KEY0 = 0; // 重置紧急按钮状态
  272. break;
  273. case 8:
  274. break;
  275. case 9: // 切换到工作模式
  276. RunMode=1; // 设置为工作模式
  277. BUS_SendCnt=0; // 重置发送计数
  278. Bus_SendLength=26; // 设置发送长度
  279. break;
  280. case 13:
  281. BUS_SendCmd[0]=Addrp[0];
  282. BUS_SendCmd[1]=Addrp[1];
  283. BUS_SendCmd[2]=0x0D;
  284. BUS_SendData(3);
  285. break;
  286. case 14:
  287. if(BUS_Rev_Cmd[1]=='Y')
  288. {
  289. RunMode=1;
  290. Bus_SendLength=26;
  291. }
  292. else
  293. {
  294. RunMode=0;
  295. Bus_SendLength=146;
  296. }
  297. break;
  298. }
  299. Bus_RevFlag=0xFF;
  300. }
  301. void BUS_Rev_Tick(void)
  302. {
  303. static unsigned char i=0,j=0,k=0;
  304. if(BUS_RevIndex==26)
  305. {
  306. BUS_Rev_Cmd[0]=0;
  307. BUS_Rev_Cmd[1]=0;
  308. BUS_Rev_Cmd[2]=0;
  309. for(k=0;k<24;k++)
  310. {
  311. i=k / 8;
  312. j=k % 8;
  313. if ((BUS_RevBuf[k]>280)&&(BUS_RevBuf[k]<400))
  314. {
  315. BUS_Rev_Cmd[i]|=(1<<j);
  316. }
  317. }
  318. BUS_RevIndex=0;
  319. i=(BUS_Rev_Cmd[0]+ BUS_Rev_Cmd[1]+(BUS_Rev_Cmd[2]&0x0F))&0x0F;
  320. j=(BUS_Rev_Cmd[2]>>4)&0x0F;
  321. #ifdef RxTestDebug
  322. if(i==j)
  323. {
  324. BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F;
  325. BUS_RevData();
  326. } else {
  327. rxtestDebugcnt ++;
  328. if (rxtestDebugcnt > 10) //200ms,100s
  329. {
  330. Ledswitch=1;
  331. }
  332. }
  333. #else
  334. BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F;
  335. BUS_RevData();
  336. #endif
  337. }
  338. }
  339. //===================TIM4������������¼��ж���Ӧ����======================
  340. #pragma vector=0x19
  341. __interrupt void TIM4_UPD_OVF_IRQHandler(void)
  342. {
  343. __root static unsigned char flag=0;
  344. unsigned char i,j;
  345. TIM4_SR = 0; //��������¼��жϱ�־λUIF
  346. LocalTime++;
  347. // if(BUS_RevOverTime>0)BUS_RevOverTime--;
  348. //===================================
  349. if(flag>1)
  350. {
  351. TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9; //����Ϊ�͵�ƽ
  352. flag--;
  353. return;
  354. }
  355. else if(flag==1)
  356. {
  357. TIM1_CCER2_CC4E=0; //GPIOA->BRR = GPIO_Pin_9; //����Ϊ�ߵ�ƽ
  358. flag=0;
  359. return;
  360. }
  361. //===================================
  362. if((BUS_SendInex>0)&&(flag==0))
  363. {
  364. if(BUS_SendInex==1) //��ʼλ������5ms�͵�ƽ
  365. {
  366. flag=5;
  367. TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9;
  368. BUS_SendInex++;
  369. }
  370. else if(BUS_SendInex<Bus_SendLength)
  371. {
  372. i=(BUS_SendInex-2)/8;
  373. j=(BUS_SendInex-2)%8;
  374. if(((BUS_SendingCmd[i]>>j)&0x01)>0) //����λ1��2ms�͵�ƽ
  375. {
  376. flag=2;
  377. }
  378. else //����λ0��1ms�͵�ƽ
  379. {
  380. flag=1;
  381. }
  382. TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9;
  383. BUS_SendInex++;
  384. }
  385. else if(BUS_SendInex==Bus_SendLength)
  386. {
  387. flag=0;
  388. TIM1_CCER2_CC4E=1; //GPIOA->BSRR = GPIO_Pin_9;
  389. BUS_SendInex++;
  390. }
  391. else
  392. {
  393. TIM1_CCER2_CC4E=0;
  394. BUS_SendInex=0;
  395. flag=0;
  396. }
  397. }
  398. }
  399. //===================�ⲿIO�½����ж��¼��ж���Ӧ����=====================
  400. #pragma vector=0x07
  401. __interrupt void EXTI_PORTC_IRQHandler(void)
  402. {
  403. unsigned int i=0;
  404. //===========================================
  405. i=TIM2_CNTRH;
  406. i=(i<<8)+TIM2_CNTRL;
  407. //===========================================
  408. if(BUS_RevIndex==0)
  409. {
  410. //===========================================
  411. // BUS_RevOverTime=200; //����200ms��ʱ
  412. Bus_RevFlag=0; //������ձ�־λ
  413. //===========================================
  414. if((i>400)&&(i<750))
  415. {
  416. BUS_RevIndex=2;
  417. }
  418. else
  419. {
  420. BUS_RevIndex=0;
  421. }
  422. }
  423. else if(BUS_RevIndex==1)
  424. {
  425. if((i>400)&&(i<750))
  426. {
  427. BUS_RevIndex=2;
  428. }
  429. else
  430. {
  431. BUS_RevIndex=0;
  432. }
  433. }
  434. else if(BUS_RevIndex<26)
  435. {
  436. BUS_RevBuf[BUS_RevIndex-2]=i;
  437. BUS_RevIndex++;
  438. }
  439. //===========================================
  440. TIM2_CNTRH=0x00; //��ֵ
  441. TIM2_CNTRL=0x00;
  442. }
  443. void BUS_SendData(unsigned char Length)
  444. {
  445. unsigned char i=0,checksum=0;
  446. unsigned long timeout = LocalTime + 100; // 100ms超时
  447. //======================================================
  448. checksum=0;
  449. BUS_SendCmd[Length-1]&=0x0F;
  450. for(i=0;i<Length;i++)
  451. {
  452. checksum+=BUS_SendCmd[i];
  453. }
  454. BUS_SendCmd[Length-1]|=((checksum&0x0F)<<4);
  455. //======================================================
  456. // 等待之前的发送完成,带超时保护
  457. while(BUS_SendInex>0)
  458. {
  459. if(LocalTime > timeout)
  460. {
  461. BUS_SendInex = 0;
  462. break;
  463. }
  464. }
  465. // 只有在确保之前的发送已完成时才开始新的发送
  466. if(BUS_SendInex == 0)
  467. {
  468. for(i=0;i<Length;i++)
  469. {
  470. BUS_SendingCmd[i]=BUS_SendCmd[i];
  471. }
  472. BUS_SendInex=1;
  473. }
  474. }
  475. void TestCancelButtonWithMessage(void)
  476. {
  477. // 初始化 LED 引脚 (PD3)
  478. PD_DDR_DDR3 = 1; // 配置为输出
  479. PD_CR1_C13 = 1; // 推挽输出
  480. PD_ODR_ODR3 = 1; // 初始状态LED点亮
  481. // 初始化变量
  482. static unsigned long LedOnTime = 0; // LED开启时间记录
  483. // 初始化取消按键引脚 (PD4)
  484. PD_DDR_DDR4 = 0; // 配置为输入
  485. PD_CR1_C14 = 1; // 上拉输入
  486. PD_CR2_C24 = 0; // 禁用外部中断
  487. // 初始化通信相关变量
  488. BUS_SendInex = 0;
  489. unsigned char debounceCount = 0;
  490. unsigned char buttonState = 0;
  491. unsigned char messageSent = 0;
  492. unsigned int i;
  493. // 初始化时钟
  494. CLK_CKDIVR = 0x18; // 16M/8=2M
  495. // 初始化定时器4(用于LocalTime计数)
  496. TIM4_PSCR = 0x03; // 8分频
  497. TIM4_ARR = 0xF9; // 自动重装载值
  498. TIM4_IER = 0x01; // 使能更新中断
  499. TIM4_CNTR = 0xF9; // 计数器初值
  500. TIM4_CR1_CEN = 0x01; // 使能计数器
  501. // 初始化通信相关
  502. TIM1_PWM_Init(); // 初始化PWM用于通信
  503. // 使能中断
  504. asm("rim");
  505. while(1)
  506. {
  507. if(PD_IDR_IDR4 == 0) // 按键按下(低电平有效)
  508. {
  509. if(debounceCount < 50) // 消抖计数
  510. {
  511. debounceCount++;
  512. for(i=0; i<100; i++) // 简单延时
  513. {
  514. __asm("nop");
  515. }
  516. if(debounceCount >= 50 && !messageSent) // 消抖完成且消息未发送
  517. {
  518. // 1. 立即关闭LED
  519. PD_ODR_ODR3 = 0;
  520. // 2. 准备发送取消消息
  521. BUS_SendCmd[0] = 0x31; // DeviceAddr[0]
  522. BUS_SendCmd[1] = 0x08; // DeviceAddr[1]
  523. BUS_SendCmd[2] = 0x07; // 取消命令
  524. // 3. 发送消息
  525. BUS_SendData(3);
  526. buttonState = 1; // 记录按键已按下
  527. messageSent = 1; // 标记消息已发送
  528. }
  529. }
  530. }
  531. else // 按键松开
  532. {
  533. debounceCount = 0;
  534. if(buttonState == 1) // 如果之前按键是按下状态
  535. {
  536. buttonState = 0; // 清除按键状态
  537. messageSent = 0; // 重置消息发送标志
  538. }
  539. }
  540. // 处理取消按键
  541. if(KEY1==2) // 取消按键被按下且消抖完成
  542. {
  543. static unsigned long cancel_timeout = 0;
  544. // 1. 先执行本地操作
  545. Ledswitch = 0; // 立即关闭LED
  546. KEY1 = 1; // 设置为等待发送状态
  547. // 2. 等待通信就绪并发送取消命令
  548. if(BUS_SendInex == 0)
  549. {
  550. BUS_SendCmd[0]=Addrp[0];
  551. BUS_SendCmd[1]=Addrp[1];
  552. BUS_SendCmd[2]=0x07;
  553. BUS_SendData(3);
  554. // 3. 只有在成功发送后才重置状态
  555. KEY1 = 0; // 重置按键状态
  556. BUS_SendCnt = 0; // 清除发送计数
  557. cancel_timeout = 0; // 重置超时计数器
  558. }
  559. else
  560. {
  561. // 强制重置发送状态如果等待太久
  562. if(cancel_timeout == 0)
  563. {
  564. cancel_timeout = LocalTime + 50; // 50ms超时
  565. }
  566. else if(LocalTime > cancel_timeout)
  567. {
  568. BUS_SendInex = 0; // 强制重置发送状态
  569. cancel_timeout = 0; // 重置超时计数器
  570. }
  571. }
  572. }
  573. // 检查LED是否需要关闭(15秒后)
  574. if(Ledswitch == 2)
  575. {
  576. if((LocalTime - LedOnTime) >= 15000) // 15秒 = 15000ms
  577. {
  578. Ledswitch = 0; // 关闭LED
  579. }
  580. }
  581. }
  582. }
  583. int main(void)
  584. {
  585. static unsigned long KeySentTime=0;
  586. static unsigned long LedOnTime=0; // LED开启时间记录
  587. static unsigned char lastLedState = 0; // 记录LED上一次的状态
  588. unsigned char i;
  589. unsigned long TurnOnDelay=3600000;
  590. unsigned char TurnOnMode=0;
  591. //========================================================
  592. STM8_Init();
  593. GPIO_EXTI_Init();
  594. #ifndef tim2Led
  595. TIM2_Init();
  596. #endif
  597. GPIO_LED_Init();
  598. TIM4_1ms_Init();
  599. GPIO_KEY_Init();
  600. TIM1_PWM_Init();
  601. #ifdef tim2Led
  602. TIM2_PWM_Init();
  603. #endif
  604. SysVar_Init();
  605. //========================================================
  606. asm("rim"); // 开启中断
  607. while(1)
  608. {
  609. //====================================================
  610. BUS_Rev_Tick();
  611. GPIO_LED_Tick();
  612. GPIO_KEY_Tick();
  613. //===================================================
  614. if(RunMode==0) // 注册模式
  615. {
  616. // 保持LED常亮,直到收到命令9
  617. if(Ledswitch != 2)
  618. {
  619. Ledswitch = 2;
  620. }
  621. // 处理按键等其他逻辑
  622. if(KEY0==2) // 按键触发,发送注册信息
  623. {
  624. if(BUS_SendInex == 0) // 通信空闲
  625. {
  626. BUS_SendCmd[0]=Addrp[0];
  627. BUS_SendCmd[1]=Addrp[1];
  628. for(i=0;i<15;i++)
  629. {
  630. BUS_SendCmd[2+i]=DeviceSN[i];
  631. }
  632. BUS_SendCmd[17]=0x0E;
  633. BUS_SendData(18);
  634. KEY0 = 1; // 设置为等待确认状态
  635. }
  636. }
  637. }
  638. else
  639. {
  640. // 处理紧急按键
  641. if(KEY0==2) // 按键触发
  642. {
  643. // 立即设置LED状态(无论通信状态如何)
  644. if(Ledswitch != 2)
  645. {
  646. Ledswitch = 2;
  647. LedOnTime = LocalTime;
  648. }
  649. // 尝试发送命令
  650. if(BUS_SendInex == 0) // 通信空闲
  651. {
  652. // 发送紧急命令
  653. BUS_SendCmd[0]=Addrp[0];
  654. BUS_SendCmd[1]=Addrp[1];
  655. BUS_SendCmd[2]=0x0C;
  656. BUS_SendData(3);
  657. KEY0 = 1; // 设置为等待确认状态
  658. }
  659. }
  660. else if(KEY0 == 1) // 等待确认状态
  661. {
  662. if(BUS_SendInex == 0) // 如果发送完成
  663. {
  664. KEY0 = 2; // 继续保持触发状态,让LED持续亮
  665. }
  666. }
  667. // 处理取消按键
  668. if(KEY1==2) // 取消按键触发
  669. {
  670. static unsigned long cancel_timeout = 0;
  671. // 立即关闭LED
  672. Ledswitch = 0;
  673. KEY0 = 0; // 同时重置紧急按钮状态
  674. if(BUS_SendInex == 0) // 通信空闲
  675. {
  676. // 发送取消命令
  677. BUS_SendCmd[0]=Addrp[0];
  678. BUS_SendCmd[1]=Addrp[1];
  679. BUS_SendCmd[2]=0x07;
  680. BUS_SendData(3);
  681. KEY1 = 0; // 重置按键状态
  682. }
  683. else
  684. {
  685. if(cancel_timeout == 0)
  686. {
  687. cancel_timeout = LocalTime + 50; // 50ms超时
  688. }
  689. else if(LocalTime > cancel_timeout)
  690. {
  691. BUS_SendInex = 0; // 强制重置发送状态
  692. cancel_timeout = 0; // 重置超时计数器
  693. }
  694. }
  695. }
  696. // LED 15秒自动关闭
  697. if(Ledswitch == 2 && (LocalTime - LedOnTime) >= 15000)
  698. {
  699. Ledswitch = 0; // 关闭LED
  700. KEY0 = 0; // 重置按键状态
  701. }
  702. }
  703. }
  704. return 0;
  705. }