Yifeng Yuan
/
ese519_lab2_part3
part3 update
Diff: main.cpp
- Revision:
- 0:7c6b15d40e00
- Child:
- 1:1260dba917b0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Feb 12 23:52:52 2015 +0000 @@ -0,0 +1,205 @@ +#include "mbed.h" +#include "string.h" +// speaker sound effect demo using PWM hardware output +PwmOut speaker(p21); +Serial usb(USBTX, USBRX); +DigitalOut row8(p8); +DigitalOut row1(p5); +DigitalOut row2(p6); +DigitalOut row4(p7); +InterruptIn col7(p27); +InterruptIn col6(p28); +InterruptIn col5(p29); +InterruptIn col3(p30); + +unsigned short global_timer;//global variable +unsigned short global_key_index; + +extern "C" void TIMER0_IRQHandler (void); +void timer0_init(void); +void play_tone(int freq, int dur); +bool check_buffer_format(char *buffer); +//void scan_all_rows(); +void key_1(); +void key_2(); +void key_3(); +void key_A(); + + + +int main() +{ + //printf("Gello world!\n"); + + //en8.rise(&check_row8); + //en1.rise(&check_row1); + //en2.rise(&check_row2); + //en4.rise(&check_row4); + global_timer = 0; + row8 = 0; + row1 = 0; + row2 = 0; + row4 = 0; + + while (1) { + if (global_timer < 4) { + row8 = 1; + col3.rise(&key_1); + col5.rise(&key_2); + col6.rise(&key_3); + col7.rise(&key_A); + } + else if (global_timer < 8){ + row8 = 0; + row1 = 1; + } + else if (global_timer < 12) { + row1 = 0; + row2 = 1; + } + else if (global_timer < 16) { + row2 = 0; + row4 = 1; + } + else { + row4 = 0; + global_timer = 0; + } + } + + + + /* + while (1) { + speaker = 0.0; + int freq = 0; + int dur = 0; + int i; + const int buffer_length = 7; //this is the actual buffer length, excluding the '\0' in the end + bool flag = true; + char buffer[128]; + usb.gets(buffer, buffer_length+1); + //usb.puts(buffer); + //check if input is valid + if (check_buffer_format(buffer) == false){ + printf("Invalid input format, please re-enter:\n"); + continue; + } + + + + //convert input string to two numbers, freq & dur + for (i=0; i < buffer_length; i++) { + //flag indicades whether the string represents frequency or duration + if (buffer[i] == ' ') { + flag = false; + continue; + } + if (flag) { + freq *= 10; + freq += buffer[i] - '0'; + } else { + dur *= 10; + dur += buffer[i] - '0'; + } + } + //usb.printf("freq: %d; dur: %d\n", freq, dur); + play_tone(freq, dur); + } + */ +} + +extern "C" void TIMER0_IRQHandler (void) +{ +if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt, proceed + { + LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag + global_timer++; //increment timer_count + } +} + +void timer0_init(void) +{ + LPC_SC->PCONP |=1<1; //timer0 power on + LPC_TIM0->MR0 = 23980; //1 msec(needs to be verified) + LPC_TIM0->MCR = 3; //interrupt and reset control + //3 = Interrupt & reset timer0 on match + //1 = Interrupt only, no reset of timer0 + NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt + LPC_TIM0->TCR = 1; //enable Timer0 + printf("Done timer_init\n\r"); +} + +void play_tone(int freq, int dur) +{ + speaker.period(1.0/freq); // 500hz period + speaker = 0.2; //50% duty cycle - max volume + wait(dur/1000.0); + speaker=0.0; // turn off audio +} + +bool check_buffer_format(char *buffer) +{ + bool flag = true;//true - valid input; false - invalid input + int buffer_length = strlen(buffer); + int i = 0; + for (i=0; i<buffer_length; i++) { + //check if buffer[0:2] & buffer[4:6] are #s + if (i==0 || i==1 || i==2 || i==4 || i==5 || i==6){ + if (buffer[i] < '0' || buffer[i] > '9'){ + flag = false; + } + } + //check if buffer[3] is a 'space' + else if (i==3){ + if (buffer[i] != ' '){ + flag = false; + } + } + } + return flag; +} + +/* +void scan_all_rows() +{ + timer0_init(); + global_timer = 0; + while(1) + { + en8.fall(&check_row8); + if (global_timer > 4) { + en1.fall(&check_row1); + //scan next row + if (global_timer > 8) { + en2.fall(&check_row2); + //scan next row + if (global_timer > 12) { + en4.fall(&check_row4); + if (global_timer > 16) { + break; + } + } + } + } + } + usb.printf("row %d is pressed!\n",global_row_index); + global_timer = 0; +} +*/ +void key_1(){ + global_key_index = 0; + printf("1 is pressed!\n"); +} +void key_2(){ + global_key_index = 1; + printf("2 is pressed!\n"); +} +void key_3(){ + global_key_index = 2; + printf("3 is pressed!\n"); +} +void key_A(){ + global_key_index = 3; + printf("A is pressed!\n"); +} \ No newline at end of file