part3 update

Dependencies:   mbed

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?

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