new

Dependencies:   mbed

Committer:
jaredwil
Date:
Sun Feb 22 18:05:52 2015 +0000
Revision:
2:94a34bcf8f09
Parent:
1:461a4f04db9b
Child:
3:b5c5c73c5bbf
commented;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jaredwil 0:89cc1300ce7e 1 #include "mbed.h"
jaredwil 0:89cc1300ce7e 2 #include <map>
jaredwil 0:89cc1300ce7e 3 #include <string>
jaredwil 0:89cc1300ce7e 4
jaredwil 0:89cc1300ce7e 5 //Initialize serial comms
jaredwil 0:89cc1300ce7e 6 Serial pc(USBTX, USBRX);
jaredwil 0:89cc1300ce7e 7
jaredwil 1:461a4f04db9b 8 PwmOut PWMh(p22);
jaredwil 1:461a4f04db9b 9 //because both use same ticker make a new manual pmw
jaredwil 1:461a4f04db9b 10 DigitalOut PWMl(p21);
jaredwil 1:461a4f04db9b 11 Ticker PWMcont;
jaredwil 1:461a4f04db9b 12 //PwmOut PWMl(p21);
jaredwil 0:89cc1300ce7e 13
jaredwil 1:461a4f04db9b 14 DigitalOut row1(p26);
jaredwil 1:461a4f04db9b 15 DigitalOut row2(p23);
jaredwil 1:461a4f04db9b 16 DigitalOut row3(p24);
jaredwil 1:461a4f04db9b 17 DigitalOut row4(p25);
jaredwil 0:89cc1300ce7e 18
jaredwil 0:89cc1300ce7e 19 DigitalIn col1(p20);
jaredwil 0:89cc1300ce7e 20 DigitalIn col2(p19);
jaredwil 0:89cc1300ce7e 21 DigitalIn col3(p18);
jaredwil 0:89cc1300ce7e 22 DigitalIn col4(p17);
jaredwil 0:89cc1300ce7e 23 Timer t1;
jaredwil 0:89cc1300ce7e 24
jaredwil 2:94a34bcf8f09 25 //map for keypad and DTMF
jaredwil 0:89cc1300ce7e 26 map<int, char> keypadMap;
jaredwil 0:89cc1300ce7e 27 map<int, char *> dtmfMap;
jaredwil 0:89cc1300ce7e 28
jaredwil 2:94a34bcf8f09 29 //global on for PWMl (low freqency)
jaredwil 1:461a4f04db9b 30 int on = 0;
jaredwil 1:461a4f04db9b 31
jaredwil 2:94a34bcf8f09 32 //Map for keypad
jaredwil 2:94a34bcf8f09 33 //First 4 bits corrospond to active column
jaredwil 2:94a34bcf8f09 34 //Last 4 bits corrospond to active row
jaredwil 2:94a34bcf8f09 35
jaredwil 2:94a34bcf8f09 36 //DTMF
jaredwil 2:94a34bcf8f09 37 //Maps the current input to appropriate two
jaredwil 2:94a34bcf8f09 38 //frequencies
jaredwil 0:89cc1300ce7e 39 void init(){
jaredwil 0:89cc1300ce7e 40 keypadMap[0x11]='1';
jaredwil 0:89cc1300ce7e 41 keypadMap[0x12]='2';
jaredwil 0:89cc1300ce7e 42 keypadMap[0x14]='3';
jaredwil 0:89cc1300ce7e 43 keypadMap[0x18]='A';
jaredwil 0:89cc1300ce7e 44 keypadMap[0x21]='4';
jaredwil 0:89cc1300ce7e 45 keypadMap[0x22]='5';
jaredwil 0:89cc1300ce7e 46 keypadMap[0x24]='6';
jaredwil 0:89cc1300ce7e 47 keypadMap[0x28]='B';
jaredwil 0:89cc1300ce7e 48 keypadMap[0x41]='7';
jaredwil 0:89cc1300ce7e 49 keypadMap[0x42]='8';
jaredwil 0:89cc1300ce7e 50 keypadMap[0x44]='9';
jaredwil 0:89cc1300ce7e 51 keypadMap[0x48]='C';
jaredwil 0:89cc1300ce7e 52 keypadMap[0x81]='*';
jaredwil 0:89cc1300ce7e 53 keypadMap[0x82]='0';
jaredwil 0:89cc1300ce7e 54 keypadMap[0x84]='#';
jaredwil 0:89cc1300ce7e 55 keypadMap[0x88]='D';
jaredwil 0:89cc1300ce7e 56
jaredwil 0:89cc1300ce7e 57 dtmfMap[0x11]="1029,697"; //1
jaredwil 0:89cc1300ce7e 58 dtmfMap[0x12]="1336,697"; //2
jaredwil 0:89cc1300ce7e 59 dtmfMap[0x14]="1477,697"; //3
jaredwil 0:89cc1300ce7e 60 dtmfMap[0x18]="1633,697"; //A
jaredwil 0:89cc1300ce7e 61 dtmfMap[0x21]="1209,770"; //4
jaredwil 0:89cc1300ce7e 62 dtmfMap[0x22]="1336,770"; //5
jaredwil 0:89cc1300ce7e 63 dtmfMap[0x24]="1477,770"; //6
jaredwil 0:89cc1300ce7e 64 dtmfMap[0x28]="1633,770"; //B
jaredwil 0:89cc1300ce7e 65 dtmfMap[0x41]="1209,852"; //7
jaredwil 0:89cc1300ce7e 66 dtmfMap[0x42]="1336,852"; //8
jaredwil 0:89cc1300ce7e 67 dtmfMap[0x44]="1477,852"; //9
jaredwil 0:89cc1300ce7e 68 dtmfMap[0x48]="1633,852"; //C
jaredwil 0:89cc1300ce7e 69 dtmfMap[0x81]="1209,941"; //*
jaredwil 0:89cc1300ce7e 70 dtmfMap[0x82]="1336,941"; //0
jaredwil 0:89cc1300ce7e 71 dtmfMap[0x84]="1477,941"; //#
jaredwil 0:89cc1300ce7e 72 dtmfMap[0x88]="1633,941"; //D
jaredwil 0:89cc1300ce7e 73 }
jaredwil 0:89cc1300ce7e 74
jaredwil 2:94a34bcf8f09 75 //Flip function is attached to ticker to flip
jaredwil 2:94a34bcf8f09 76 //PWMl (low Frequency)
jaredwil 1:461a4f04db9b 77 void flip() {
jaredwil 1:461a4f04db9b 78 if(on == 1)
jaredwil 1:461a4f04db9b 79 PWMl = !PWMl;
jaredwil 1:461a4f04db9b 80 else
jaredwil 1:461a4f04db9b 81 PWMl = 0;
jaredwil 1:461a4f04db9b 82 }
jaredwil 1:461a4f04db9b 83
jaredwil 0:89cc1300ce7e 84 int main() {
jaredwil 0:89cc1300ce7e 85 init();
jaredwil 0:89cc1300ce7e 86 //Initialize rows to 0
jaredwil 0:89cc1300ce7e 87 row1 = 0;
jaredwil 0:89cc1300ce7e 88 row2 = 0;
jaredwil 0:89cc1300ce7e 89 row3 = 0;
jaredwil 0:89cc1300ce7e 90 row4 = 0;
jaredwil 1:461a4f04db9b 91 PWMl = 0;
jaredwil 0:89cc1300ce7e 92 t1.start();
jaredwil 0:89cc1300ce7e 93 int cur_input = 0x00;
jaredwil 0:89cc1300ce7e 94 int prev_input = 0x00;
jaredwil 1:461a4f04db9b 95
jaredwil 1:461a4f04db9b 96 //main loop
jaredwil 0:89cc1300ce7e 97 while(1) {
jaredwil 1:461a4f04db9b 98
jaredwil 1:461a4f04db9b 99
jaredwil 1:461a4f04db9b 100 //If there was no previous input than switch rows
jaredwil 1:461a4f04db9b 101 if(prev_input == 0){
jaredwil 1:461a4f04db9b 102 //make all rows 0 to add stability
jaredwil 1:461a4f04db9b 103 row1 = 0;
jaredwil 1:461a4f04db9b 104 row2 = 0;
jaredwil 1:461a4f04db9b 105 row3 = 0;
jaredwil 1:461a4f04db9b 106 row4 = 0;
jaredwil 1:461a4f04db9b 107 //Keep each pin on for 4ms
jaredwil 1:461a4f04db9b 108 //"turn on" appropriat bit in map when on.
jaredwil 1:461a4f04db9b 109 switch(t1.read_ms()%4){
jaredwil 1:461a4f04db9b 110 case 0:
jaredwil 1:461a4f04db9b 111 row1 = 1;
jaredwil 1:461a4f04db9b 112 cur_input |= 0x10;
jaredwil 1:461a4f04db9b 113 break;
jaredwil 1:461a4f04db9b 114 case 1:
jaredwil 1:461a4f04db9b 115 row2 = 1;
jaredwil 1:461a4f04db9b 116 cur_input |= 0x20;
jaredwil 1:461a4f04db9b 117 break;
jaredwil 1:461a4f04db9b 118 case 2:
jaredwil 1:461a4f04db9b 119 row3 = 1;
jaredwil 1:461a4f04db9b 120 cur_input |= 0x40;
jaredwil 1:461a4f04db9b 121 break;
jaredwil 1:461a4f04db9b 122 case 3:
jaredwil 1:461a4f04db9b 123 row4 = 1;
jaredwil 1:461a4f04db9b 124 cur_input |= 0x80;
jaredwil 1:461a4f04db9b 125 break;
jaredwil 1:461a4f04db9b 126 }
jaredwil 2:94a34bcf8f09 127 }
jaredwil 1:461a4f04db9b 128
jaredwil 1:461a4f04db9b 129
jaredwil 0:89cc1300ce7e 130
jaredwil 1:461a4f04db9b 131
jaredwil 1:461a4f04db9b 132 //Check each colum to see if it is high
jaredwil 1:461a4f04db9b 133 //if it is "turn on" that respective bit
jaredwil 1:461a4f04db9b 134 if(col1 == 1)
jaredwil 1:461a4f04db9b 135 cur_input |= 0x01;
jaredwil 1:461a4f04db9b 136 else if(col2 == 1)
jaredwil 1:461a4f04db9b 137 cur_input |= 0x02;
jaredwil 1:461a4f04db9b 138 else if(col3 == 1)
jaredwil 1:461a4f04db9b 139 cur_input |= 0x04;
jaredwil 1:461a4f04db9b 140 else if(col4 == 1)
jaredwil 1:461a4f04db9b 141 cur_input |= 0x08;
jaredwil 1:461a4f04db9b 142 else cur_input = 0; //Detect button release or no input set input to 0
jaredwil 1:461a4f04db9b 143
jaredwil 1:461a4f04db9b 144 //If curr input is non zero continue
jaredwil 1:461a4f04db9b 145 if(cur_input) {
jaredwil 1:461a4f04db9b 146 if(cur_input != prev_input) {
jaredwil 1:461a4f04db9b 147 char c = keypadMap[cur_input]; //assign charcter based on input
jaredwil 1:461a4f04db9b 148 if(c != 0){
jaredwil 1:461a4f04db9b 149 pc.printf("%c\r",c); //print input and char
jaredwil 1:461a4f04db9b 150 }
jaredwil 2:94a34bcf8f09 151
jaredwil 2:94a34bcf8f09 152 //Assign freql and freqh based on current input
jaredwil 1:461a4f04db9b 153 float freqh,freql;
jaredwil 1:461a4f04db9b 154 char *freq = dtmfMap[cur_input];
jaredwil 1:461a4f04db9b 155 sscanf(freq,"%f,%f",&freqh,&freql);
jaredwil 1:461a4f04db9b 156 pc.printf("High:%f, Low:%f\r",freqh,freql);
jaredwil 1:461a4f04db9b 157
jaredwil 1:461a4f04db9b 158
jaredwil 1:461a4f04db9b 159
jaredwil 2:94a34bcf8f09 160 //Set the low frequency on ticker
jaredwil 1:461a4f04db9b 161 on = 1;
jaredwil 2:94a34bcf8f09 162 PWMcont.attach(&flip, (1/(2*freql))); // the address of the function to be attached (flip) and the interval (1/freql)
jaredwil 2:94a34bcf8f09 163 //Set the high frequency on PWMout
jaredwil 1:461a4f04db9b 164 PWMh.period(1/freqh); // set PWM period to user specified for high tone
jaredwil 1:461a4f04db9b 165 PWMh=0.5; // set duty cycle to 50%
jaredwil 1:461a4f04db9b 166
jaredwil 1:461a4f04db9b 167 }
jaredwil 1:461a4f04db9b 168
jaredwil 0:89cc1300ce7e 169 }
jaredwil 1:461a4f04db9b 170 //Turn off pulse width modulation if curr input is 0
jaredwil 1:461a4f04db9b 171 else {
jaredwil 1:461a4f04db9b 172 PWMh = 0.0;
jaredwil 1:461a4f04db9b 173 //PWMl = 0.0;
jaredwil 1:461a4f04db9b 174 on = 0;
jaredwil 1:461a4f04db9b 175 }
jaredwil 1:461a4f04db9b 176
jaredwil 1:461a4f04db9b 177 //Maintain the past input
jaredwil 1:461a4f04db9b 178 prev_input = cur_input;
jaredwil 1:461a4f04db9b 179
jaredwil 1:461a4f04db9b 180
jaredwil 0:89cc1300ce7e 181 }
jaredwil 1:461a4f04db9b 182
jaredwil 0:89cc1300ce7e 183 }