Prototype of SX1508's library
SX1508.cpp@1:56f4a8d6cde7, 2016-05-30 (annotated)
- Committer:
- irsanjul
- Date:
- Mon May 30 07:27:25 2016 +0000
- Revision:
- 1:56f4a8d6cde7
- Parent:
- 0:9b4d494682e0
aaa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
irsanjul | 0:9b4d494682e0 | 1 | #include "SX1508.h" |
irsanjul | 0:9b4d494682e0 | 2 | |
irsanjul | 1:56f4a8d6cde7 | 3 | SX1508::SX1508(PinName sda, PinName scl, char adr) : i2c (sda, scl), _slaveAddress(adr << 1) |
irsanjul | 0:9b4d494682e0 | 4 | { |
irsanjul | 0:9b4d494682e0 | 5 | i2c.frequency(SX1508_FREQ); |
irsanjul | 1:56f4a8d6cde7 | 6 | |
irsanjul | 1:56f4a8d6cde7 | 7 | if (i2c.read(_slaveAddress, &data[0], 1) != 0) printf(RED "I2C device is not detected\r\n" DEF); |
irsanjul | 1:56f4a8d6cde7 | 8 | else printf(GRE "I2C device is detected\r\n" DEF); |
irsanjul | 1:56f4a8d6cde7 | 9 | |
irsanjul | 1:56f4a8d6cde7 | 10 | data[0] = 0; |
irsanjul | 1:56f4a8d6cde7 | 11 | } |
irsanjul | 1:56f4a8d6cde7 | 12 | |
irsanjul | 1:56f4a8d6cde7 | 13 | SX1508::~SX1508() |
irsanjul | 1:56f4a8d6cde7 | 14 | { |
irsanjul | 1:56f4a8d6cde7 | 15 | |
irsanjul | 1:56f4a8d6cde7 | 16 | } |
irsanjul | 1:56f4a8d6cde7 | 17 | |
irsanjul | 1:56f4a8d6cde7 | 18 | bool SX1508::WriteReg(char RegAdr, char data) |
irsanjul | 1:56f4a8d6cde7 | 19 | { |
irsanjul | 1:56f4a8d6cde7 | 20 | w[0] = RegAdr; |
irsanjul | 1:56f4a8d6cde7 | 21 | w[1] = data; |
irsanjul | 1:56f4a8d6cde7 | 22 | if (i2c.write(_slaveAddress, w, 2) != 0) return 0; |
irsanjul | 1:56f4a8d6cde7 | 23 | |
irsanjul | 1:56f4a8d6cde7 | 24 | return true; |
irsanjul | 1:56f4a8d6cde7 | 25 | } |
irsanjul | 1:56f4a8d6cde7 | 26 | |
irsanjul | 1:56f4a8d6cde7 | 27 | void SX1508::WriteBlk(char RegAdr, const char *data, int len) |
irsanjul | 1:56f4a8d6cde7 | 28 | { |
irsanjul | 1:56f4a8d6cde7 | 29 | int i; |
irsanjul | 1:56f4a8d6cde7 | 30 | |
irsanjul | 1:56f4a8d6cde7 | 31 | i2c.start(); |
irsanjul | 1:56f4a8d6cde7 | 32 | i2c.write(_slaveAddress); |
irsanjul | 1:56f4a8d6cde7 | 33 | i2c.write(RegAdr); |
irsanjul | 1:56f4a8d6cde7 | 34 | |
irsanjul | 1:56f4a8d6cde7 | 35 | for (i=0; i<len; i++) |
irsanjul | 1:56f4a8d6cde7 | 36 | { |
irsanjul | 1:56f4a8d6cde7 | 37 | i2c.write(data[i]); |
irsanjul | 1:56f4a8d6cde7 | 38 | wait_ms(1); |
irsanjul | 1:56f4a8d6cde7 | 39 | } |
irsanjul | 1:56f4a8d6cde7 | 40 | |
irsanjul | 1:56f4a8d6cde7 | 41 | i2c.stop(); |
irsanjul | 1:56f4a8d6cde7 | 42 | } |
irsanjul | 1:56f4a8d6cde7 | 43 | |
irsanjul | 1:56f4a8d6cde7 | 44 | char SX1508::ReadReg(char RegAdr) |
irsanjul | 1:56f4a8d6cde7 | 45 | { |
irsanjul | 1:56f4a8d6cde7 | 46 | char start = RegAdr; |
irsanjul | 1:56f4a8d6cde7 | 47 | if (i2c.write(_slaveAddress, &start, 1, true) != 0) return 0; |
irsanjul | 1:56f4a8d6cde7 | 48 | if (i2c.read(_slaveAddress, r, 1) != 0) return 0; |
irsanjul | 1:56f4a8d6cde7 | 49 | |
irsanjul | 1:56f4a8d6cde7 | 50 | return r[0]; |
irsanjul | 0:9b4d494682e0 | 51 | } |
irsanjul | 0:9b4d494682e0 | 52 | |
irsanjul | 1:56f4a8d6cde7 | 53 | bool SX1508::keypad_config(int column, int row, int Debounce_ms, int ScanTime_ms) |
irsanjul | 0:9b4d494682e0 | 54 | { |
irsanjul | 1:56f4a8d6cde7 | 55 | if(Debounce_ms > ScanTime_ms) |
irsanjul | 1:56f4a8d6cde7 | 56 | { |
irsanjul | 1:56f4a8d6cde7 | 57 | printf(RED "Debounce Time must slower than ScanTime_ms\r\n" DEF); |
irsanjul | 1:56f4a8d6cde7 | 58 | return 0; |
irsanjul | 1:56f4a8d6cde7 | 59 | } |
irsanjul | 1:56f4a8d6cde7 | 60 | |
irsanjul | 1:56f4a8d6cde7 | 61 | if(!WriteReg(RegDir, 0xF0)) return 0; // Set RegDir(0x07) to 0xF0 (IO[3-0] as outputs, IO[7-4] as inputs) |
irsanjul | 1:56f4a8d6cde7 | 62 | if(!WriteReg(RegOpenDrain, 0x0F)) return 0; // Set RegOpenDrain to 0x0F (IO[3-0] as open-drain outputs) |
irsanjul | 1:56f4a8d6cde7 | 63 | if(!WriteReg(RegPullUp, 0xF0)) return 0; // Set RegPullup to 0xF0 (pull-ups enabled on inputs IO[7-4]) |
irsanjul | 1:56f4a8d6cde7 | 64 | |
irsanjul | 1:56f4a8d6cde7 | 65 | // set Clock's source |
irsanjul | 1:56f4a8d6cde7 | 66 | if(!WriteReg(RegClock, 0x50)) return 0; // Set RegClock to 0x50 for internal Clock 2MHz |
irsanjul | 1:56f4a8d6cde7 | 67 | |
irsanjul | 1:56f4a8d6cde7 | 68 | /** |
irsanjul | 1:56f4a8d6cde7 | 69 | set Debounce time "RegDebounceConfig" 0x12 : RegDebounceConfig[2:0], RegDebounceConfig[7:3] Not Used = 0 |
irsanjul | 1:56f4a8d6cde7 | 70 | **/ |
irsanjul | 1:56f4a8d6cde7 | 71 | char debounce_config = 0x00; |
irsanjul | 1:56f4a8d6cde7 | 72 | if (Debounce_ms == 1) debounce_config = debounce_config | 0x01; |
irsanjul | 1:56f4a8d6cde7 | 73 | else if (Debounce_ms == 2) debounce_config = debounce_config | 0x02; |
irsanjul | 1:56f4a8d6cde7 | 74 | else if (Debounce_ms == 4) debounce_config = debounce_config | 0x03; |
irsanjul | 1:56f4a8d6cde7 | 75 | else if (Debounce_ms == 8) debounce_config = debounce_config | 0x04; |
irsanjul | 1:56f4a8d6cde7 | 76 | else if (Debounce_ms == 16) debounce_config = debounce_config | 0x05; |
irsanjul | 1:56f4a8d6cde7 | 77 | else if (Debounce_ms == 32) debounce_config = debounce_config | 0x06; |
irsanjul | 1:56f4a8d6cde7 | 78 | else if (Debounce_ms == 64) debounce_config = debounce_config | 0x07; |
irsanjul | 1:56f4a8d6cde7 | 79 | else debounce_config = debounce_config | 0x04; |
irsanjul | 1:56f4a8d6cde7 | 80 | |
irsanjul | 1:56f4a8d6cde7 | 81 | if(!WriteReg(RegDebounceEnable, 0xF0)) return 0; // RegDebounceEnable = 0xF0 |
irsanjul | 1:56f4a8d6cde7 | 82 | if(!WriteReg(RegDebounceConfig, debounce_config)) return 0; // RegDebounceConfig = 0x04. |
irsanjul | 0:9b4d494682e0 | 83 | |
irsanjul | 1:56f4a8d6cde7 | 84 | /** |
irsanjul | 1:56f4a8d6cde7 | 85 | Set Number of row, Number of column, and time for scan a row |
irsanjul | 1:56f4a8d6cde7 | 86 | - set row : RegKeyConfig[6:5], RegKeyConfig[7] not used = 0; |
irsanjul | 1:56f4a8d6cde7 | 87 | - set column : RegKeyConfig[4:3] |
irsanjul | 1:56f4a8d6cde7 | 88 | - set scan time : RegKeyConfig[0:2] |
irsanjul | 1:56f4a8d6cde7 | 89 | **/ |
irsanjul | 1:56f4a8d6cde7 | 90 | char key_config = 0x00; |
irsanjul | 1:56f4a8d6cde7 | 91 | if (row == 0) return 0; // scan key disable |
irsanjul | 1:56f4a8d6cde7 | 92 | else if (row == 2) key_config = key_config | 0x20; |
irsanjul | 1:56f4a8d6cde7 | 93 | else if (row == 3) key_config = key_config | 0x40; |
irsanjul | 1:56f4a8d6cde7 | 94 | else if (row == 4) key_config = key_config | 0x60; |
irsanjul | 1:56f4a8d6cde7 | 95 | else key_config = key_config | 0x60; |
irsanjul | 0:9b4d494682e0 | 96 | |
irsanjul | 1:56f4a8d6cde7 | 97 | if (column == 1) key_config = key_config | 0x00; |
irsanjul | 1:56f4a8d6cde7 | 98 | else if (column == 2) key_config = key_config | 0x08; |
irsanjul | 1:56f4a8d6cde7 | 99 | else if (column == 3) key_config = key_config | 0x10; |
irsanjul | 1:56f4a8d6cde7 | 100 | else if (column == 4) key_config = key_config | 0x18; |
irsanjul | 1:56f4a8d6cde7 | 101 | else key_config = key_config | 0x18; |
irsanjul | 1:56f4a8d6cde7 | 102 | |
irsanjul | 1:56f4a8d6cde7 | 103 | if (ScanTime_ms == 1) key_config = key_config | 0x00; |
irsanjul | 1:56f4a8d6cde7 | 104 | else if (ScanTime_ms == 2) key_config = key_config | 0x01; |
irsanjul | 1:56f4a8d6cde7 | 105 | else if (ScanTime_ms == 4) key_config = key_config | 0x02; |
irsanjul | 1:56f4a8d6cde7 | 106 | else if (ScanTime_ms == 8) key_config = key_config | 0x03; |
irsanjul | 1:56f4a8d6cde7 | 107 | else if (ScanTime_ms == 16) key_config = key_config | 0x04; |
irsanjul | 1:56f4a8d6cde7 | 108 | else if (ScanTime_ms == 32) key_config = key_config | 0x05; |
irsanjul | 1:56f4a8d6cde7 | 109 | else if (ScanTime_ms == 64) key_config = key_config | 0x06; |
irsanjul | 1:56f4a8d6cde7 | 110 | else if (ScanTime_ms == 128) key_config = key_config | 0x07; |
irsanjul | 1:56f4a8d6cde7 | 111 | else key_config = key_config | 0x04; |
irsanjul | 1:56f4a8d6cde7 | 112 | |
irsanjul | 1:56f4a8d6cde7 | 113 | if(!WriteReg(RegKeyConfig, key_config)) return 0; // Enable and configure keypad scanning engine. |
irsanjul | 0:9b4d494682e0 | 114 | |
irsanjul | 0:9b4d494682e0 | 115 | return true; |
irsanjul | 0:9b4d494682e0 | 116 | } |
irsanjul | 0:9b4d494682e0 | 117 | |
irsanjul | 0:9b4d494682e0 | 118 | char SX1508::read() |
irsanjul | 0:9b4d494682e0 | 119 | { |
irsanjul | 1:56f4a8d6cde7 | 120 | char data_read = ReadReg(RegKeyData); |
irsanjul | 1:56f4a8d6cde7 | 121 | data_read = data_read & 0xFF; |
irsanjul | 0:9b4d494682e0 | 122 | |
irsanjul | 1:56f4a8d6cde7 | 123 | return data_read; |
irsanjul | 0:9b4d494682e0 | 124 | } |