613 lines
15 KiB
C
613 lines
15 KiB
C
#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 ,
|
||
14 ,
|
||
15 ,
|
||
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,
|
||
240,
|
||
240,
|
||
};
|
||
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();
|
||
|
||
P32F = OUTPUT; //P00设置为推挽输出模式
|
||
P32=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 = 0; //定时器0使能
|
||
ET0 = 1; //定时器0中断使能
|
||
PT0 = 0; //设置定时器0中断优先级为低优先级
|
||
|
||
while(1)
|
||
{
|
||
TS_Action();
|
||
if(WheelSliderPosition != -1)
|
||
{
|
||
flagSend = 1;
|
||
flagStart = 0;
|
||
//当WheelSliderPosition不等于-1时, 表示滑条或圆环有触摸事件发生。WheelSliderPosition的值表示滑条或圆环的位置。
|
||
send_times = 1;
|
||
valueSend=rf_data[ WheelSliderPosition];//0-240
|
||
valueSend += 15;//15-255
|
||
}
|
||
|
||
if(KeysFlagSN != 0)
|
||
{
|
||
flagSend = 1;
|
||
flagStart = 0;
|
||
switch(KeysFlagSN)
|
||
{
|
||
case 0x0001:
|
||
valueSend = 0x05;
|
||
break;
|
||
case 0x0002:
|
||
valueSend = 0x0c;
|
||
break;
|
||
case 0x0004:
|
||
valueSend = 0x0a;
|
||
break;
|
||
case 0x0008:
|
||
valueSend = 0x0b;
|
||
break;
|
||
case 0x0010:
|
||
valueSend = 0x09;
|
||
break;
|
||
case 0x0020:
|
||
valueSend = 0x07;
|
||
break;
|
||
case 0x0040:
|
||
valueSend = 0x03;
|
||
break;
|
||
case 0x0080:
|
||
valueSend = 0x01;
|
||
break;
|
||
default:
|
||
flagSend = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(WheelSliderPosition == -1&&KeysFlagSN == 0)
|
||
{
|
||
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)为例, 当K1,K2同时按下时,产生按键为(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;
|
||
//单按键消息
|
||
case K7: //K1短按产生的按键消息
|
||
// valueSend = 0x03;
|
||
break;
|
||
case (K7|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
|
||
break;
|
||
case (K7|KEY_LONG_START):longPressFlag=1; //K1长按开始产生的消息(长按约1秒时产生)
|
||
break;
|
||
case (K7|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
|
||
break;
|
||
case (K7|KEY_LONG_BREAK): longPressFlag=0;//K1长按松手产生的消息
|
||
break;
|
||
//单按键消息
|
||
case K8: //K1短按产生的按键消息
|
||
// valueSend = 0x01;
|
||
break;
|
||
case (K8|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
|
||
break;
|
||
case (K8|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
|
||
break;
|
||
case (K8|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
|
||
break;
|
||
case (K8|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)//短按
|
||
{
|
||
flagSend = 0;
|
||
// flagStart = 1;
|
||
//
|
||
// RF_send(send_times);
|
||
TR0 = 1; //定时器0使能
|
||
Yaokong_Data[2] = valueSend;
|
||
}
|
||
|
||
}
|
||
}
|
||
#endif
|