![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
part3 update
main.cpp@1:1260dba917b0, 2015-02-13 (annotated)
- Committer:
- yifeng021
- Date:
- Fri Feb 13 19:53:09 2015 +0000
- Revision:
- 1:1260dba917b0
- Parent:
- 0:7c6b15d40e00
- Child:
- 2:75fb721a5b86
part3 completed & commented
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yifeng021 | 0:7c6b15d40e00 | 1 | #include "mbed.h" |
yifeng021 | 0:7c6b15d40e00 | 2 | #include "string.h" |
yifeng021 | 0:7c6b15d40e00 | 3 | // speaker sound effect demo using PWM hardware output |
yifeng021 | 1:1260dba917b0 | 4 | PwmOut speaker(p21);//pwm output |
yifeng021 | 1:1260dba917b0 | 5 | Serial usb(USBTX, USBRX);//serial comm |
yifeng021 | 1:1260dba917b0 | 6 | DigitalOut row8(p8);//pin8 on keypad board->row1(top) |
yifeng021 | 1:1260dba917b0 | 7 | DigitalOut row1(p5);//pin1 ...->row2 |
yifeng021 | 1:1260dba917b0 | 8 | DigitalOut row2(p6);//pin2->row3 |
yifeng021 | 1:1260dba917b0 | 9 | DigitalOut row4(p7);//pin4->row4 |
yifeng021 | 1:1260dba917b0 | 10 | InterruptIn col7(p27);//pin7->column 1(right-most column) |
yifeng021 | 1:1260dba917b0 | 11 | InterruptIn col6(p28);//pin6->column 2 |
yifeng021 | 1:1260dba917b0 | 12 | InterruptIn col5(p29);//pin5->column 3 |
yifeng021 | 1:1260dba917b0 | 13 | InterruptIn col3(p30);//pin3->column 4 |
yifeng021 | 0:7c6b15d40e00 | 14 | |
yifeng021 | 0:7c6b15d40e00 | 15 | unsigned short global_timer;//global variable |
yifeng021 | 1:1260dba917b0 | 16 | unsigned short global_key_index;//global variable, value range:0 - 15, represents for 16 keys |
yifeng021 | 0:7c6b15d40e00 | 17 | |
yifeng021 | 0:7c6b15d40e00 | 18 | extern "C" void TIMER0_IRQHandler (void); |
yifeng021 | 1:1260dba917b0 | 19 | void timer0_init(void);//initialize timer0 |
yifeng021 | 1:1260dba917b0 | 20 | void play_tone(int freq, int dur);//takes in frequency & duration and plays the tone accodingly |
yifeng021 | 1:1260dba917b0 | 21 | bool check_buffer_format(char *buffer);//check input string format |
yifeng021 | 1:1260dba917b0 | 22 | // The following functions determine which key is pressed by changing global variable 'global_key_index' |
yifeng021 | 0:7c6b15d40e00 | 23 | void key_1(); |
yifeng021 | 0:7c6b15d40e00 | 24 | void key_2(); |
yifeng021 | 0:7c6b15d40e00 | 25 | void key_3(); |
yifeng021 | 0:7c6b15d40e00 | 26 | void key_A(); |
yifeng021 | 1:1260dba917b0 | 27 | void key_4(); |
yifeng021 | 1:1260dba917b0 | 28 | void key_5(); |
yifeng021 | 1:1260dba917b0 | 29 | void key_6(); |
yifeng021 | 1:1260dba917b0 | 30 | void key_B(); |
yifeng021 | 1:1260dba917b0 | 31 | void key_7(); |
yifeng021 | 1:1260dba917b0 | 32 | void key_8(); |
yifeng021 | 1:1260dba917b0 | 33 | void key_9(); |
yifeng021 | 1:1260dba917b0 | 34 | void key_C(); |
yifeng021 | 1:1260dba917b0 | 35 | void key_str(); |
yifeng021 | 1:1260dba917b0 | 36 | void key_0(); |
yifeng021 | 1:1260dba917b0 | 37 | void key_pd(); |
yifeng021 | 1:1260dba917b0 | 38 | void key_D(); |
yifeng021 | 0:7c6b15d40e00 | 39 | |
yifeng021 | 0:7c6b15d40e00 | 40 | int main() |
yifeng021 | 0:7c6b15d40e00 | 41 | { |
yifeng021 | 1:1260dba917b0 | 42 | timer0_init(); |
yifeng021 | 0:7c6b15d40e00 | 43 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 44 | row8 = 0; |
yifeng021 | 0:7c6b15d40e00 | 45 | row1 = 0; |
yifeng021 | 0:7c6b15d40e00 | 46 | row2 = 0; |
yifeng021 | 0:7c6b15d40e00 | 47 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 48 | |
yifeng021 | 0:7c6b15d40e00 | 49 | while (1) { |
yifeng021 | 0:7c6b15d40e00 | 50 | if (global_timer < 4) { |
yifeng021 | 1:1260dba917b0 | 51 | //set row1 to high for 4ms |
yifeng021 | 0:7c6b15d40e00 | 52 | row8 = 1; |
yifeng021 | 1:1260dba917b0 | 53 | //scan 4 columns |
yifeng021 | 1:1260dba917b0 | 54 | col3.fall(&key_1); |
yifeng021 | 1:1260dba917b0 | 55 | col5.fall(&key_2); |
yifeng021 | 1:1260dba917b0 | 56 | col6.fall(&key_3); |
yifeng021 | 1:1260dba917b0 | 57 | col7.fall(&key_A); |
yifeng021 | 0:7c6b15d40e00 | 58 | } |
yifeng021 | 1:1260dba917b0 | 59 | if (global_timer >= 4 && global_timer < 8){ |
yifeng021 | 1:1260dba917b0 | 60 | //set row2 to high for 4ms |
yifeng021 | 0:7c6b15d40e00 | 61 | row8 = 0; |
yifeng021 | 1:1260dba917b0 | 62 | row2 = 0; |
yifeng021 | 1:1260dba917b0 | 63 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 64 | row1 = 1; |
yifeng021 | 1:1260dba917b0 | 65 | //scan 4 columns |
yifeng021 | 1:1260dba917b0 | 66 | col3.fall(&key_4); |
yifeng021 | 1:1260dba917b0 | 67 | col5.fall(&key_5); |
yifeng021 | 1:1260dba917b0 | 68 | col6.fall(&key_6); |
yifeng021 | 1:1260dba917b0 | 69 | col7.fall(&key_B); |
yifeng021 | 0:7c6b15d40e00 | 70 | } |
yifeng021 | 1:1260dba917b0 | 71 | if (global_timer >= 8 && global_timer < 12) { |
yifeng021 | 1:1260dba917b0 | 72 | //set row3 high for 4ms |
yifeng021 | 1:1260dba917b0 | 73 | row8 = 0; |
yifeng021 | 0:7c6b15d40e00 | 74 | row1 = 0; |
yifeng021 | 1:1260dba917b0 | 75 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 76 | row2 = 1; |
yifeng021 | 1:1260dba917b0 | 77 | //scan 4 columns |
yifeng021 | 1:1260dba917b0 | 78 | col3.fall(&key_7); |
yifeng021 | 1:1260dba917b0 | 79 | col5.fall(&key_8); |
yifeng021 | 1:1260dba917b0 | 80 | col6.fall(&key_9); |
yifeng021 | 1:1260dba917b0 | 81 | col7.fall(&key_C); |
yifeng021 | 0:7c6b15d40e00 | 82 | } |
yifeng021 | 1:1260dba917b0 | 83 | if (global_timer >= 12 && global_timer < 16) { |
yifeng021 | 1:1260dba917b0 | 84 | //set row4 high for 4ms |
yifeng021 | 1:1260dba917b0 | 85 | row8 = 0; |
yifeng021 | 1:1260dba917b0 | 86 | row1 = 0; |
yifeng021 | 0:7c6b15d40e00 | 87 | row2 = 0; |
yifeng021 | 0:7c6b15d40e00 | 88 | row4 = 1; |
yifeng021 | 1:1260dba917b0 | 89 | //scan 4 columns |
yifeng021 | 1:1260dba917b0 | 90 | col3.fall(&key_str); |
yifeng021 | 1:1260dba917b0 | 91 | col5.fall(&key_0); |
yifeng021 | 1:1260dba917b0 | 92 | col6.fall(&key_pd); |
yifeng021 | 1:1260dba917b0 | 93 | col7.fall(&key_D); |
yifeng021 | 0:7c6b15d40e00 | 94 | } |
yifeng021 | 1:1260dba917b0 | 95 | if (global_timer >= 16) { |
yifeng021 | 1:1260dba917b0 | 96 | row8 = 0; |
yifeng021 | 1:1260dba917b0 | 97 | row1 = 0; |
yifeng021 | 1:1260dba917b0 | 98 | row2 = 0; |
yifeng021 | 0:7c6b15d40e00 | 99 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 100 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 101 | } |
yifeng021 | 0:7c6b15d40e00 | 102 | } |
yifeng021 | 0:7c6b15d40e00 | 103 | } |
yifeng021 | 0:7c6b15d40e00 | 104 | |
yifeng021 | 1:1260dba917b0 | 105 | //source: https://developer.mbed.org/users/microguy/notebook/timer0-example-code/ |
yifeng021 | 0:7c6b15d40e00 | 106 | extern "C" void TIMER0_IRQHandler (void) |
yifeng021 | 0:7c6b15d40e00 | 107 | { |
yifeng021 | 0:7c6b15d40e00 | 108 | if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt, proceed |
yifeng021 | 0:7c6b15d40e00 | 109 | { |
yifeng021 | 0:7c6b15d40e00 | 110 | LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag |
yifeng021 | 0:7c6b15d40e00 | 111 | global_timer++; //increment timer_count |
yifeng021 | 0:7c6b15d40e00 | 112 | } |
yifeng021 | 0:7c6b15d40e00 | 113 | } |
yifeng021 | 0:7c6b15d40e00 | 114 | |
yifeng021 | 1:1260dba917b0 | 115 | //source: https://developer.mbed.org/users/microguy/notebook/timer0-example-code/ |
yifeng021 | 1:1260dba917b0 | 116 | // This function initializes timer0 |
yifeng021 | 0:7c6b15d40e00 | 117 | void timer0_init(void) |
yifeng021 | 0:7c6b15d40e00 | 118 | { |
yifeng021 | 0:7c6b15d40e00 | 119 | LPC_SC->PCONP |=1<1; //timer0 power on |
yifeng021 | 1:1260dba917b0 | 120 | LPC_TIM0->MR0 = 23980; //1 msec(verified with oscilloscope) |
yifeng021 | 0:7c6b15d40e00 | 121 | LPC_TIM0->MCR = 3; //interrupt and reset control |
yifeng021 | 0:7c6b15d40e00 | 122 | //3 = Interrupt & reset timer0 on match |
yifeng021 | 0:7c6b15d40e00 | 123 | //1 = Interrupt only, no reset of timer0 |
yifeng021 | 0:7c6b15d40e00 | 124 | NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt |
yifeng021 | 0:7c6b15d40e00 | 125 | LPC_TIM0->TCR = 1; //enable Timer0 |
yifeng021 | 0:7c6b15d40e00 | 126 | printf("Done timer_init\n\r"); |
yifeng021 | 0:7c6b15d40e00 | 127 | } |
yifeng021 | 0:7c6b15d40e00 | 128 | |
yifeng021 | 1:1260dba917b0 | 129 | // This function plays a tone for a certain duration |
yifeng021 | 0:7c6b15d40e00 | 130 | void play_tone(int freq, int dur) |
yifeng021 | 0:7c6b15d40e00 | 131 | { |
yifeng021 | 0:7c6b15d40e00 | 132 | speaker.period(1.0/freq); // 500hz period |
yifeng021 | 0:7c6b15d40e00 | 133 | speaker = 0.2; //50% duty cycle - max volume |
yifeng021 | 0:7c6b15d40e00 | 134 | wait(dur/1000.0); |
yifeng021 | 0:7c6b15d40e00 | 135 | speaker=0.0; // turn off audio |
yifeng021 | 0:7c6b15d40e00 | 136 | } |
yifeng021 | 0:7c6b15d40e00 | 137 | |
yifeng021 | 1:1260dba917b0 | 138 | // This function checks the user input format of frequency & duration |
yifeng021 | 0:7c6b15d40e00 | 139 | bool check_buffer_format(char *buffer) |
yifeng021 | 0:7c6b15d40e00 | 140 | { |
yifeng021 | 0:7c6b15d40e00 | 141 | bool flag = true;//true - valid input; false - invalid input |
yifeng021 | 0:7c6b15d40e00 | 142 | int buffer_length = strlen(buffer); |
yifeng021 | 0:7c6b15d40e00 | 143 | int i = 0; |
yifeng021 | 0:7c6b15d40e00 | 144 | for (i=0; i<buffer_length; i++) { |
yifeng021 | 0:7c6b15d40e00 | 145 | //check if buffer[0:2] & buffer[4:6] are #s |
yifeng021 | 0:7c6b15d40e00 | 146 | if (i==0 || i==1 || i==2 || i==4 || i==5 || i==6){ |
yifeng021 | 0:7c6b15d40e00 | 147 | if (buffer[i] < '0' || buffer[i] > '9'){ |
yifeng021 | 0:7c6b15d40e00 | 148 | flag = false; |
yifeng021 | 0:7c6b15d40e00 | 149 | } |
yifeng021 | 0:7c6b15d40e00 | 150 | } |
yifeng021 | 0:7c6b15d40e00 | 151 | //check if buffer[3] is a 'space' |
yifeng021 | 0:7c6b15d40e00 | 152 | else if (i==3){ |
yifeng021 | 0:7c6b15d40e00 | 153 | if (buffer[i] != ' '){ |
yifeng021 | 0:7c6b15d40e00 | 154 | flag = false; |
yifeng021 | 0:7c6b15d40e00 | 155 | } |
yifeng021 | 0:7c6b15d40e00 | 156 | } |
yifeng021 | 0:7c6b15d40e00 | 157 | } |
yifeng021 | 0:7c6b15d40e00 | 158 | return flag; |
yifeng021 | 0:7c6b15d40e00 | 159 | } |
yifeng021 | 0:7c6b15d40e00 | 160 | |
yifeng021 | 1:1260dba917b0 | 161 | // The following functions determine which key is pressed by changing global variable 'global_key_index' |
yifeng021 | 1:1260dba917b0 | 162 | //indice: |
yifeng021 | 1:1260dba917b0 | 163 | //key-[index] |
yifeng021 | 1:1260dba917b0 | 164 | //1-[0],2-[1],3-[2],A-[3],4-[4],5-[5],6-[6],B-[7],7-[8],8-[9],9-[10],C-[11],*-[12],0-[13],#-[14],D-[15] |
yifeng021 | 0:7c6b15d40e00 | 165 | void key_1(){ |
yifeng021 | 0:7c6b15d40e00 | 166 | global_key_index = 0; |
yifeng021 | 0:7c6b15d40e00 | 167 | printf("1 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 168 | } |
yifeng021 | 0:7c6b15d40e00 | 169 | void key_2(){ |
yifeng021 | 0:7c6b15d40e00 | 170 | global_key_index = 1; |
yifeng021 | 0:7c6b15d40e00 | 171 | printf("2 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 172 | } |
yifeng021 | 0:7c6b15d40e00 | 173 | void key_3(){ |
yifeng021 | 0:7c6b15d40e00 | 174 | global_key_index = 2; |
yifeng021 | 0:7c6b15d40e00 | 175 | printf("3 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 176 | } |
yifeng021 | 0:7c6b15d40e00 | 177 | void key_A(){ |
yifeng021 | 0:7c6b15d40e00 | 178 | global_key_index = 3; |
yifeng021 | 0:7c6b15d40e00 | 179 | printf("A is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 180 | } |
yifeng021 | 1:1260dba917b0 | 181 | void key_4(){ |
yifeng021 | 1:1260dba917b0 | 182 | global_key_index = 4; |
yifeng021 | 1:1260dba917b0 | 183 | printf("4 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 184 | } |
yifeng021 | 1:1260dba917b0 | 185 | void key_5(){ |
yifeng021 | 1:1260dba917b0 | 186 | global_key_index = 5; |
yifeng021 | 1:1260dba917b0 | 187 | printf("5 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 188 | } |
yifeng021 | 1:1260dba917b0 | 189 | void key_6(){ |
yifeng021 | 1:1260dba917b0 | 190 | global_key_index = 6; |
yifeng021 | 1:1260dba917b0 | 191 | printf("6 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 192 | } |
yifeng021 | 1:1260dba917b0 | 193 | void key_B(){ |
yifeng021 | 1:1260dba917b0 | 194 | global_key_index = 7; |
yifeng021 | 1:1260dba917b0 | 195 | printf("B is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 196 | } |
yifeng021 | 1:1260dba917b0 | 197 | void key_7(){ |
yifeng021 | 1:1260dba917b0 | 198 | global_key_index = 8; |
yifeng021 | 1:1260dba917b0 | 199 | printf("7 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 200 | } |
yifeng021 | 1:1260dba917b0 | 201 | void key_8(){ |
yifeng021 | 1:1260dba917b0 | 202 | global_key_index = 9; |
yifeng021 | 1:1260dba917b0 | 203 | printf("8 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 204 | } |
yifeng021 | 1:1260dba917b0 | 205 | void key_9(){ |
yifeng021 | 1:1260dba917b0 | 206 | global_key_index = 10; |
yifeng021 | 1:1260dba917b0 | 207 | printf("9 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 208 | } |
yifeng021 | 1:1260dba917b0 | 209 | void key_C(){ |
yifeng021 | 1:1260dba917b0 | 210 | global_key_index = 11; |
yifeng021 | 1:1260dba917b0 | 211 | printf("C is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 212 | } |
yifeng021 | 1:1260dba917b0 | 213 | void key_str(){ |
yifeng021 | 1:1260dba917b0 | 214 | global_key_index = 12; |
yifeng021 | 1:1260dba917b0 | 215 | printf("* is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 216 | } |
yifeng021 | 1:1260dba917b0 | 217 | void key_0(){ |
yifeng021 | 1:1260dba917b0 | 218 | global_key_index = 13; |
yifeng021 | 1:1260dba917b0 | 219 | printf("0 is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 220 | } |
yifeng021 | 1:1260dba917b0 | 221 | void key_pd(){ |
yifeng021 | 1:1260dba917b0 | 222 | global_key_index = 14; |
yifeng021 | 1:1260dba917b0 | 223 | printf("# is pressed!\n"); |
yifeng021 | 1:1260dba917b0 | 224 | } |
yifeng021 | 1:1260dba917b0 | 225 | void key_D(){ |
yifeng021 | 1:1260dba917b0 | 226 | global_key_index = 15; |
yifeng021 | 1:1260dba917b0 | 227 | printf("D is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 228 | } |