part3 update

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }