This commit is contained in:
moyuhai
2026-06-12 09:12:35 +08:00
commit 02f1638ef2
91 changed files with 38366 additions and 0 deletions
+586
View File
@@ -0,0 +1,586 @@
#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