arduino에서 i2c 4

3335 단어 lcd8574ArduinoI2C

개요



풀 스크래치로 master 써 보았다.

사진





회로도



샘플 코드 #include <inttypes.h> #include <compat/twi.h> #define F_CPU 16000000UL #define SCL_CLOCK 50000L #define PCF8574_ADDRESS 0x27 << 1+0 void i2c_init(void) { TWSR = 0; TWBR = ((F_CPU / SCL_CLOCK) - 16) / 2; } unsigned char i2c_start(unsigned char address) { uint8_t twst; TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); twst = TW_STATUS & 0xF8; if ((twst != TW_START) && (twst != TW_REP_START)) return 1; TWDR = address; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); twst = TW_STATUS & 0xF8; if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) return 1; return 0; } void i2c_stop(void) { TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); while (TWCR & (1 << TWSTO)); } unsigned char i2c_write(unsigned char data) { uint8_t twst; TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); twst = TW_STATUS & 0xF8; if (twst! = TW_MT_DATA_ACK) return 1; return 0; } void send (uint8_t d) { uint8_t s; i2c_start (PCF8574_ADDRESS); i2c_write(d); s = d|0x04; i2c_write(s); delayMicroseconds(1); s=d&0xfb; i2c_write(s); delayMicroseconds(1); i2c_stop(); } void set (uint8_t d) { uint8_t s; uint8_t f1=d&0xf0; uint8_t f2 = d << 4; i2c_start (PCF8574_ADDRESS); s = f1; i2c_write(s); s = f1|0x04; i2c_write(s); delayMicroseconds(1); s = f1 & 0xfb; i2c_write(s); i2c_stop(); i2c_start (PCF8574_ADDRESS); s = f2; i2c_write(s); s = f2|0x04; i2c_write(s); delayMicroseconds(1); s = f2 & 0xfb; i2c_write(s); i2c_stop(); } void data (uint8_t d) { uint8_t s; uint8_t f1=d&0xf0; uint8_t f2 = d << 4; i2c_start (PCF8574_ADDRESS); s = f1; i2c_write(s); s = f1|0x05; i2c_write(s); delayMicroseconds(1); s = f1 & 0xfa; i2c_write(s); i2c_stop(); i2c_start (PCF8574_ADDRESS); s = f2; i2c_write(s); s = f2|0x05; i2c_write(s); delayMicroseconds(1); s = f2 & 0xfa | 0x08; i2c_write(s); i2c_stop(); } void setup() { unsigned char c; unsigned char address; int nDevices; Serial.begin(115200); i2c_init(); send(0x03); delayMicroseconds(50); send(0x03); delayMicroseconds(50); send(0x03); delayMicroseconds(15); send(0x02); set(0x28); set(0x0c); set(0x01); set(0x06); data(0x68); data(0x65); data(0x6c); data(0x6c); data(0x6f); data(0x2c); data(0x20); data(0x77); data(0x6f); data(0x72); data(0x6c); data(0x64); data(0x21); Serial.println("ok"); } void loop() { delay(100); } 이상.

좋은 웹페이지 즐겨찾기