![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
part3 update
main.cpp@0:7c6b15d40e00, 2015-02-12 (annotated)
- Committer:
- yifeng021
- Date:
- Thu Feb 12 23:52:52 2015 +0000
- Revision:
- 0:7c6b15d40e00
- Child:
- 1:1260dba917b0
part3 update. Partially works.
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 | 0:7c6b15d40e00 | 4 | PwmOut speaker(p21); |
yifeng021 | 0:7c6b15d40e00 | 5 | Serial usb(USBTX, USBRX); |
yifeng021 | 0:7c6b15d40e00 | 6 | DigitalOut row8(p8); |
yifeng021 | 0:7c6b15d40e00 | 7 | DigitalOut row1(p5); |
yifeng021 | 0:7c6b15d40e00 | 8 | DigitalOut row2(p6); |
yifeng021 | 0:7c6b15d40e00 | 9 | DigitalOut row4(p7); |
yifeng021 | 0:7c6b15d40e00 | 10 | InterruptIn col7(p27); |
yifeng021 | 0:7c6b15d40e00 | 11 | InterruptIn col6(p28); |
yifeng021 | 0:7c6b15d40e00 | 12 | InterruptIn col5(p29); |
yifeng021 | 0:7c6b15d40e00 | 13 | InterruptIn col3(p30); |
yifeng021 | 0:7c6b15d40e00 | 14 | |
yifeng021 | 0:7c6b15d40e00 | 15 | unsigned short global_timer;//global variable |
yifeng021 | 0:7c6b15d40e00 | 16 | unsigned short global_key_index; |
yifeng021 | 0:7c6b15d40e00 | 17 | |
yifeng021 | 0:7c6b15d40e00 | 18 | extern "C" void TIMER0_IRQHandler (void); |
yifeng021 | 0:7c6b15d40e00 | 19 | void timer0_init(void); |
yifeng021 | 0:7c6b15d40e00 | 20 | void play_tone(int freq, int dur); |
yifeng021 | 0:7c6b15d40e00 | 21 | bool check_buffer_format(char *buffer); |
yifeng021 | 0:7c6b15d40e00 | 22 | //void scan_all_rows(); |
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 | 0:7c6b15d40e00 | 27 | |
yifeng021 | 0:7c6b15d40e00 | 28 | |
yifeng021 | 0:7c6b15d40e00 | 29 | |
yifeng021 | 0:7c6b15d40e00 | 30 | int main() |
yifeng021 | 0:7c6b15d40e00 | 31 | { |
yifeng021 | 0:7c6b15d40e00 | 32 | //printf("Gello world!\n"); |
yifeng021 | 0:7c6b15d40e00 | 33 | |
yifeng021 | 0:7c6b15d40e00 | 34 | //en8.rise(&check_row8); |
yifeng021 | 0:7c6b15d40e00 | 35 | //en1.rise(&check_row1); |
yifeng021 | 0:7c6b15d40e00 | 36 | //en2.rise(&check_row2); |
yifeng021 | 0:7c6b15d40e00 | 37 | //en4.rise(&check_row4); |
yifeng021 | 0:7c6b15d40e00 | 38 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 39 | row8 = 0; |
yifeng021 | 0:7c6b15d40e00 | 40 | row1 = 0; |
yifeng021 | 0:7c6b15d40e00 | 41 | row2 = 0; |
yifeng021 | 0:7c6b15d40e00 | 42 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 43 | |
yifeng021 | 0:7c6b15d40e00 | 44 | while (1) { |
yifeng021 | 0:7c6b15d40e00 | 45 | if (global_timer < 4) { |
yifeng021 | 0:7c6b15d40e00 | 46 | row8 = 1; |
yifeng021 | 0:7c6b15d40e00 | 47 | col3.rise(&key_1); |
yifeng021 | 0:7c6b15d40e00 | 48 | col5.rise(&key_2); |
yifeng021 | 0:7c6b15d40e00 | 49 | col6.rise(&key_3); |
yifeng021 | 0:7c6b15d40e00 | 50 | col7.rise(&key_A); |
yifeng021 | 0:7c6b15d40e00 | 51 | } |
yifeng021 | 0:7c6b15d40e00 | 52 | else if (global_timer < 8){ |
yifeng021 | 0:7c6b15d40e00 | 53 | row8 = 0; |
yifeng021 | 0:7c6b15d40e00 | 54 | row1 = 1; |
yifeng021 | 0:7c6b15d40e00 | 55 | } |
yifeng021 | 0:7c6b15d40e00 | 56 | else if (global_timer < 12) { |
yifeng021 | 0:7c6b15d40e00 | 57 | row1 = 0; |
yifeng021 | 0:7c6b15d40e00 | 58 | row2 = 1; |
yifeng021 | 0:7c6b15d40e00 | 59 | } |
yifeng021 | 0:7c6b15d40e00 | 60 | else if (global_timer < 16) { |
yifeng021 | 0:7c6b15d40e00 | 61 | row2 = 0; |
yifeng021 | 0:7c6b15d40e00 | 62 | row4 = 1; |
yifeng021 | 0:7c6b15d40e00 | 63 | } |
yifeng021 | 0:7c6b15d40e00 | 64 | else { |
yifeng021 | 0:7c6b15d40e00 | 65 | row4 = 0; |
yifeng021 | 0:7c6b15d40e00 | 66 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 67 | } |
yifeng021 | 0:7c6b15d40e00 | 68 | } |
yifeng021 | 0:7c6b15d40e00 | 69 | |
yifeng021 | 0:7c6b15d40e00 | 70 | |
yifeng021 | 0:7c6b15d40e00 | 71 | |
yifeng021 | 0:7c6b15d40e00 | 72 | /* |
yifeng021 | 0:7c6b15d40e00 | 73 | while (1) { |
yifeng021 | 0:7c6b15d40e00 | 74 | speaker = 0.0; |
yifeng021 | 0:7c6b15d40e00 | 75 | int freq = 0; |
yifeng021 | 0:7c6b15d40e00 | 76 | int dur = 0; |
yifeng021 | 0:7c6b15d40e00 | 77 | int i; |
yifeng021 | 0:7c6b15d40e00 | 78 | const int buffer_length = 7; //this is the actual buffer length, excluding the '\0' in the end |
yifeng021 | 0:7c6b15d40e00 | 79 | bool flag = true; |
yifeng021 | 0:7c6b15d40e00 | 80 | char buffer[128]; |
yifeng021 | 0:7c6b15d40e00 | 81 | usb.gets(buffer, buffer_length+1); |
yifeng021 | 0:7c6b15d40e00 | 82 | //usb.puts(buffer); |
yifeng021 | 0:7c6b15d40e00 | 83 | //check if input is valid |
yifeng021 | 0:7c6b15d40e00 | 84 | if (check_buffer_format(buffer) == false){ |
yifeng021 | 0:7c6b15d40e00 | 85 | printf("Invalid input format, please re-enter:\n"); |
yifeng021 | 0:7c6b15d40e00 | 86 | continue; |
yifeng021 | 0:7c6b15d40e00 | 87 | } |
yifeng021 | 0:7c6b15d40e00 | 88 | |
yifeng021 | 0:7c6b15d40e00 | 89 | |
yifeng021 | 0:7c6b15d40e00 | 90 | |
yifeng021 | 0:7c6b15d40e00 | 91 | //convert input string to two numbers, freq & dur |
yifeng021 | 0:7c6b15d40e00 | 92 | for (i=0; i < buffer_length; i++) { |
yifeng021 | 0:7c6b15d40e00 | 93 | //flag indicades whether the string represents frequency or duration |
yifeng021 | 0:7c6b15d40e00 | 94 | if (buffer[i] == ' ') { |
yifeng021 | 0:7c6b15d40e00 | 95 | flag = false; |
yifeng021 | 0:7c6b15d40e00 | 96 | continue; |
yifeng021 | 0:7c6b15d40e00 | 97 | } |
yifeng021 | 0:7c6b15d40e00 | 98 | if (flag) { |
yifeng021 | 0:7c6b15d40e00 | 99 | freq *= 10; |
yifeng021 | 0:7c6b15d40e00 | 100 | freq += buffer[i] - '0'; |
yifeng021 | 0:7c6b15d40e00 | 101 | } else { |
yifeng021 | 0:7c6b15d40e00 | 102 | dur *= 10; |
yifeng021 | 0:7c6b15d40e00 | 103 | dur += buffer[i] - '0'; |
yifeng021 | 0:7c6b15d40e00 | 104 | } |
yifeng021 | 0:7c6b15d40e00 | 105 | } |
yifeng021 | 0:7c6b15d40e00 | 106 | //usb.printf("freq: %d; dur: %d\n", freq, dur); |
yifeng021 | 0:7c6b15d40e00 | 107 | play_tone(freq, dur); |
yifeng021 | 0:7c6b15d40e00 | 108 | } |
yifeng021 | 0:7c6b15d40e00 | 109 | */ |
yifeng021 | 0:7c6b15d40e00 | 110 | } |
yifeng021 | 0:7c6b15d40e00 | 111 | |
yifeng021 | 0:7c6b15d40e00 | 112 | extern "C" void TIMER0_IRQHandler (void) |
yifeng021 | 0:7c6b15d40e00 | 113 | { |
yifeng021 | 0:7c6b15d40e00 | 114 | if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt, proceed |
yifeng021 | 0:7c6b15d40e00 | 115 | { |
yifeng021 | 0:7c6b15d40e00 | 116 | LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag |
yifeng021 | 0:7c6b15d40e00 | 117 | global_timer++; //increment timer_count |
yifeng021 | 0:7c6b15d40e00 | 118 | } |
yifeng021 | 0:7c6b15d40e00 | 119 | } |
yifeng021 | 0:7c6b15d40e00 | 120 | |
yifeng021 | 0:7c6b15d40e00 | 121 | void timer0_init(void) |
yifeng021 | 0:7c6b15d40e00 | 122 | { |
yifeng021 | 0:7c6b15d40e00 | 123 | LPC_SC->PCONP |=1<1; //timer0 power on |
yifeng021 | 0:7c6b15d40e00 | 124 | LPC_TIM0->MR0 = 23980; //1 msec(needs to be verified) |
yifeng021 | 0:7c6b15d40e00 | 125 | LPC_TIM0->MCR = 3; //interrupt and reset control |
yifeng021 | 0:7c6b15d40e00 | 126 | //3 = Interrupt & reset timer0 on match |
yifeng021 | 0:7c6b15d40e00 | 127 | //1 = Interrupt only, no reset of timer0 |
yifeng021 | 0:7c6b15d40e00 | 128 | NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt |
yifeng021 | 0:7c6b15d40e00 | 129 | LPC_TIM0->TCR = 1; //enable Timer0 |
yifeng021 | 0:7c6b15d40e00 | 130 | printf("Done timer_init\n\r"); |
yifeng021 | 0:7c6b15d40e00 | 131 | } |
yifeng021 | 0:7c6b15d40e00 | 132 | |
yifeng021 | 0:7c6b15d40e00 | 133 | void play_tone(int freq, int dur) |
yifeng021 | 0:7c6b15d40e00 | 134 | { |
yifeng021 | 0:7c6b15d40e00 | 135 | speaker.period(1.0/freq); // 500hz period |
yifeng021 | 0:7c6b15d40e00 | 136 | speaker = 0.2; //50% duty cycle - max volume |
yifeng021 | 0:7c6b15d40e00 | 137 | wait(dur/1000.0); |
yifeng021 | 0:7c6b15d40e00 | 138 | speaker=0.0; // turn off audio |
yifeng021 | 0:7c6b15d40e00 | 139 | } |
yifeng021 | 0:7c6b15d40e00 | 140 | |
yifeng021 | 0:7c6b15d40e00 | 141 | bool check_buffer_format(char *buffer) |
yifeng021 | 0:7c6b15d40e00 | 142 | { |
yifeng021 | 0:7c6b15d40e00 | 143 | bool flag = true;//true - valid input; false - invalid input |
yifeng021 | 0:7c6b15d40e00 | 144 | int buffer_length = strlen(buffer); |
yifeng021 | 0:7c6b15d40e00 | 145 | int i = 0; |
yifeng021 | 0:7c6b15d40e00 | 146 | for (i=0; i<buffer_length; i++) { |
yifeng021 | 0:7c6b15d40e00 | 147 | //check if buffer[0:2] & buffer[4:6] are #s |
yifeng021 | 0:7c6b15d40e00 | 148 | if (i==0 || i==1 || i==2 || i==4 || i==5 || i==6){ |
yifeng021 | 0:7c6b15d40e00 | 149 | if (buffer[i] < '0' || buffer[i] > '9'){ |
yifeng021 | 0:7c6b15d40e00 | 150 | flag = false; |
yifeng021 | 0:7c6b15d40e00 | 151 | } |
yifeng021 | 0:7c6b15d40e00 | 152 | } |
yifeng021 | 0:7c6b15d40e00 | 153 | //check if buffer[3] is a 'space' |
yifeng021 | 0:7c6b15d40e00 | 154 | else if (i==3){ |
yifeng021 | 0:7c6b15d40e00 | 155 | if (buffer[i] != ' '){ |
yifeng021 | 0:7c6b15d40e00 | 156 | flag = false; |
yifeng021 | 0:7c6b15d40e00 | 157 | } |
yifeng021 | 0:7c6b15d40e00 | 158 | } |
yifeng021 | 0:7c6b15d40e00 | 159 | } |
yifeng021 | 0:7c6b15d40e00 | 160 | return flag; |
yifeng021 | 0:7c6b15d40e00 | 161 | } |
yifeng021 | 0:7c6b15d40e00 | 162 | |
yifeng021 | 0:7c6b15d40e00 | 163 | /* |
yifeng021 | 0:7c6b15d40e00 | 164 | void scan_all_rows() |
yifeng021 | 0:7c6b15d40e00 | 165 | { |
yifeng021 | 0:7c6b15d40e00 | 166 | timer0_init(); |
yifeng021 | 0:7c6b15d40e00 | 167 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 168 | while(1) |
yifeng021 | 0:7c6b15d40e00 | 169 | { |
yifeng021 | 0:7c6b15d40e00 | 170 | en8.fall(&check_row8); |
yifeng021 | 0:7c6b15d40e00 | 171 | if (global_timer > 4) { |
yifeng021 | 0:7c6b15d40e00 | 172 | en1.fall(&check_row1); |
yifeng021 | 0:7c6b15d40e00 | 173 | //scan next row |
yifeng021 | 0:7c6b15d40e00 | 174 | if (global_timer > 8) { |
yifeng021 | 0:7c6b15d40e00 | 175 | en2.fall(&check_row2); |
yifeng021 | 0:7c6b15d40e00 | 176 | //scan next row |
yifeng021 | 0:7c6b15d40e00 | 177 | if (global_timer > 12) { |
yifeng021 | 0:7c6b15d40e00 | 178 | en4.fall(&check_row4); |
yifeng021 | 0:7c6b15d40e00 | 179 | if (global_timer > 16) { |
yifeng021 | 0:7c6b15d40e00 | 180 | break; |
yifeng021 | 0:7c6b15d40e00 | 181 | } |
yifeng021 | 0:7c6b15d40e00 | 182 | } |
yifeng021 | 0:7c6b15d40e00 | 183 | } |
yifeng021 | 0:7c6b15d40e00 | 184 | } |
yifeng021 | 0:7c6b15d40e00 | 185 | } |
yifeng021 | 0:7c6b15d40e00 | 186 | usb.printf("row %d is pressed!\n",global_row_index); |
yifeng021 | 0:7c6b15d40e00 | 187 | global_timer = 0; |
yifeng021 | 0:7c6b15d40e00 | 188 | } |
yifeng021 | 0:7c6b15d40e00 | 189 | */ |
yifeng021 | 0:7c6b15d40e00 | 190 | void key_1(){ |
yifeng021 | 0:7c6b15d40e00 | 191 | global_key_index = 0; |
yifeng021 | 0:7c6b15d40e00 | 192 | printf("1 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 193 | } |
yifeng021 | 0:7c6b15d40e00 | 194 | void key_2(){ |
yifeng021 | 0:7c6b15d40e00 | 195 | global_key_index = 1; |
yifeng021 | 0:7c6b15d40e00 | 196 | printf("2 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 197 | } |
yifeng021 | 0:7c6b15d40e00 | 198 | void key_3(){ |
yifeng021 | 0:7c6b15d40e00 | 199 | global_key_index = 2; |
yifeng021 | 0:7c6b15d40e00 | 200 | printf("3 is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 201 | } |
yifeng021 | 0:7c6b15d40e00 | 202 | void key_A(){ |
yifeng021 | 0:7c6b15d40e00 | 203 | global_key_index = 3; |
yifeng021 | 0:7c6b15d40e00 | 204 | printf("A is pressed!\n"); |
yifeng021 | 0:7c6b15d40e00 | 205 | } |