PCM Digital Synthesizer

Dependencies:   LCD mbed

/media/uploads/p_igmon/img_1731-w480.jpg

Committer:
p_igmon
Date:
Fri Sep 02 13:24:16 2016 +0000
Revision:
0:ad6637c36dc7
for Micro Gen4 Synthesizer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p_igmon 0:ad6637c36dc7 1 #include "synthesizer.h"
p_igmon 0:ad6637c36dc7 2
p_igmon 0:ad6637c36dc7 3 Serial pc(SERIAL_TX, SERIAL_RX);
p_igmon 0:ad6637c36dc7 4 //RawSerial pc(SERIAL_TX, SERIAL_RX);
p_igmon 0:ad6637c36dc7 5 RawSerial midi(PB_6, PB_7); // tx, rx USART1 when use I2C_LCD
p_igmon 0:ad6637c36dc7 6
p_igmon 0:ad6637c36dc7 7 LCD lcd(PB_9,PB_8);
p_igmon 0:ad6637c36dc7 8 DigitalOut myled(LED1);
p_igmon 0:ad6637c36dc7 9 DigitalOut generating(PC_10);
p_igmon 0:ad6637c36dc7 10
p_igmon 0:ad6637c36dc7 11 DigitalIn SW1(PC_0,PullUp);
p_igmon 0:ad6637c36dc7 12 DigitalIn SW2(PC_1,PullUp);
p_igmon 0:ad6637c36dc7 13 DigitalIn SW3(PC_2,PullUp);
p_igmon 0:ad6637c36dc7 14 DigitalIn SW4(PC_3,PullUp);
p_igmon 0:ad6637c36dc7 15 DigitalIn SW5(PA_0,PullUp);
p_igmon 0:ad6637c36dc7 16 DigitalIn SW6(PA_1,PullUp);
p_igmon 0:ad6637c36dc7 17 DigitalIn SW7(PB_0,PullUp);
p_igmon 0:ad6637c36dc7 18 DigitalIn SW8(PC_12,PullUp);
p_igmon 0:ad6637c36dc7 19
p_igmon 0:ad6637c36dc7 20
p_igmon 0:ad6637c36dc7 21 STR_VOICE voice[VOICEMAX];
p_igmon 0:ad6637c36dc7 22 GENERATOR sgen[PRGGENMAX * 64];
p_igmon 0:ad6637c36dc7 23 GENERATOR dgen[PRGGENMAX * VOICEMAX];
p_igmon 0:ad6637c36dc7 24 GENERATOR_TEMP dgen_temp[PRGGENMAX * VOICEMAX];
p_igmon 0:ad6637c36dc7 25
p_igmon 0:ad6637c36dc7 26 STR_VOICE *voice_ptr = &voice[0];
p_igmon 0:ad6637c36dc7 27 GENERATOR *gen ;// = &sgen[PresetVoiceNum - 1] set by Menu PresetVoice
p_igmon 0:ad6637c36dc7 28 GENERATOR *pgen = &dgen[0];
p_igmon 0:ad6637c36dc7 29 GENERATOR_TEMP *pgen_temp = &dgen_temp[0];
p_igmon 0:ad6637c36dc7 30
p_igmon 0:ad6637c36dc7 31 KeyState_TypeDef keystate;
p_igmon 0:ad6637c36dc7 32
p_igmon 0:ad6637c36dc7 33 #ifdef REVERVE16BIT
p_igmon 0:ad6637c36dc7 34 extern S16 reverve_buf[22000];
p_igmon 0:ad6637c36dc7 35 extern S16 *reverve_wtemp;
p_igmon 0:ad6637c36dc7 36 #else
p_igmon 0:ad6637c36dc7 37 extern S8 reverve_buf[44000];
p_igmon 0:ad6637c36dc7 38 extern S8 *reverve_wtemp;
p_igmon 0:ad6637c36dc7 39 #endif
p_igmon 0:ad6637c36dc7 40
p_igmon 0:ad6637c36dc7 41
p_igmon 0:ad6637c36dc7 42 extern uint8_t com[16];
p_igmon 0:ad6637c36dc7 43 extern uint8_t *com_ptr;
p_igmon 0:ad6637c36dc7 44
p_igmon 0:ad6637c36dc7 45 volatile int TimerCount10mS;
p_igmon 0:ad6637c36dc7 46 volatile int KeyValDiv;
p_igmon 0:ad6637c36dc7 47
p_igmon 0:ad6637c36dc7 48 U32 PresetVoiceAmount;
p_igmon 0:ad6637c36dc7 49 U32 SGenAmount;
p_igmon 0:ad6637c36dc7 50
p_igmon 0:ad6637c36dc7 51 int menu_index;
p_igmon 0:ad6637c36dc7 52 volatile U8 key;
p_igmon 0:ad6637c36dc7 53
p_igmon 0:ad6637c36dc7 54 extern int gen_encount;
p_igmon 0:ad6637c36dc7 55 extern U8 PresetVoiceNum;
p_igmon 0:ad6637c36dc7 56 extern U8 MidiChannel;
p_igmon 0:ad6637c36dc7 57 extern U16 MasterVolume;
p_igmon 0:ad6637c36dc7 58 extern S8 MasterTune;
p_igmon 0:ad6637c36dc7 59 extern U8 midi_base_ch;
p_igmon 0:ad6637c36dc7 60 extern char lcd_string[];
p_igmon 0:ad6637c36dc7 61 extern char str[];
p_igmon 0:ad6637c36dc7 62
p_igmon 0:ad6637c36dc7 63 extern U8 selectsw;
p_igmon 0:ad6637c36dc7 64 extern MenuListDef MenuList[];
p_igmon 0:ad6637c36dc7 65 extern int rch_pol;
p_igmon 0:ad6637c36dc7 66
p_igmon 0:ad6637c36dc7 67 extern volatile U8 *midi_rdptr;
p_igmon 0:ad6637c36dc7 68 extern volatile U8 *midi_wrptr;
p_igmon 0:ad6637c36dc7 69 extern volatile U8 midi_receivebuf[];
p_igmon 0:ad6637c36dc7 70
p_igmon 0:ad6637c36dc7 71 extern volatile U8 *param_wrptr;
p_igmon 0:ad6637c36dc7 72 extern volatile U8 param_receivebuf[PARAM_BUFSIZE];
p_igmon 0:ad6637c36dc7 73
p_igmon 0:ad6637c36dc7 74 extern S16 * DMA_Buffer;
p_igmon 0:ad6637c36dc7 75 extern __IO BUFFER_StateTypeDef BufferOffset;
p_igmon 0:ad6637c36dc7 76
p_igmon 0:ad6637c36dc7 77 WaveDef Wave[100];// ={
p_igmon 0:ad6637c36dc7 78 #if 0
p_igmon 0:ad6637c36dc7 79 /*Name[16] ,startadr ,p1 ,p2 ,cycle */
p_igmon 0:ad6637c36dc7 80 {"SineWave" ,0 ,50 ,150 ,0},
p_igmon 0:ad6637c36dc7 81 {"SawWave" ,0 ,100 ,200 ,0},
p_igmon 0:ad6637c36dc7 82 {"Saw1kWave" ,0 ,1 ,101 ,0},
p_igmon 0:ad6637c36dc7 83 {"SquareWave" ,0 ,50 ,150 ,0},
p_igmon 0:ad6637c36dc7 84 {"Square4QWave" ,0 ,1 ,101 ,0},
p_igmon 0:ad6637c36dc7 85 {"Square8QWave" ,0 ,1 ,101 ,0},
p_igmon 0:ad6637c36dc7 86 {"Sin124Wave" ,0 ,1 ,101 ,0},
p_igmon 0:ad6637c36dc7 87 {"Sin13Wave" ,0 ,1 ,43 ,0},
p_igmon 0:ad6637c36dc7 88 {"fluto" ,0 ,1 ,68 ,0},
p_igmon 0:ad6637c36dc7 89 {"EnglishHorn" ,0 ,3030 ,3142 ,0},
p_igmon 0:ad6637c36dc7 90 {"FrenchHorn" ,0 ,3033 ,3132 ,0},
p_igmon 0:ad6637c36dc7 91 {"1278_trumpet" ,0 ,9089 ,9200 ,0},
p_igmon 0:ad6637c36dc7 92 {"1507_trumpet" ,0 ,6612 ,6718 ,0},
p_igmon 0:ad6637c36dc7 93 {"BrassP-C6" ,0 ,2965 ,3133 ,0},
p_igmon 0:ad6637c36dc7 94 {"Trombone" ,0 ,6852 ,6991 ,0},
p_igmon 0:ad6637c36dc7 95 {"Tuba_Loud" ,0 ,12686 ,13088 ,0},
p_igmon 0:ad6637c36dc7 96 {"2524_cello" ,0 ,8683 ,9157 ,0},
p_igmon 0:ad6637c36dc7 97 {"Contrabassoon" ,0 ,5004 ,5759 ,0},
p_igmon 0:ad6637c36dc7 98 {"Base-Elec" ,0 ,17400 ,17934 ,0},
p_igmon 0:ad6637c36dc7 99 {"EFEKTOharp" ,0 ,9423 ,9522 ,0},
p_igmon 0:ad6637c36dc7 100 {"Harpsicord" ,0 ,21595 ,21764 ,0},
p_igmon 0:ad6637c36dc7 101 {"Glockenspie" ,0 ,3886 ,3911 ,0},
p_igmon 0:ad6637c36dc7 102 {"Xylofon" ,0 ,1126 ,1150 ,0},
p_igmon 0:ad6637c36dc7 103 {"Acoustic Guitar" ,0 ,11422 ,11622 ,0},
p_igmon 0:ad6637c36dc7 104 {"Piano" ,0 ,6699 ,6783 ,0},
p_igmon 0:ad6637c36dc7 105 {"Piano 5" ,0 ,13937 ,14335 ,0},
p_igmon 0:ad6637c36dc7 106 {"Piano 10" ,0 ,11837 ,12005 ,0},
p_igmon 0:ad6637c36dc7 107 {"VIOLIN1" ,0 ,1 ,56 ,0},
p_igmon 0:ad6637c36dc7 108 {"Strings" ,0 ,3606 ,37992 ,84},
p_igmon 0:ad6637c36dc7 109 };
p_igmon 0:ad6637c36dc7 110 #endif
p_igmon 0:ad6637c36dc7 111
p_igmon 0:ad6637c36dc7 112 PresetVoiceDef PresetVoice[65];//={
p_igmon 0:ad6637c36dc7 113 #if 0
p_igmon 0:ad6637c36dc7 114 /*Name[16] ,DCF Freq ,Q ,FreqEnv ,QEnv */
p_igmon 0:ad6637c36dc7 115 {"Piano " ,30 ,0 ,0 ,0},// 1
p_igmon 0:ad6637c36dc7 116 {"Piano 5" ,30 ,0 ,0 ,0},//
p_igmon 0:ad6637c36dc7 117 {"Piano 10" ,30 ,0 ,0 ,0},//
p_igmon 0:ad6637c36dc7 118 {"Electo Piano" ,30 ,0 ,0 ,0},//
p_igmon 0:ad6637c36dc7 119 {"Organ 1" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 120 {"Organ 2" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 121 {"Organ 2B" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 122 {"Synth Strings 1" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 123 {"Strings 1" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 124 {"Synthe Brass" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 125 {"Brass 1" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 126 {"Brass 2" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 127 {"EnglishHorn" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 128 {"Trb" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 129 {"Tuba" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 130 {"Harp" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 131 {"Harpsicord" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 132 {"Gloccken" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 133 {"Xylofon" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 134 {"Fluto" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 135 {"ContraBass" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 136 {"Chello&ContBass" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 137 {"Acoustic Guitar" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 138 {"Bass" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 139 {"Bass 2" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 140 {"User 1" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 141 {"User 2" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 142 {"User 3" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 143 {"User 4" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 144 {"User 5" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 145 {"User 6" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 146 {"User 7" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 147 {"User 8" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 148 {"User 9" ,30 ,0 ,0 ,0},
p_igmon 0:ad6637c36dc7 149 {"User 10" ,30 ,0 ,0 ,0}
p_igmon 0:ad6637c36dc7 150 };
p_igmon 0:ad6637c36dc7 151 #endif
p_igmon 0:ad6637c36dc7 152
p_igmon 0:ad6637c36dc7 153 void my_inthandler(void){
p_igmon 0:ad6637c36dc7 154 while (USART1->SR & (1<<5)){ // RXNE 1: Received data is ready to be read.
p_igmon 0:ad6637c36dc7 155 *midi_wrptr = (uint8_t)(USART1->DR & 0xFF);
p_igmon 0:ad6637c36dc7 156 if (++midi_wrptr >&midi_receivebuf[255]) midi_wrptr = &midi_receivebuf[0];//
p_igmon 0:ad6637c36dc7 157 }
p_igmon 0:ad6637c36dc7 158 }
p_igmon 0:ad6637c36dc7 159
p_igmon 0:ad6637c36dc7 160 void my_inthandler2(void){
p_igmon 0:ad6637c36dc7 161
p_igmon 0:ad6637c36dc7 162 while (USART2->SR & (1<<5)){ // RXNE 1: Received data is ready to be read.
p_igmon 0:ad6637c36dc7 163 *param_wrptr = (uint8_t)(USART2->DR & 0xFF);
p_igmon 0:ad6637c36dc7 164 if (++param_wrptr >&param_receivebuf[255]) param_wrptr = &param_receivebuf[0];//
p_igmon 0:ad6637c36dc7 165 }
p_igmon 0:ad6637c36dc7 166 }
p_igmon 0:ad6637c36dc7 167
p_igmon 0:ad6637c36dc7 168 void anykeyon(U8 inkey){
p_igmon 0:ad6637c36dc7 169 U8 temp = inkey & 0x0f;
p_igmon 0:ad6637c36dc7 170 /* Select OneGenSw of them */
p_igmon 0:ad6637c36dc7 171 if (temp > 7){selectsw = 8;}
p_igmon 0:ad6637c36dc7 172 else if(temp > 3){selectsw = 4;}
p_igmon 0:ad6637c36dc7 173 else if(temp > 1){selectsw = 2;}
p_igmon 0:ad6637c36dc7 174 else if(temp > 0){selectsw = 1;}
p_igmon 0:ad6637c36dc7 175
p_igmon 0:ad6637c36dc7 176 if (inkey == 0x80){
p_igmon 0:ad6637c36dc7 177 if (++menu_index > MENU_INDEXMAX) menu_index = MENU_INDEXMAX;
p_igmon 0:ad6637c36dc7 178 }else if(inkey == 0x40){
p_igmon 0:ad6637c36dc7 179 if(--menu_index < 0) menu_index = 0;
p_igmon 0:ad6637c36dc7 180 }
p_igmon 0:ad6637c36dc7 181 lcd_print1((char *)&MenuList[menu_index].menu);
p_igmon 0:ad6637c36dc7 182 lcd_string[0] = 0;
p_igmon 0:ad6637c36dc7 183 (*MenuList[menu_index].function)();
p_igmon 0:ad6637c36dc7 184 }
p_igmon 0:ad6637c36dc7 185
p_igmon 0:ad6637c36dc7 186
p_igmon 0:ad6637c36dc7 187 int main(){
p_igmon 0:ad6637c36dc7 188 int temp2;
p_igmon 0:ad6637c36dc7 189 uint8_t *test;
p_igmon 0:ad6637c36dc7 190 uGen4_device_init();
p_igmon 0:ad6637c36dc7 191 pc.baud(115200);
p_igmon 0:ad6637c36dc7 192 pc.attach(my_inthandler2, Serial::RxIrq);
p_igmon 0:ad6637c36dc7 193 // pc.format(8,RawSerial::None,1);
p_igmon 0:ad6637c36dc7 194 pc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
p_igmon 0:ad6637c36dc7 195 PresetVoiceAmount = (U32)&PresetVoice[63]-(U32)&PresetVoice[0]+sizeof(PresetVoiceDef);
p_igmon 0:ad6637c36dc7 196 SGenAmount = (U32)&sgen[PRGGENMAX * 64-1]-(U32)&sgen[0]+sizeof(GENERATOR);
p_igmon 0:ad6637c36dc7 197
p_igmon 0:ad6637c36dc7 198 // pc.printf("%d\r\n",PresetVoiceAmount);
p_igmon 0:ad6637c36dc7 199 // pc.printf("%d\r\n",SGenAmount);
p_igmon 0:ad6637c36dc7 200
p_igmon 0:ad6637c36dc7 201 lcd_print_title();
p_igmon 0:ad6637c36dc7 202
p_igmon 0:ad6637c36dc7 203 PresetVoiceNum = 1;
p_igmon 0:ad6637c36dc7 204 MasterVolume = 127<<8;
p_igmon 0:ad6637c36dc7 205 MidiChannel = 1;
p_igmon 0:ad6637c36dc7 206 midi_base_ch = MidiChannel - 1;
p_igmon 0:ad6637c36dc7 207 menu_index = 2;
p_igmon 0:ad6637c36dc7 208 selectsw = 1;
p_igmon 0:ad6637c36dc7 209 keystate = KEY_FIRST_WAIT;
p_igmon 0:ad6637c36dc7 210 MasterTune = 0;
p_igmon 0:ad6637c36dc7 211 rch_pol = 1;
p_igmon 0:ad6637c36dc7 212 limit = 8;
p_igmon 0:ad6637c36dc7 213
p_igmon 0:ad6637c36dc7 214 TimerCount10mS= 0;
p_igmon 0:ad6637c36dc7 215 KeyValDiv = 1;
p_igmon 0:ad6637c36dc7 216 int KeyAutoLoopCount = 0;
p_igmon 0:ad6637c36dc7 217
p_igmon 0:ad6637c36dc7 218 reverve_wtemp = reverve_buf;
p_igmon 0:ad6637c36dc7 219
p_igmon 0:ad6637c36dc7 220 if (temp2 = get_wave_addr(&Wave[0])){
p_igmon 0:ad6637c36dc7 221 pc.printf("Wave Format Eror No %d\r\n",temp2);
p_igmon 0:ad6637c36dc7 222 lcd_print2("WaveFormatEror");
p_igmon 0:ad6637c36dc7 223 val2str4(temp2);
p_igmon 0:ad6637c36dc7 224 lcd_print(&str[0]);
p_igmon 0:ad6637c36dc7 225 while(1){}
p_igmon 0:ad6637c36dc7 226 }
p_igmon 0:ad6637c36dc7 227
p_igmon 0:ad6637c36dc7 228 init_sgen();
p_igmon 0:ad6637c36dc7 229
p_igmon 0:ad6637c36dc7 230 voice_ptr = &voice[0];
p_igmon 0:ad6637c36dc7 231 gen = &sgen[PresetVoiceNum - 1];
p_igmon 0:ad6637c36dc7 232 pgen = &dgen[0];
p_igmon 0:ad6637c36dc7 233 pgen_temp = &dgen_temp[0];
p_igmon 0:ad6637c36dc7 234 gen_encount = 0;
p_igmon 0:ad6637c36dc7 235
p_igmon 0:ad6637c36dc7 236 init_midi();
p_igmon 0:ad6637c36dc7 237 midi.attach(my_inthandler, Serial::RxIrq);
p_igmon 0:ad6637c36dc7 238 midi.format(8,RawSerial::None,1);
p_igmon 0:ad6637c36dc7 239 midi.baud(31250);
p_igmon 0:ad6637c36dc7 240
p_igmon 0:ad6637c36dc7 241 load2from();
p_igmon 0:ad6637c36dc7 242
p_igmon 0:ad6637c36dc7 243 uGen4_init();
p_igmon 0:ad6637c36dc7 244 i2s_dma_init();
p_igmon 0:ad6637c36dc7 245
p_igmon 0:ad6637c36dc7 246 init_param();
p_igmon 0:ad6637c36dc7 247 /*
p_igmon 0:ad6637c36dc7 248 test = (uint8_t *)malloc(60000);
p_igmon 0:ad6637c36dc7 249 if (test == 0) myled =1;
p_igmon 0:ad6637c36dc7 250 */
p_igmon 0:ad6637c36dc7 251
p_igmon 0:ad6637c36dc7 252 while(1) {
p_igmon 0:ad6637c36dc7 253 if(BufferOffset != DMA_Idle) wave_generate();
p_igmon 0:ad6637c36dc7 254 midi_work();
p_igmon 0:ad6637c36dc7 255 param_work();
p_igmon 0:ad6637c36dc7 256
p_igmon 0:ad6637c36dc7 257 switch(keystate){
p_igmon 0:ad6637c36dc7 258 case KEY_FIRST_WAIT:
p_igmon 0:ad6637c36dc7 259 if (ANYKEYON){
p_igmon 0:ad6637c36dc7 260 keystate = KEY_AFTER_ON;
p_igmon 0:ad6637c36dc7 261 anykeyon(0);
p_igmon 0:ad6637c36dc7 262 }
p_igmon 0:ad6637c36dc7 263 break;
p_igmon 0:ad6637c36dc7 264
p_igmon 0:ad6637c36dc7 265 case KEY_GEN_WAVE1:
p_igmon 0:ad6637c36dc7 266 if (TimerCount10mS== 0){
p_igmon 0:ad6637c36dc7 267 keystate = KEY_WAIT_OFF;
p_igmon 0:ad6637c36dc7 268 TimerCount10mS= 100;// 1000mS Wait
p_igmon 0:ad6637c36dc7 269 }
p_igmon 0:ad6637c36dc7 270 break;
p_igmon 0:ad6637c36dc7 271
p_igmon 0:ad6637c36dc7 272 case KEY_WAIT_ON:
p_igmon 0:ad6637c36dc7 273 if(key = ANYKEYON){
p_igmon 0:ad6637c36dc7 274 anykeyon(key);/* call function */
p_igmon 0:ad6637c36dc7 275 if(keystate == KEY_GEN_WAVE1){
p_igmon 0:ad6637c36dc7 276 }else{
p_igmon 0:ad6637c36dc7 277 keystate = KEY_AFTER_ON;
p_igmon 0:ad6637c36dc7 278 TimerCount10mS= 4;// 40mS wait for key stable
p_igmon 0:ad6637c36dc7 279 }
p_igmon 0:ad6637c36dc7 280 }
p_igmon 0:ad6637c36dc7 281 break;
p_igmon 0:ad6637c36dc7 282
p_igmon 0:ad6637c36dc7 283 case KEY_AFTER_ON:
p_igmon 0:ad6637c36dc7 284 if (TimerCount10mS== 0){
p_igmon 0:ad6637c36dc7 285 keystate = KEY_WAIT_OFF;
p_igmon 0:ad6637c36dc7 286 TimerCount10mS= 100;// 1000mS Wait
p_igmon 0:ad6637c36dc7 287 }
p_igmon 0:ad6637c36dc7 288 break;
p_igmon 0:ad6637c36dc7 289
p_igmon 0:ad6637c36dc7 290 case KEY_AUTO_PRESS:
p_igmon 0:ad6637c36dc7 291 anykeyon(key);/* call function */
p_igmon 0:ad6637c36dc7 292 keystate = KEY_AFTER_AUTO_PRESS;
p_igmon 0:ad6637c36dc7 293 TimerCount10mS = 20;// 200mS Wait
p_igmon 0:ad6637c36dc7 294 break;
p_igmon 0:ad6637c36dc7 295
p_igmon 0:ad6637c36dc7 296 case KEY_AFTER_AUTO_PRESS:
p_igmon 0:ad6637c36dc7 297 if(key = ANYKEYON){
p_igmon 0:ad6637c36dc7 298 if (TimerCount10mS== 0){
p_igmon 0:ad6637c36dc7 299 if(++KeyAutoLoopCount > 40){
p_igmon 0:ad6637c36dc7 300 KeyAutoLoopCount = 0;
p_igmon 0:ad6637c36dc7 301 KeyValDiv *= 10;
p_igmon 0:ad6637c36dc7 302 if(KeyValDiv >500) KeyValDiv = 500;
p_igmon 0:ad6637c36dc7 303 }
p_igmon 0:ad6637c36dc7 304 keystate = KEY_AUTO_PRESS;
p_igmon 0:ad6637c36dc7 305 }
p_igmon 0:ad6637c36dc7 306 }else{
p_igmon 0:ad6637c36dc7 307 KeyValDiv = 1;
p_igmon 0:ad6637c36dc7 308 keystate = KEY_AFTER_OFF;
p_igmon 0:ad6637c36dc7 309 TimerCount10mS= 4;// 40mS wait for key stable
p_igmon 0:ad6637c36dc7 310
p_igmon 0:ad6637c36dc7 311 }
p_igmon 0:ad6637c36dc7 312 break;
p_igmon 0:ad6637c36dc7 313
p_igmon 0:ad6637c36dc7 314 case KEY_WAIT_OFF:
p_igmon 0:ad6637c36dc7 315 if (TimerCount10mS== 0){
p_igmon 0:ad6637c36dc7 316 KeyValDiv <<= 2;
p_igmon 0:ad6637c36dc7 317 if(KeyValDiv >500) KeyValDiv = 500;
p_igmon 0:ad6637c36dc7 318 keystate = KEY_AUTO_PRESS;
p_igmon 0:ad6637c36dc7 319 }else if(ANYKEYON == 0){
p_igmon 0:ad6637c36dc7 320 KeyValDiv = 1;
p_igmon 0:ad6637c36dc7 321 keystate = KEY_AFTER_OFF;
p_igmon 0:ad6637c36dc7 322 TimerCount10mS= 7;// 70mS wait for key stable
p_igmon 0:ad6637c36dc7 323 }
p_igmon 0:ad6637c36dc7 324 break;
p_igmon 0:ad6637c36dc7 325
p_igmon 0:ad6637c36dc7 326 case KEY_AFTER_OFF:
p_igmon 0:ad6637c36dc7 327 if (TimerCount10mS== 0){
p_igmon 0:ad6637c36dc7 328 keystate = KEY_WAIT_ON;
p_igmon 0:ad6637c36dc7 329 }
p_igmon 0:ad6637c36dc7 330 break;
p_igmon 0:ad6637c36dc7 331 }
p_igmon 0:ad6637c36dc7 332 }
p_igmon 0:ad6637c36dc7 333 }
p_igmon 0:ad6637c36dc7 334
p_igmon 0:ad6637c36dc7 335
p_igmon 0:ad6637c36dc7 336
p_igmon 0:ad6637c36dc7 337
p_igmon 0:ad6637c36dc7 338
p_igmon 0:ad6637c36dc7 339
p_igmon 0:ad6637c36dc7 340
p_igmon 0:ad6637c36dc7 341
p_igmon 0:ad6637c36dc7 342
p_igmon 0:ad6637c36dc7 343
p_igmon 0:ad6637c36dc7 344