Prototype of SX1508's library

Committer:
irsanjul
Date:
Mon May 30 07:27:25 2016 +0000
Revision:
1:56f4a8d6cde7
Parent:
0:9b4d494682e0
aaa

Who changed what in which revision?

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