アナログポート から スイッチを3つ認識するライブラリです。 6つのアナログポートを同時に認識して、18個のSWまで認識できます。
Dependents: kitchenTimer LPC1114FN28_kitchenTimer_Clock
SwAnalog.cpp
00001 //====================================================================== 00002 // SwAnalog.cpp 00003 // 00004 // 00005 //====================================================================== 00006 #define _SWANALOG_C 00007 00008 #include "mbed.h" 00009 #include "SwAnalog.h" 00010 00011 //====================================================================== 00012 // syokika 00013 //====================================================================== 00014 00015 #ifdef LPC1768 00016 SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4, 00017 PinName adinput5 00018 ): 00019 _adinput0(adinput0), _adinput1(adinput1), _adinput2(adinput2), _adinput3(adinput3), _adinput4(adinput4), 00020 _adinput5(adinput5) 00021 { 00022 00023 //--------------------------------- 00024 // touroku sareta Sw Suu wo kakunin 00025 //--------------------------------- 00026 if(adinput0 != NC){D_swPinSuu = 1;} 00027 if(adinput1 != NC){D_swPinSuu = 2;} 00028 if(adinput2 != NC){D_swPinSuu = 3;} 00029 if(adinput3 != NC){D_swPinSuu = 4;} 00030 if(adinput4 != NC){D_swPinSuu = 5;} 00031 00032 if(adinput5 != NC){D_swPinSuu = 6;} 00033 00034 00035 // sw ninsiki syuki 10[ms] 00036 // swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 00037 00038 } 00039 #else // ~LPC1768 00040 SwAnalog::SwAnalog(PinName adinput0, PinName adinput1 00041 ): 00042 _adinput0(adinput0), _adinput1(adinput1) 00043 { 00044 00045 //--------------------------------- 00046 // touroku sareta Sw Suu wo kakunin 00047 //--------------------------------- 00048 if(adinput0 != NC){D_swPinSuu = 1;} 00049 if(adinput1 != NC){D_swPinSuu = 2;} 00050 00051 00052 // sw ninsiki syuki 10[ms] 00053 swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 00054 00055 } 00056 #endif // LPC1768 00057 00058 //================================================= 00059 // analog input data wo sw data ni henkan 00060 //================================================= 00061 void SwAnalog::adInput(float ad, uint8_t swPinSuu){ 00062 uint8_t ans = 0; // SW ninsikichi 2bit = sw2, 1bit = sw1, 0bit = sw0 0:OFF 1:ON 00063 00064 00065 // ad ninsikich kara sw jotai wo kakutei 00066 00067 if (ad <= Z_threshold0_1){ans = 0;} 00068 else if(ad <= Z_threshold1_2){ans = 1;} 00069 else if(ad <= Z_threshold2_3){ans = 2;} 00070 else if(ad <= Z_threshold3_4){ans = 3;} 00071 else if(ad <= Z_threshold4_5){ans = 4;} 00072 else if(ad <= Z_threshold5_6){ans = 5;} 00073 else if(ad <= Z_threshold6_7){ans = 6;} 00074 else {ans = 7;} 00075 00076 00077 B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) | (ans & 0x01) ); 00078 B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1)); 00079 B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2)); 00080 } 00081 00082 //========================================== 00083 // subeteno analog input port no sw ninsiki 00084 //========================================== 00085 void SwAnalog::input(void){ 00086 // genzai level input 00087 switch(D_swPinSuu){ 00088 #ifdef LPC1768 00089 case 6: 00090 adInput(_adinput5, 5); 00091 //break; 00092 case 5: 00093 adInput(_adinput4, 4); 00094 //break; 00095 case 4: 00096 adInput(_adinput3, 3); 00097 //break; 00098 case 3: 00099 adInput(_adinput2, 2); 00100 //break; 00101 #endif // LPC1768 00102 case 2: 00103 adInput(_adinput1, 1); 00104 //break; 00105 case 1: 00106 adInput(_adinput0, 0); 00107 //break; 00108 default: 00109 // nothing 00110 break; 00111 } 00112 00113 // kakutei Level kosin 00114 uint8_t kakutei = 0; 00115 for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){ 00116 for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){ 00117 uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern; 00118 if(work == 0x00){ 00119 // off kakutei 00120 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo]; 00121 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff; 00122 kakutei = 1; 00123 } 00124 else if(work == Z_itchiPattern){ 00125 // on kakutei 00126 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo]; 00127 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn; 00128 kakutei = 1; 00129 } 00130 else{ 00131 // nothing 00132 } 00133 00134 if(kakutei == 1){ 00135 // edge kosin 00136 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){ 00137 B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri; 00138 } 00139 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){ 00140 B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri; 00141 } 00142 } 00143 } 00144 } 00145 } 00146 00147 //======================================== 00148 // sw no ninsiki level ,edge data no kosin 00149 //======================================== 00150 void SwAnalog::refreshEdgeData(void){ 00151 for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){ 00152 for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){ 00153 __disable_irq(); // Disable Interrupts 00154 D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo]; 00155 D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo]; 00156 00157 B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi; 00158 B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi; 00159 __enable_irq(); // Enable Interrupts 00160 } 00161 } 00162 } 00163 00164 //=============================== 00165 // sw no Off to On edge hantei 00166 //=============================== 00167 uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){ 00168 uint8_t ans = 0; 00169 00170 if(D_edgeOn[swNo] == Z_edgeAri){ 00171 ans = 1; 00172 } 00173 00174 return (ans); 00175 } 00176 00177 //=============================== 00178 // sw no On to Off edge hantei 00179 //=============================== 00180 uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){ 00181 uint8_t ans = 0; 00182 00183 if(D_edgeOff[swNo] == Z_edgeAri){ 00184 ans = 1; 00185 } 00186 00187 return (ans); 00188 } 00189 00190 //============================== 00191 // sw no ninsiki level hantei 00192 //============================== 00193 uint8_t SwAnalog::checkLevel(uint8_t swNo){ 00194 uint8_t ans = 0; 00195 00196 if(D_nowLevel[swNo] == Z_levelOn){ 00197 ans = 1; 00198 } 00199 00200 return (ans); 00201 } 00202
Generated on Thu Jul 14 2022 06:26:58 by 1.7.2