
This is a simplified version of home alarm system for CE323/CE860 (Advanced Embedded Systems Design) in the University of Essex.
main.cpp@0:df2226ca976c, 2017-02-17 (annotated)
- Committer:
- liruihao2008
- Date:
- Fri Feb 17 17:13:43 2017 +0000
- Revision:
- 0:df2226ca976c
This is a simplified version for home alarm system in the University of Essex.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
liruihao2008 | 0:df2226ca976c | 1 | /*============================================================================= |
liruihao2008 | 0:df2226ca976c | 2 | Copyright University of Essex 2017 |
liruihao2008 | 0:df2226ca976c | 3 | Author: Ruihao Li |
liruihao2008 | 0:df2226ca976c | 4 | |
liruihao2008 | 0:df2226ca976c | 5 | FILE - main.c |
liruihao2008 | 0:df2226ca976c | 6 | mbed LPC1768 application. |
liruihao2008 | 0:df2226ca976c | 7 | |
liruihao2008 | 0:df2226ca976c | 8 | DESCRIPTION |
liruihao2008 | 0:df2226ca976c | 9 | alarm 1 laboratory solution. |
liruihao2008 | 0:df2226ca976c | 10 | hardware: mbed LPC1768, an extension board. |
liruihao2008 | 0:df2226ca976c | 11 | Use a terminal program such as 'HyperTerminal' to communicate with the application. |
liruihao2008 | 0:df2226ca976c | 12 | The serial port configuration is shown below. |
liruihao2008 | 0:df2226ca976c | 13 | 9600 Baud |
liruihao2008 | 0:df2226ca976c | 14 | 8 data bits |
liruihao2008 | 0:df2226ca976c | 15 | No parity bits |
liruihao2008 | 0:df2226ca976c | 16 | One stop bit |
liruihao2008 | 0:df2226ca976c | 17 | No hardware flow control |
liruihao2008 | 0:df2226ca976c | 18 | ==============================================================================*/ |
liruihao2008 | 0:df2226ca976c | 19 | |
liruihao2008 | 0:df2226ca976c | 20 | |
liruihao2008 | 0:df2226ca976c | 21 | /****************************************************************************** |
liruihao2008 | 0:df2226ca976c | 22 | Include head files. |
liruihao2008 | 0:df2226ca976c | 23 | ******************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 24 | #include "mbed.h" |
liruihao2008 | 0:df2226ca976c | 25 | #include "TextLCD.h" |
liruihao2008 | 0:df2226ca976c | 26 | |
liruihao2008 | 0:df2226ca976c | 27 | // TextLCD |
liruihao2008 | 0:df2226ca976c | 28 | TextLCD lcd(p15, p16, p17, p18, p19, p20);//, TextLCD::LCD20x4); // rs, e, d4-d7 |
liruihao2008 | 0:df2226ca976c | 29 | |
liruihao2008 | 0:df2226ca976c | 30 | // Read from switches and keypad |
liruihao2008 | 0:df2226ca976c | 31 | BusOut rows(p26,p25,p24); |
liruihao2008 | 0:df2226ca976c | 32 | BusIn cols(p14,p13,p12,p11); |
liruihao2008 | 0:df2226ca976c | 33 | |
liruihao2008 | 0:df2226ca976c | 34 | // Control external LEDs |
liruihao2008 | 0:df2226ca976c | 35 | SPI sw(p5, p6, p7); |
liruihao2008 | 0:df2226ca976c | 36 | DigitalOut cs(p8); |
liruihao2008 | 0:df2226ca976c | 37 | |
liruihao2008 | 0:df2226ca976c | 38 | // Serial USB |
liruihao2008 | 0:df2226ca976c | 39 | Serial pc(USBTX, USBRX); // tx, rx |
liruihao2008 | 0:df2226ca976c | 40 | |
liruihao2008 | 0:df2226ca976c | 41 | // Temperature reading |
liruihao2008 | 0:df2226ca976c | 42 | I2C i2c(p9, p10); // I2C: SDA, SCL |
liruihao2008 | 0:df2226ca976c | 43 | |
liruihao2008 | 0:df2226ca976c | 44 | DigitalOut Sounder(LED1); |
liruihao2008 | 0:df2226ca976c | 45 | DigitalOut led4(LED4); |
liruihao2008 | 0:df2226ca976c | 46 | |
liruihao2008 | 0:df2226ca976c | 47 | /****************************************************************************** |
liruihao2008 | 0:df2226ca976c | 48 | Declaration of functions. |
liruihao2008 | 0:df2226ca976c | 49 | ******************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 50 | void alarmConfig(void); |
liruihao2008 | 0:df2226ca976c | 51 | void alarm_state(); |
liruihao2008 | 0:df2226ca976c | 52 | |
liruihao2008 | 0:df2226ca976c | 53 | int read_switch(void); |
liruihao2008 | 0:df2226ca976c | 54 | int switchleds(void); |
liruihao2008 | 0:df2226ca976c | 55 | void initleds(); |
liruihao2008 | 0:df2226ca976c | 56 | void setleds(int ledall); |
liruihao2008 | 0:df2226ca976c | 57 | void setled(int ledno, int ledstate); |
liruihao2008 | 0:df2226ca976c | 58 | int readled(int ledno); |
liruihao2008 | 0:df2226ca976c | 59 | int readleds(); |
liruihao2008 | 0:df2226ca976c | 60 | |
liruihao2008 | 0:df2226ca976c | 61 | char getKey(); |
liruihao2008 | 0:df2226ca976c | 62 | void setKey(void); |
liruihao2008 | 0:df2226ca976c | 63 | int testCode(void); |
liruihao2008 | 0:df2226ca976c | 64 | |
liruihao2008 | 0:df2226ca976c | 65 | void sounder_blink(); |
liruihao2008 | 0:df2226ca976c | 66 | void pattern(void); |
liruihao2008 | 0:df2226ca976c | 67 | void patternoff(void); |
liruihao2008 | 0:df2226ca976c | 68 | void Sounderoff(void); |
liruihao2008 | 0:df2226ca976c | 69 | |
liruihao2008 | 0:df2226ca976c | 70 | void system_alarm(void); |
liruihao2008 | 0:df2226ca976c | 71 | void system_set(void); |
liruihao2008 | 0:df2226ca976c | 72 | |
liruihao2008 | 0:df2226ca976c | 73 | /****************************************************************************** |
liruihao2008 | 0:df2226ca976c | 74 | Global variables. |
liruihao2008 | 0:df2226ca976c | 75 | ******************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 76 | enum State {unset, exits, set, entry, alarm, report} state; |
liruihao2008 | 0:df2226ca976c | 77 | char Keytable[] = { 'F', 'E', 'D', 'C', |
liruihao2008 | 0:df2226ca976c | 78 | '3', '6', '9', 'B', |
liruihao2008 | 0:df2226ca976c | 79 | '2', '5', '8', '0', |
liruihao2008 | 0:df2226ca976c | 80 | '1', '4', '7', 'A' |
liruihao2008 | 0:df2226ca976c | 81 | }; |
liruihao2008 | 0:df2226ca976c | 82 | char keyCode[] = {'1','2','3','4'}; |
liruihao2008 | 0:df2226ca976c | 83 | char code[4]; |
liruihao2008 | 0:df2226ca976c | 84 | int fail = 0; // number of failed attempts |
liruihao2008 | 0:df2226ca976c | 85 | int success; // 0~4: number of successful matched keycodes; 5 indicates switch changing; 6 indicates time expired |
liruihao2008 | 0:df2226ca976c | 86 | int zone; |
liruihao2008 | 0:df2226ca976c | 87 | int led_bits = 0; // global LED status used for readback |
liruihao2008 | 0:df2226ca976c | 88 | bool time_expired ; |
liruihao2008 | 0:df2226ca976c | 89 | Ticker timer; |
liruihao2008 | 0:df2226ca976c | 90 | Timeout t_alarm, t_entry, t_exit; |
liruihao2008 | 0:df2226ca976c | 91 | |
liruihao2008 | 0:df2226ca976c | 92 | /*============================================================================= |
liruihao2008 | 0:df2226ca976c | 93 | |
liruihao2008 | 0:df2226ca976c | 94 | FILE - main.cpp |
liruihao2008 | 0:df2226ca976c | 95 | |
liruihao2008 | 0:df2226ca976c | 96 | DESCRIPTION |
liruihao2008 | 0:df2226ca976c | 97 | Initiates the Finite State Machine |
liruihao2008 | 0:df2226ca976c | 98 | =============================================================================*/ |
liruihao2008 | 0:df2226ca976c | 99 | int main() { |
liruihao2008 | 0:df2226ca976c | 100 | alarmConfig(); |
liruihao2008 | 0:df2226ca976c | 101 | |
liruihao2008 | 0:df2226ca976c | 102 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 103 | lcd.locate(2,0); |
liruihao2008 | 0:df2226ca976c | 104 | lcd.printf("Alarm Lab"); |
liruihao2008 | 0:df2226ca976c | 105 | pc.printf("\n\n\r ALARM LAB\n\r (c)Copyright University of Essex 2017 \n\r Author: Ruihao Li\n\r"); |
liruihao2008 | 0:df2226ca976c | 106 | |
liruihao2008 | 0:df2226ca976c | 107 | setKey(); |
liruihao2008 | 0:df2226ca976c | 108 | while (1){ |
liruihao2008 | 0:df2226ca976c | 109 | switchleds(); |
liruihao2008 | 0:df2226ca976c | 110 | alarm_state(); // FSM routine |
liruihao2008 | 0:df2226ca976c | 111 | } |
liruihao2008 | 0:df2226ca976c | 112 | } |
liruihao2008 | 0:df2226ca976c | 113 | |
liruihao2008 | 0:df2226ca976c | 114 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 115 | Finite State Machine for Alarm |
liruihao2008 | 0:df2226ca976c | 116 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 117 | void alarm_state(){ |
liruihao2008 | 0:df2226ca976c | 118 | int s; |
liruihao2008 | 0:df2226ca976c | 119 | |
liruihao2008 | 0:df2226ca976c | 120 | switch(state){ |
liruihao2008 | 0:df2226ca976c | 121 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 122 | UN_SET STATE (STATE 1) |
liruihao2008 | 0:df2226ca976c | 123 | un_set led enabled |
liruihao2008 | 0:df2226ca976c | 124 | Internal sounder disabledabled |
liruihao2008 | 0:df2226ca976c | 125 | Sensors not monitored. |
liruihao2008 | 0:df2226ca976c | 126 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 127 | case unset: |
liruihao2008 | 0:df2226ca976c | 128 | setled(8,3); // turn unset led on |
liruihao2008 | 0:df2226ca976c | 129 | pc.printf("\n\r Unset mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 130 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 131 | lcd.printf("Unset mode"); |
liruihao2008 | 0:df2226ca976c | 132 | |
liruihao2008 | 0:df2226ca976c | 133 | success = testCode(); |
liruihao2008 | 0:df2226ca976c | 134 | if (success == 4) { |
liruihao2008 | 0:df2226ca976c | 135 | fail = 0; // failure counter reset |
liruihao2008 | 0:df2226ca976c | 136 | state = exits; |
liruihao2008 | 0:df2226ca976c | 137 | } |
liruihao2008 | 0:df2226ca976c | 138 | else if (fail == 2) { |
liruihao2008 | 0:df2226ca976c | 139 | pc.printf("\n\r attemp %d", fail+1); |
liruihao2008 | 0:df2226ca976c | 140 | state = alarm; |
liruihao2008 | 0:df2226ca976c | 141 | zone = 5; // zone identifier(5 represents an invalid code is entered three times) |
liruihao2008 | 0:df2226ca976c | 142 | fail = 0; //failure counter reset |
liruihao2008 | 0:df2226ca976c | 143 | } |
liruihao2008 | 0:df2226ca976c | 144 | else{ |
liruihao2008 | 0:df2226ca976c | 145 | fail++; |
liruihao2008 | 0:df2226ca976c | 146 | state = unset; |
liruihao2008 | 0:df2226ca976c | 147 | pc.printf("\n\r attemp %d", fail); |
liruihao2008 | 0:df2226ca976c | 148 | } |
liruihao2008 | 0:df2226ca976c | 149 | break; |
liruihao2008 | 0:df2226ca976c | 150 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 151 | EXIT STATE (STATE 2) |
liruihao2008 | 0:df2226ca976c | 152 | un_set led flashes |
liruihao2008 | 0:df2226ca976c | 153 | Internal sounder enabled for 250msec every 500msec. |
liruihao2008 | 0:df2226ca976c | 154 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 155 | case exits: |
liruihao2008 | 0:df2226ca976c | 156 | setled(7,3); // turn exits led on |
liruihao2008 | 0:df2226ca976c | 157 | pattern(); // Sounder switches on and then off at 250ms intervals |
liruihao2008 | 0:df2226ca976c | 158 | pc.printf("\n\r Exit mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 159 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 160 | lcd.printf("Exit mode"); |
liruihao2008 | 0:df2226ca976c | 161 | |
liruihao2008 | 0:df2226ca976c | 162 | // you should program here! |
liruihao2008 | 0:df2226ca976c | 163 | |
liruihao2008 | 0:df2226ca976c | 164 | |
liruihao2008 | 0:df2226ca976c | 165 | |
liruihao2008 | 0:df2226ca976c | 166 | break; |
liruihao2008 | 0:df2226ca976c | 167 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 168 | SET STATE (STATE 3) |
liruihao2008 | 0:df2226ca976c | 169 | set led enabled |
liruihao2008 | 0:df2226ca976c | 170 | Internal sounder disabled. |
liruihao2008 | 0:df2226ca976c | 171 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 172 | case set: |
liruihao2008 | 0:df2226ca976c | 173 | setled(6,3); // turn set led on |
liruihao2008 | 0:df2226ca976c | 174 | |
liruihao2008 | 0:df2226ca976c | 175 | pc.printf("\n\r Set mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 176 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 177 | lcd.printf("Set mode"); |
liruihao2008 | 0:df2226ca976c | 178 | |
liruihao2008 | 0:df2226ca976c | 179 | |
liruihao2008 | 0:df2226ca976c | 180 | // you should program here! |
liruihao2008 | 0:df2226ca976c | 181 | |
liruihao2008 | 0:df2226ca976c | 182 | break; |
liruihao2008 | 0:df2226ca976c | 183 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 184 | ENTRY STATE (STATE 4) |
liruihao2008 | 0:df2226ca976c | 185 | un_set led flashes |
liruihao2008 | 0:df2226ca976c | 186 | Internal sounder enabled for 250ms every 500ms. |
liruihao2008 | 0:df2226ca976c | 187 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 188 | case entry: |
liruihao2008 | 0:df2226ca976c | 189 | setled(5,3); // turn entry led on |
liruihao2008 | 0:df2226ca976c | 190 | pattern(); // Sounder switches on and then off at 250ms intervals |
liruihao2008 | 0:df2226ca976c | 191 | |
liruihao2008 | 0:df2226ca976c | 192 | pc.printf("\n\r Entry mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 193 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 194 | lcd.printf("Entry mode"); |
liruihao2008 | 0:df2226ca976c | 195 | |
liruihao2008 | 0:df2226ca976c | 196 | // you should program here! |
liruihao2008 | 0:df2226ca976c | 197 | |
liruihao2008 | 0:df2226ca976c | 198 | break; |
liruihao2008 | 0:df2226ca976c | 199 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 200 | ALARM STATE (STATE 5) |
liruihao2008 | 0:df2226ca976c | 201 | alarm led enabled |
liruihao2008 | 0:df2226ca976c | 202 | Internal and External sounders enabled. |
liruihao2008 | 0:df2226ca976c | 203 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 204 | case alarm: |
liruihao2008 | 0:df2226ca976c | 205 | setled(4,3); // turn entry led on |
liruihao2008 | 0:df2226ca976c | 206 | Sounder = 1; //Sounder enabled all the time during alarm state |
liruihao2008 | 0:df2226ca976c | 207 | |
liruihao2008 | 0:df2226ca976c | 208 | pc.printf("\n\r Alarm mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 209 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 210 | lcd.printf("Alarm mode"); |
liruihao2008 | 0:df2226ca976c | 211 | |
liruihao2008 | 0:df2226ca976c | 212 | // you should program here! |
liruihao2008 | 0:df2226ca976c | 213 | |
liruihao2008 | 0:df2226ca976c | 214 | break; |
liruihao2008 | 0:df2226ca976c | 215 | /*-------------------------------------------------------------------------------- |
liruihao2008 | 0:df2226ca976c | 216 | REPORT (STATE 6) |
liruihao2008 | 0:df2226ca976c | 217 | un-set and alarm leds enabled |
liruihao2008 | 0:df2226ca976c | 218 | Internal sounder remains enabled. |
liruihao2008 | 0:df2226ca976c | 219 | External sounder enabled. |
liruihao2008 | 0:df2226ca976c | 220 | ---------------------------------------------------------------------------------*/ |
liruihao2008 | 0:df2226ca976c | 221 | case report: |
liruihao2008 | 0:df2226ca976c | 222 | setled(3,3); // turn entry led on |
liruihao2008 | 0:df2226ca976c | 223 | |
liruihao2008 | 0:df2226ca976c | 224 | pc.printf("\n\r Report mode\n\r"); |
liruihao2008 | 0:df2226ca976c | 225 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 226 | lcd.printf("Zone numbers:%i",zone); |
liruihao2008 | 0:df2226ca976c | 227 | lcd.locate(0,1); |
liruihao2008 | 0:df2226ca976c | 228 | lcd.printf("C key to clear"); |
liruihao2008 | 0:df2226ca976c | 229 | |
liruihao2008 | 0:df2226ca976c | 230 | while (1){ |
liruihao2008 | 0:df2226ca976c | 231 | char b = getKey(); |
liruihao2008 | 0:df2226ca976c | 232 | if (b == 'C'){ |
liruihao2008 | 0:df2226ca976c | 233 | state = unset; |
liruihao2008 | 0:df2226ca976c | 234 | break; |
liruihao2008 | 0:df2226ca976c | 235 | } |
liruihao2008 | 0:df2226ca976c | 236 | } |
liruihao2008 | 0:df2226ca976c | 237 | break; |
liruihao2008 | 0:df2226ca976c | 238 | } // end switch(state) |
liruihao2008 | 0:df2226ca976c | 239 | |
liruihao2008 | 0:df2226ca976c | 240 | } // end alarm_state() |
liruihao2008 | 0:df2226ca976c | 241 | |
liruihao2008 | 0:df2226ca976c | 242 | |
liruihao2008 | 0:df2226ca976c | 243 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 244 | Configurations |
liruihao2008 | 0:df2226ca976c | 245 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 246 | void alarmConfig() |
liruihao2008 | 0:df2226ca976c | 247 | { |
liruihao2008 | 0:df2226ca976c | 248 | cs=0; |
liruihao2008 | 0:df2226ca976c | 249 | sw.format(16,0); |
liruihao2008 | 0:df2226ca976c | 250 | sw.frequency(1000000); |
liruihao2008 | 0:df2226ca976c | 251 | |
liruihao2008 | 0:df2226ca976c | 252 | state = unset; // Initial state |
liruihao2008 | 0:df2226ca976c | 253 | |
liruihao2008 | 0:df2226ca976c | 254 | led_bits = 0x0000; // turn off all the external leds |
liruihao2008 | 0:df2226ca976c | 255 | sw.write(led_bits); |
liruihao2008 | 0:df2226ca976c | 256 | cs = 1; |
liruihao2008 | 0:df2226ca976c | 257 | cs = 0; |
liruihao2008 | 0:df2226ca976c | 258 | } |
liruihao2008 | 0:df2226ca976c | 259 | |
liruihao2008 | 0:df2226ca976c | 260 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 261 | External switches |
liruihao2008 | 0:df2226ca976c | 262 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 263 | int read_switch() |
liruihao2008 | 0:df2226ca976c | 264 | { |
liruihao2008 | 0:df2226ca976c | 265 | rows = 4; |
liruihao2008 | 0:df2226ca976c | 266 | int switches = cols; |
liruihao2008 | 0:df2226ca976c | 267 | rows = 5; |
liruihao2008 | 0:df2226ca976c | 268 | switches = switches*16 + cols; |
liruihao2008 | 0:df2226ca976c | 269 | |
liruihao2008 | 0:df2226ca976c | 270 | return switches; |
liruihao2008 | 0:df2226ca976c | 271 | } |
liruihao2008 | 0:df2226ca976c | 272 | |
liruihao2008 | 0:df2226ca976c | 273 | int switchleds() |
liruihao2008 | 0:df2226ca976c | 274 | { |
liruihao2008 | 0:df2226ca976c | 275 | int switches = read_switch(); |
liruihao2008 | 0:df2226ca976c | 276 | |
liruihao2008 | 0:df2226ca976c | 277 | for(int i=0;i<=7;i++){ |
liruihao2008 | 0:df2226ca976c | 278 | if ((switches & 0x0001<<i)!=0){ // 1, then turn on |
liruihao2008 | 0:df2226ca976c | 279 | led_bits = led_bits | (0x0003 << i*2); } |
liruihao2008 | 0:df2226ca976c | 280 | else { // 0, then turn off |
liruihao2008 | 0:df2226ca976c | 281 | led_bits = led_bits & ((0x0003 << i*2) ^ 0xffff); } |
liruihao2008 | 0:df2226ca976c | 282 | } |
liruihao2008 | 0:df2226ca976c | 283 | sw.write(led_bits); |
liruihao2008 | 0:df2226ca976c | 284 | cs = 1; |
liruihao2008 | 0:df2226ca976c | 285 | cs = 0; |
liruihao2008 | 0:df2226ca976c | 286 | |
liruihao2008 | 0:df2226ca976c | 287 | return switches; |
liruihao2008 | 0:df2226ca976c | 288 | } |
liruihao2008 | 0:df2226ca976c | 289 | |
liruihao2008 | 0:df2226ca976c | 290 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 291 | External LED functionality |
liruihao2008 | 0:df2226ca976c | 292 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 293 | void initleds() { |
liruihao2008 | 0:df2226ca976c | 294 | cs = 0; // latch must start low |
liruihao2008 | 0:df2226ca976c | 295 | sw.format(16,0); // SPI 16 bit data, low state, high going clock |
liruihao2008 | 0:df2226ca976c | 296 | sw.frequency(1000000); // 1MHz clock rate |
liruihao2008 | 0:df2226ca976c | 297 | } |
liruihao2008 | 0:df2226ca976c | 298 | |
liruihao2008 | 0:df2226ca976c | 299 | void setleds(int ledall) { |
liruihao2008 | 0:df2226ca976c | 300 | led_bits = ledall; // update global LED status |
liruihao2008 | 0:df2226ca976c | 301 | sw.write((led_bits & 0x03ff) | ((led_bits & 0xa800) >> 1) | ((led_bits & 0x5400) << 1)); |
liruihao2008 | 0:df2226ca976c | 302 | cs = 1; // latch pulse start |
liruihao2008 | 0:df2226ca976c | 303 | cs = 0; // latch pulse end |
liruihao2008 | 0:df2226ca976c | 304 | } |
liruihao2008 | 0:df2226ca976c | 305 | |
liruihao2008 | 0:df2226ca976c | 306 | void setled(int ledno, int ledstate) { |
liruihao2008 | 0:df2226ca976c | 307 | ledno = 9 - ledno; |
liruihao2008 | 0:df2226ca976c | 308 | ledno = ((ledno - 1) & 0x0007) + 1; // limit led number |
liruihao2008 | 0:df2226ca976c | 309 | ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' |
liruihao2008 | 0:df2226ca976c | 310 | ledstate = ledstate & 0x0003; // limit led state |
liruihao2008 | 0:df2226ca976c | 311 | ledstate = ledstate << ledno; |
liruihao2008 | 0:df2226ca976c | 312 | int statemask = ((0x0003 << ledno) ^ 0xffff); // mask used to clear led state |
liruihao2008 | 0:df2226ca976c | 313 | led_bits = ((led_bits & statemask) | ledstate); // clear and set led state |
liruihao2008 | 0:df2226ca976c | 314 | setleds(led_bits); |
liruihao2008 | 0:df2226ca976c | 315 | } |
liruihao2008 | 0:df2226ca976c | 316 | |
liruihao2008 | 0:df2226ca976c | 317 | int readled(int ledno) { |
liruihao2008 | 0:df2226ca976c | 318 | ledno = 9 - ledno; |
liruihao2008 | 0:df2226ca976c | 319 | ledno = ((ledno - 1) & 0x0007) + 1; // limit led number |
liruihao2008 | 0:df2226ca976c | 320 | ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' |
liruihao2008 | 0:df2226ca976c | 321 | int ledstate = led_bits; |
liruihao2008 | 0:df2226ca976c | 322 | ledstate = ledstate >> ledno; // shift selected led state into ls 2 bits |
liruihao2008 | 0:df2226ca976c | 323 | return (ledstate & 0x0003); // mask out and return led state |
liruihao2008 | 0:df2226ca976c | 324 | } |
liruihao2008 | 0:df2226ca976c | 325 | |
liruihao2008 | 0:df2226ca976c | 326 | int readleds() { |
liruihao2008 | 0:df2226ca976c | 327 | return led_bits; // return LED status |
liruihao2008 | 0:df2226ca976c | 328 | } |
liruihao2008 | 0:df2226ca976c | 329 | |
liruihao2008 | 0:df2226ca976c | 330 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 331 | Keypad functionality |
liruihao2008 | 0:df2226ca976c | 332 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 333 | char getKey() |
liruihao2008 | 0:df2226ca976c | 334 | { |
liruihao2008 | 0:df2226ca976c | 335 | int i,j; |
liruihao2008 | 0:df2226ca976c | 336 | char ch=' '; |
liruihao2008 | 0:df2226ca976c | 337 | |
liruihao2008 | 0:df2226ca976c | 338 | for (i = 0; i <= 3; i++) { |
liruihao2008 | 0:df2226ca976c | 339 | rows = i; |
liruihao2008 | 0:df2226ca976c | 340 | for (j = 0; j <= 3; j++) { |
liruihao2008 | 0:df2226ca976c | 341 | if (((cols ^ 0x00FF) & (0x0001<<j)) != 0) { |
liruihao2008 | 0:df2226ca976c | 342 | ch = Keytable[(i * 4) + j]; |
liruihao2008 | 0:df2226ca976c | 343 | } |
liruihao2008 | 0:df2226ca976c | 344 | } |
liruihao2008 | 0:df2226ca976c | 345 | } |
liruihao2008 | 0:df2226ca976c | 346 | wait(0.2); //debouncing |
liruihao2008 | 0:df2226ca976c | 347 | return ch; |
liruihao2008 | 0:df2226ca976c | 348 | } |
liruihao2008 | 0:df2226ca976c | 349 | |
liruihao2008 | 0:df2226ca976c | 350 | int testCode(void) |
liruihao2008 | 0:df2226ca976c | 351 | { |
liruihao2008 | 0:df2226ca976c | 352 | int a, y; |
liruihao2008 | 0:df2226ca976c | 353 | char b; |
liruihao2008 | 0:df2226ca976c | 354 | |
liruihao2008 | 0:df2226ca976c | 355 | lcd.locate(0, 1); |
liruihao2008 | 0:df2226ca976c | 356 | lcd.printf("Enter Code: ____"); |
liruihao2008 | 0:df2226ca976c | 357 | y = 0; |
liruihao2008 | 0:df2226ca976c | 358 | for(a = 0; a < 4; a++) { |
liruihao2008 | 0:df2226ca976c | 359 | b = getKey(); |
liruihao2008 | 0:df2226ca976c | 360 | switch(b) { |
liruihao2008 | 0:df2226ca976c | 361 | case ' ': |
liruihao2008 | 0:df2226ca976c | 362 | a--; |
liruihao2008 | 0:df2226ca976c | 363 | break; |
liruihao2008 | 0:df2226ca976c | 364 | case 'C': // use 'C' to delete input |
liruihao2008 | 0:df2226ca976c | 365 | if (a > 0){ |
liruihao2008 | 0:df2226ca976c | 366 | a = a-2; |
liruihao2008 | 0:df2226ca976c | 367 | lcd.locate(13+a, 1); |
liruihao2008 | 0:df2226ca976c | 368 | lcd.putc('_'); |
liruihao2008 | 0:df2226ca976c | 369 | if ( code[a+1] == keyCode[a+1]){ |
liruihao2008 | 0:df2226ca976c | 370 | y--; |
liruihao2008 | 0:df2226ca976c | 371 | } |
liruihao2008 | 0:df2226ca976c | 372 | } |
liruihao2008 | 0:df2226ca976c | 373 | else if (a == 0){ |
liruihao2008 | 0:df2226ca976c | 374 | a--; |
liruihao2008 | 0:df2226ca976c | 375 | } |
liruihao2008 | 0:df2226ca976c | 376 | break; |
liruihao2008 | 0:df2226ca976c | 377 | default: |
liruihao2008 | 0:df2226ca976c | 378 | code[a] = b; |
liruihao2008 | 0:df2226ca976c | 379 | lcd.locate(12+a, 1); |
liruihao2008 | 0:df2226ca976c | 380 | lcd.putc('*'); |
liruihao2008 | 0:df2226ca976c | 381 | if(code[a] == keyCode[a]) { |
liruihao2008 | 0:df2226ca976c | 382 | y++; |
liruihao2008 | 0:df2226ca976c | 383 | } |
liruihao2008 | 0:df2226ca976c | 384 | } |
liruihao2008 | 0:df2226ca976c | 385 | } |
liruihao2008 | 0:df2226ca976c | 386 | lcd.cls(); |
liruihao2008 | 0:df2226ca976c | 387 | lcd.locate(0,1); |
liruihao2008 | 0:df2226ca976c | 388 | lcd.printf("Press B to set"); |
liruihao2008 | 0:df2226ca976c | 389 | while (1){ |
liruihao2008 | 0:df2226ca976c | 390 | b = getKey(); |
liruihao2008 | 0:df2226ca976c | 391 | if (b == 'B') |
liruihao2008 | 0:df2226ca976c | 392 | break; |
liruihao2008 | 0:df2226ca976c | 393 | } |
liruihao2008 | 0:df2226ca976c | 394 | |
liruihao2008 | 0:df2226ca976c | 395 | return(y); |
liruihao2008 | 0:df2226ca976c | 396 | } |
liruihao2008 | 0:df2226ca976c | 397 | |
liruihao2008 | 0:df2226ca976c | 398 | void setKey(void) |
liruihao2008 | 0:df2226ca976c | 399 | { |
liruihao2008 | 0:df2226ca976c | 400 | int a; |
liruihao2008 | 0:df2226ca976c | 401 | char b; |
liruihao2008 | 0:df2226ca976c | 402 | |
liruihao2008 | 0:df2226ca976c | 403 | lcd.locate(0, 1); |
liruihao2008 | 0:df2226ca976c | 404 | lcd.printf("Init Code: ____"); |
liruihao2008 | 0:df2226ca976c | 405 | for(a = 0; a < 4; a++) { |
liruihao2008 | 0:df2226ca976c | 406 | b = getKey(); |
liruihao2008 | 0:df2226ca976c | 407 | |
liruihao2008 | 0:df2226ca976c | 408 | switch(b){ |
liruihao2008 | 0:df2226ca976c | 409 | case ' ': |
liruihao2008 | 0:df2226ca976c | 410 | a--; |
liruihao2008 | 0:df2226ca976c | 411 | break; |
liruihao2008 | 0:df2226ca976c | 412 | case 'C': |
liruihao2008 | 0:df2226ca976c | 413 | if (a > 0){ |
liruihao2008 | 0:df2226ca976c | 414 | a = a-2; |
liruihao2008 | 0:df2226ca976c | 415 | lcd.locate(13+a, 1); |
liruihao2008 | 0:df2226ca976c | 416 | lcd.putc('_'); |
liruihao2008 | 0:df2226ca976c | 417 | } |
liruihao2008 | 0:df2226ca976c | 418 | else if (a == 0){ |
liruihao2008 | 0:df2226ca976c | 419 | a--; |
liruihao2008 | 0:df2226ca976c | 420 | } |
liruihao2008 | 0:df2226ca976c | 421 | break; |
liruihao2008 | 0:df2226ca976c | 422 | default: |
liruihao2008 | 0:df2226ca976c | 423 | lcd.locate(12+a, 1); |
liruihao2008 | 0:df2226ca976c | 424 | lcd.putc(b); |
liruihao2008 | 0:df2226ca976c | 425 | keyCode[a] = b; |
liruihao2008 | 0:df2226ca976c | 426 | } |
liruihao2008 | 0:df2226ca976c | 427 | } |
liruihao2008 | 0:df2226ca976c | 428 | wait(1); |
liruihao2008 | 0:df2226ca976c | 429 | } |
liruihao2008 | 0:df2226ca976c | 430 | |
liruihao2008 | 0:df2226ca976c | 431 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 432 | Simulation of alarm internal sounder |
liruihao2008 | 0:df2226ca976c | 433 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 434 | void sounder_blink() |
liruihao2008 | 0:df2226ca976c | 435 | { |
liruihao2008 | 0:df2226ca976c | 436 | Sounder = !Sounder; |
liruihao2008 | 0:df2226ca976c | 437 | } |
liruihao2008 | 0:df2226ca976c | 438 | |
liruihao2008 | 0:df2226ca976c | 439 | void pattern(void) |
liruihao2008 | 0:df2226ca976c | 440 | { |
liruihao2008 | 0:df2226ca976c | 441 | timer.attach(&sounder_blink, 0.25); |
liruihao2008 | 0:df2226ca976c | 442 | } |
liruihao2008 | 0:df2226ca976c | 443 | |
liruihao2008 | 0:df2226ca976c | 444 | void patternoff(void) |
liruihao2008 | 0:df2226ca976c | 445 | { |
liruihao2008 | 0:df2226ca976c | 446 | timer.detach(); // turn the Sounder off |
liruihao2008 | 0:df2226ca976c | 447 | Sounder = 0; |
liruihao2008 | 0:df2226ca976c | 448 | } |
liruihao2008 | 0:df2226ca976c | 449 | |
liruihao2008 | 0:df2226ca976c | 450 | void Sounderoff(void) |
liruihao2008 | 0:df2226ca976c | 451 | { |
liruihao2008 | 0:df2226ca976c | 452 | Sounder = 0; |
liruihao2008 | 0:df2226ca976c | 453 | } |
liruihao2008 | 0:df2226ca976c | 454 | |
liruihao2008 | 0:df2226ca976c | 455 | /********************************************************************************** |
liruihao2008 | 0:df2226ca976c | 456 | Set system state |
liruihao2008 | 0:df2226ca976c | 457 | **********************************************************************************/ |
liruihao2008 | 0:df2226ca976c | 458 | void system_alarm(void) |
liruihao2008 | 0:df2226ca976c | 459 | { |
liruihao2008 | 0:df2226ca976c | 460 | state = alarm; |
liruihao2008 | 0:df2226ca976c | 461 | time_expired = true; |
liruihao2008 | 0:df2226ca976c | 462 | } |
liruihao2008 | 0:df2226ca976c | 463 | |
liruihao2008 | 0:df2226ca976c | 464 | void system_set(void) |
liruihao2008 | 0:df2226ca976c | 465 | { |
liruihao2008 | 0:df2226ca976c | 466 | state = set; |
liruihao2008 | 0:df2226ca976c | 467 | time_expired = true; |
liruihao2008 | 0:df2226ca976c | 468 | } |
liruihao2008 | 0:df2226ca976c | 469 |