/* ******************************************************************************** * Program ID : NUMPad_LED * Author : CH, Chen (Taiwan) * Date : 2011.5.4 * Description: Input with Mindsensors.com NumericPad then display digit in 7-segment LED * ******************************************************************************** */ /* NXT cable pins mapping with Arduino for I2C accessing: NXT - Arduino - 1/White / Analog input No used 2/Black / GND GND 3/Red / GND GND 4/Green / 4.3V 5V 5/Yellow/ SCL A5 6/Blue / SDA A4 */ /* 7-segment LED pins mapping with Arduino for digi displaying: .---(a/6 )---. | | (f/4 ) (b/7 ) | | |---(g/3 )---| | | (e/8 ) (c/10) | | '---(d/9 )---' dot/11 */ #include #include #define NUMPad_I2C_address 0xB4 #define NUMPad_Register 0x00 NXTI2CDevice numpad(NUMPad_I2C_address); // Call NXTI2CDevice constructor to create NumericPad instance uint16_t numpad_keyValue, keyMask; // Keypad layout: #,9,6,3,0,8,5,2,*,7,4,1 // LED Pattern : =/9/6/3/0/8/5/2/||/7/4/1 int ledPattern[12][7] ={ {6, 3, 9}, {6, 7, 3, 4, 10, 9}, {6, 4, 8, 9, 10, 3}, {6, 7, 3, 10, 9}, {6, 7, 10, 9, 8, 4}, {6, 7, 10, 9, 8, 4, 3}, {6, 4, 3, 10, 9}, {6, 7, 3, 8, 9}, {3, 4, 8, 7, 10}, {6, 7, 10}, {4, 3, 7, 10}, {7, 10} }; void ledOFF() { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(500); } /* Adjust sequence of bit 6/bit 7 and bit 10/bit 11 */ uint16_t adjustBitSeq(uint16_t keyValue) { uint16_t _b6 = (keyValue & 0x0080) >> 1; //get bit 7 then right shift uint16_t _b7 = (keyValue & 0x0040) << 1; //get bit 6 then left shift uint16_t _b10 = (keyValue & 0x0800) >> 1; //get bit 11 then right shift uint16_t _b11 = (keyValue & 0x0400) << 1; //get bit 10 then left shift return (((keyValue & 0x033F) | _b6 | _b7 | _b10 | _b11) & 0x0FFF); } void setup() { uint8_t Group1[9] = {0x0F, 0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F}; uint8_t Group2[8] = {0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F}; uint8_t Group3[8] = {0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F, 0x0A, 0x0F}; uint8_t Group4[3] = {0x0b, 0x20, 0x0C}; uint8_t Group5[8] = {0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0xFF, 0x02}; uint8_t Group6[1] = {0x0B}; uint8_t Group7[3] = {0x9C, 0x65, 0x8C}; // Initialize NumericPad default setting numpad.writeRegisters(0x41, 9, Group1); numpad.writeRegisters(0x4A, 8, Group2); numpad.writeRegisters(0x52, 8, Group3); numpad.writeRegisters(0x5C, 3, Group4); numpad.writeRegisters(0x2B, 8, Group5); numpad.writeRegisters(0x7B, 1, Group6); numpad.writeRegisters(0x7D, 3, Group7); for(int i=3; i<=11; i++) pinMode(i,OUTPUT); //Set COM pin to LOW for common cathode digitalWrite(5, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } void loop() { numpad_keyValue = adjustBitSeq(numpad.readInteger(NUMPad_Register)); if ((numpad_keyValue | 0x0000) == 0) digitalWrite(11, HIGH); //No pressed then ON dot else { keyMask = 0x0001; for (int i=0; i<12 ; i++) { if ((numpad_keyValue & keyMask) != 0) { for (int j=0; j<7; j++) digitalWrite(ledPattern[i][j], HIGH); break; } keyMask <<= 1; } } delay(500); ledOFF(); }