Files
r2_int_1/main.c
T
moyuhai 02f1638ef2 V1.0
2026-06-12 09:12:35 +08:00

587 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _MAIN_C_
#define _MAIN_C_
/*********************************************************************************************************************/
#include "ca51f5_config.h"
#include "includes\ca51f5sfr.h"
#include "includes\ca51f5xsfr.h"
#include "includes\gpiodef_f5.h"
#include "Library\includes\uart.h"
#include "Library\includes\system_clock.h"
#include "Library\Includes\tmc.h"
#include "includes\system.h"
#include "Library\includes\wdt.h"
/*********************************************************************************************************************/
#include "TS_Lib\Includes\ts_configuration.h"
#include "TS_Lib\Includes\ts_def.h"
#include "TS_Lib\Includes\ts_api.h"
#include "TS_Lib\Includes\ts_service.h"
#include "rf_send.h"
#include "Library\Includes\delay.h"
#define INT_TIME 100 //定时时间,单位为us
#define TH_VAL (unsigned char)((0x2000 - (INT_TIME*(FOSC/1000))/12000)>>5)
#define TL_VAL (unsigned char)(0x2000 - (INT_TIME*(FOSC/1000))/12000)&0x1F
unsigned char flagSend = 0;
unsigned char valueSend = 0;
unsigned char flagStart = 0;
void Delay_ms(unsigned int n);
void TIMER0_ISR (void) interrupt 1 //每100us产生中断
{
TH0 = TH_VAL;
TL0 = TL_VAL;
Send433_Byte();
}
/*********************************************************************************************************************/
/*******************************************************************************************************************************************
说明:
------------------------------------------------------------------------------------------------------------
1.ts_configuration.h是触摸的配置文件,可在配置文件中设置触摸通道、灵敏度等。详见ts_configuration.h中的说明。
------------------------------------------------------------------------------------------------------------
2.如果需要使用UART来调试,可在ca51f5_config.h中打开宏定义UART0_EN
------------------------------------------------------------------------------------------------------------
3.触摸库对外的数据接口为KeysFlagSN,用户可根据KeysFlagSN的值来判断触摸键是否按下(如果触摸键按下,KeysFlagSN
的对应位一直为1,触摸键松开,对应位变为0),TS_Key是根据KeysFlagSN的值生成的按键消息,用户如不使用可忽略。
------------------------------------------------------------------------------------------------------------
4.使能了触摸省电模式后,在无按键时,在定义的时间后会进入省电模式,进入省电模式前会关闭TMC中断和触摸中断(注意,总
中断仍是开启的),在触摸省电模式下,CPU会进入STOP模式,在被触摸唤醒后,程序在省电函数(TS_EnterSleepMode)的循环内运行(注意,触摸省电模式程序不
会在主循环内运行),在触摸省电模式下如果还要响应其他中断,用户需在进入触摸省电模式前自行开启其他中断,
如果需要退出省电模式,用户只需要在省电函数循环内加入条件判断,跳出循环即可。
变量TS_SleepEn是控制触摸省电模式的开关,如果希望程序在某些条件下不进入省电模式,只需在此条件下设置TS_SleepEn = 0
------------------------------------------------------------------------------------------------------------
5.触摸外挂电容(即TK_CAP引脚连接电容)范围:6nF~50nF,建议值:20nF(即203
------------------------------------------------------------------------------------------------------------
6.触摸引脚串联电阻范围:0~5K,建议值:1K欧姆,如果有抗对讲机等电磁干扰要求, 此电阻至少3K以上。
*******************************************************************************************************************************************/
unsigned long int Read_32bit_UID(void)
{
unsigned long int ID;
FSCMD = 0x80;
PTSH = 0x00;
PTSL = 0x00;
FSCMD = 0x81;
ID = FSDAT;
ID *= 256;
ID |= FSDAT;
ID *= 256;
ID |= FSDAT;
ID *= 256;
ID |= FSDAT;
FSCMD = 0;
return ID;
}
code unsigned char rf_data[255]=
{
0 ,
1 ,
2 ,
3 ,
4 ,
5 ,
6 ,
7 ,
8 ,
9 ,
10 ,
11 ,
12 ,
13 ,
16 ,
16 ,
16 ,
17 ,
18 ,
18 ,
19 ,
20 ,
21 ,
22 ,
23 ,
24 ,
25 ,
26 ,
27 ,
28 ,
29 ,
30 ,
31 ,
32 ,
33 ,
34 ,
35 ,
36 ,
37 ,
37 ,
38 ,
39 ,
40 ,
41 ,
42 ,
43 ,
44 ,
45 ,
46 ,
47 ,
48 ,
49 ,
50 ,
51 ,
52 ,
53 ,
54 ,
55 ,
56 ,
56 ,
57 ,
58 ,
59 ,
60 ,
61 ,
62 ,
63 ,
64 ,
65 ,
66 ,
67 ,
68 ,
69 ,
70 ,
71 ,
72 ,
73 ,
74 ,
74 ,
75 ,
76 ,
77 ,
78 ,
79 ,
80 ,
81 ,
82 ,
83 ,
84 ,
85 ,
86 ,
87 ,
88 ,
89 ,
90 ,
91 ,
92 ,
93 ,
93 ,
94 ,
95 ,
96 ,
97 ,
98 ,
99 ,
100 ,
101 ,
102 ,
103 ,
104 ,
105 ,
106 ,
107 ,
108 ,
109 ,
110 ,
111 ,
112 ,
112 ,
113 ,
114 ,
115 ,
116 ,
117 ,
118 ,
119 ,
120 ,
121 ,
122 ,
123 ,
124 ,
125 ,
126 ,
127 ,
128 ,
129 ,
130 ,
130 ,
131 ,
132 ,
133 ,
134 ,
135 ,
136 ,
137 ,
138 ,
139 ,
140 ,
141 ,
142 ,
143 ,
144 ,
145 ,
146 ,
147 ,
148 ,
149 ,
149 ,
150 ,
151 ,
152 ,
153 ,
154 ,
155 ,
156 ,
157 ,
158 ,
159 ,
160 ,
161 ,
162 ,
163 ,
164 ,
165 ,
166 ,
167 ,
168 ,
168 ,
169 ,
170 ,
171 ,
172 ,
173 ,
174 ,
175 ,
176 ,
177 ,
178 ,
179 ,
180 ,
181 ,
182 ,
183 ,
184 ,
185 ,
186 ,
186 ,
187 ,
188 ,
189 ,
190 ,
191 ,
192 ,
193 ,
194 ,
195 ,
196 ,
197 ,
198 ,
199 ,
200 ,
201 ,
202 ,
203 ,
204 ,
205 ,
205 ,
206 ,
207 ,
208 ,
209 ,
210 ,
211 ,
212 ,
213 ,
214 ,
215 ,
216 ,
217 ,
218 ,
219 ,
220 ,
221 ,
222 ,
223 ,
224 ,
224 ,
225 ,
226 ,
227 ,
228 ,
229 ,
230 ,
231 ,
232 ,
233 ,
234 ,
235 ,
236 ,
237 ,
238 ,
239 ,
239,
};
void main(void)
{
unsigned long int addr=0;
unsigned char send_times = 0;
#ifdef LVD_RST_ENABLE
LVDCON = 0xE3; //设置LVD复位电压为2.0V
#endif
#ifdef UART0_EN
Uart0_Initial(UART0_BAUTRATE);
#endif
//看门狗时钟源为IRCL
CKCON |= ILCKE; //使能IRCL
WDCON = WDTS(WDTS_IRCL) | WDRE(WDRE_reset); //设置看门狗时钟源为ILCKE,模式为复位模式
WDVTHH = 0; //看门狗复位阈值高八位设置 当前值为5s
WDVTHL = 75; //看门狗复位阈值低八位设置
WDFLG = 0xA5;
EA = 1;
TS_init();
P07F = OUTPUT; //P00设置为推挽输出模式
P07=0;
addr = (unsigned int)Read_32bit_UID(); //获取遥控ID
D0 = (unsigned char)(addr >> 8);
D1 = (unsigned char)(addr);
Yaokong_Data[0] = D1;
Yaokong_Data[1] = D0;
TMOD = (TMOD&0xFC)|0x00; //模式选择: 定时器0,模式0。
TH0 = TH_VAL; //高8位装初值
TL0 = TL_VAL; //低8位装初值
TR0 = 1; //定时器0使能
ET0 = 1; //定时器0中断使能
PT0 = 0; //设置定时器0中断优先级为低优先级
while(1)
{
TS_Action();
if(WheelSliderPosition == -1)
{
flagStart = 1;
}
if(WheelSliderPosition != -1&&KeysFlagSN==0)
{
flagSend = 1;
flagStart = 0;
send_times = 1;
//当WheelSliderPosition不等于-1时, 表示滑条或圆环有触摸事件发生。WheelSliderPosition的值表示滑条或圆环的位置。
valueSend=rf_data[ WheelSliderPosition];//0-240
valueSend=239-valueSend;
valueSend +=16;//15-255//色环出现问题颜色需要校准
}
if(KeysFlagSN != 0)
{
flagSend = 1;
flagStart=0;
send_times = 3;
switch(KeysFlagSN)
{
case 0x0001://TK4亮度++
valueSend = 0x08;
break;
case 0x0002://TK5//亮度--
valueSend = 0X0D;
break;
case 0x0004://TK7//。功能--
valueSend = 0X0E;
break;
case 0x0008://TK9//off
valueSend = 0X04;
break;
case 0x0010://TK10//。功能++
valueSend = 0X06;
break;
case 0x0020://TK12//on
valueSend = 0X02;
break;
default:
flagSend = 0;
break;
}
}
if(WheelSliderPosition == -1)
{
flagStart = 1;
}
#if GENERATE_TS_KEY_EN
/*************************************************************************************************
变量TS_Key是根据KeysFlagSN得到的按键信息,以下为按键产生的过程:
|-----------------------------------------------------------------------------------------------------------------------------------|
| 单键:以K1为例,K1按键产生的流程如下所示: |
| |
| |---> K1|KEY_BREAK(短按松开) |
| K1(按下)--| |
| |---> K1|KEY_LONG_START(长按大约1秒)---> K1|KEY_LONG(一直长按,约每300ms产生一次长按键)---->K1|KEY_LONG_BREAK(长按松开) |
| ^ | |
| | | |
| |----------<-----------<------------<--------------| |
|-----------------------------------------------------------------------------------------------------------------------------------|
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| |
| 复合键:以K1(K1=0x0001),K2(K2=0x0002)为例, 当K1K2同时按下时,产生按键为(K1<<5)|K2,即0x22, 产生按键的流程如下所示: |
| |
| |---> ((K1<<5)|K2)|KEY_BREAK(短按松开) |
| (K1<<5)|K2(按下)--| |
| |---> ((K1<<5)|K2)|KEY_LONG_START(长按大约1秒)---> ((K1<<5)|K2)|KEY_LONG(一直长按,约每300ms产生长按键)---->((K1<<5)|K2)|KEY_LONG_BREAK(长按松开) |
| ^ | |
| | | |
| |---------<-------------<----------------<----------------| |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
注意:由于复合键按下时,软件不一定同时检测到双键,而是先检测到单键按下,例如先检测到K1,此时会先产生K1键,等到检测到K2也按
下时,才会产生按键(K1<<5)|K2,检测到双键后,如果双键一直按下,会产生((K1<<5)|K2)|KEY_LONG_START和((K1<<5)|K2)|KEY_LONG,如果
有一个键先松手,会停止产生按键, 等到双键都松开时,才会产生((K1<<5)|K2)|KEY_BREAK(短按松开)或((K1<<5)|K2)|KEY_LONG_BREAK(长按松开)
*************************************************************************************************/
if(TS_Key != 0)
{
switch(TS_Key)
{
//单按键消息
case K1:
// valueSend = 0x05; //K1短按产生的按键消息
break;
case (K1|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K1|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K1|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K1|KEY_LONG_BREAK): longPressFlag=0;//K1长按松手产生的消息
break;
//单按键消息
case K2: //K1短按产生的按键消息
// valueSend = 0x0c;
break;
case (K2|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K2|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K2|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K2|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
case K3: //K1短按产生的按键消息
// valueSend = 0x0a;
break;
case (K3|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K3|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K3|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K3|KEY_LONG_BREAK): longPressFlag=0;///K1长按松手产生的消息
break;
//单按键消息
case K4: //K1短按产生的按键消息
// valueSend = 0x0b;
break;
case (K4|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
flagStart = 1;
break;
case (K4|KEY_LONG_START):longPressFlag=1; //K1长按开始产生的消息(长按约1秒时产生)
valueSend = 0x0b;
flagStart = 1;
break;
case (K4|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
valueSend = 0x0b;
flagStart = 1;
break;
case (K4|KEY_LONG_BREAK):longPressFlag=0;//K1长按松手产生的消息
break;
//单按键消息
case K5: //K1短按产生的按键消息
// valueSend = 0x09;
break;
case (K5|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K5|KEY_LONG_START):longPressFlag=1; //K1长按开始产生的消息(长按约1秒时产生)
break;
case (K5|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K5|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
case K6: //K1短按产生的按键消息
// valueSend = 0x07;
break;
case (K6|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K6|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K6|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K6|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
#if GENERATE_DOUBLE_KEY_EN
//复合键消息
// case (K1<<5)|K2: //K1和K2同时按下时产生的按键消息
// break;
// case ((K1<<5)|K2)|KEY_BREAK: //K1和K2短按松手产生的按键消息
// break;
// case ((K1<<5)|K2)|KEY_LONG_START: //K1和K2长按开始产生的按键消息(长按约1秒时产生)
// break;
// case ((K1<<5)|K2)|KEY_LONG: //K1和K2长按产生的消息(每隔约300ms产生一次)
// break;
// case ((K1<<5)|K2)|KEY_LONG_BREAK: //K1和K2长按松手产生的消息
// break;
#endif
}
}
#endif
if(flagSend==1)//短按
{
EA=0;RF_Time=0;
flagSend = 0;
RF_Time=0;
TR0 = 1; //定时器0使能
EA=0;
Yaokong_Data[2] = valueSend;
EA=1;
}
}
}
#endif