#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)为例, 当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; //单按键消息 #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