Хоёр i2c модулийг arduino руу холбох диаграмм. LCM1602 LCD дэлгэцийг I2C-ээр Arduino-д холбож байна. Өөрийнхөө бэлгэдлийг бий болго

Энэ нийтлэлд би LCD дэлгэцийг (2x16 / 20x4) хянахын тулд I2C интерфейсийн модулийг хэрхэн ашиглахыг танд хэлэх болно. Arduino ашиглан. Энэ модуль нь 8 эсвэл 4 битийн холболтын оронд ашигласан хянагч тээглүүрүүдийн тоог багасгах боломжийг олгодог бөгөөд зөвхөн 2 зүү (SDA ба SCL) шаардлагатай.

Техникийн үзүүлэлт

Дэлгэцийн дэмжлэг: LCD 16×02 / 20×04
Нэмэлт: тодосгогч тохируулга
Нийлүүлэлтийн хүчдэл. 5V
Интерфэйс: I2C
Хэмжээ: 54мм x 19мм x 15мм

I2C интерфейсийн модулийн тухай ерөнхий мэдээлэл

Arduino хянагч дээрх тээглүүрүүдийн тоо хязгаарлагдмал байдаг тул ихэвчлэн ашигладаг янз бүрийн мэдрэгчмодулиуд дуусч байгаа тул тэдгээрийг хадгалах шаардлагатай байна, эдгээр тохиолдлуудад энэ модулийг боловсруулсан бөгөөд түүний тусламжтайгаар та хоёр контакт (SDA ба SCL) дамжуулалтыг хэрэгжүүлэх боломжтой.

Одоо модулийн тухай бага зэрэг, энэ нь PCF8574T чип дээр суурилагдсан. R8 (4.7 кОм) ба R9 (4.7 кОм) резисторууд нь SDA болон SCL шугамыг татахад шаардлагатай байдаг. I2C автобусаар хоёр ба түүнээс дээш төхөөрөмжийг холбохдоо та зөвхөн нэг төхөөрөмж дээр татахыг ашиглах хэрэгтэй. яагаад гэдгийг дараа бичье. Самбар дээр гурван холбогч байдаг (диаграммаас харахад A0, A1, A2 шугамууд нь R4, R5, R6 резисторуудаар цахилгаан тэжээлд холбогдсон байна), тэдгээр нь төхөөрөмжийн хаягийг өөрчлөхөд шаардлагатай бөгөөд нийт 8 сонголт байдаг. . Хаягжуулалтыг өөрчлөх нь бидэнд PCF8574T чип бүхий 8 хүртэлх төхөөрөмжийг IC2 автобусаар холбох боломжийг олгодог (төхөөрөмжийн анхдагч хаяг нь 0x27). Мөн модуль нь R11 потенциометрээр тоноглогдсон бөгөөд түүний тусламжтайгаар та LCD дэлгэцийн тодосгогчийг өөрчлөх боломжтой.

Модуль дээр холболт хийх гурван бүлэг контактууд байдаг.

Эхний бүлэг:
SCL: Цуврал цаг
SDA: өгөгдлийн шугам (Цуваа Dфta)
VCC: "+" хүч
GND: "-" цахилгаан хангамж

Хоёр дахь бүлэг:
VSS: "-" хүч
VDD: "+" тэжээлийн хангамж
VO: Тодосгогч хяналтын зүү
RS: Бүртгүүлэх сонго
RW: Унших/Бичих (газард холбогдсон үед бичих горим)
E: Идэвхжүүлэх (уналтын strobe)
DB0-DB3: Интерфейсийн бага битүүд
DB4-DB7: Интерфэйсийн өндөр битүүд
Х: "+" арын гэрэлтүүлгийн тэжээлийн хангамж
K: "-" арын гэрэлтүүлгийн хүч

Гурав дахь бүлэг: (өгөгдмөлөөр холбогчийг тохируулсан)
VCC:
LCD-ээс A:

Arduino-д холбогдож байна

Шаардлагатай хэсгүүд:
Arduino UNO R3 x 1 ширхэг.
LCD дэлгэц 1602A (2×16, 5V, Цэнхэр) x 1 pc.
LCD х 1 pc-д зориулсан I2C, IIC, TWI интерфейсийн модуль.
DuPont утас, 2.54 мм, 20 см, F-M (Эмэгтэй - Эрэгтэй) x 1 ширхэг.
USB кабель 2.0 A-B x 1 ширхэг.

Холболт:
Юуны өмнө I2C модулийг гагнах хэрэгтэй LCD дэлгэц, дараа нь та дэлгэцийг Arduino UNO-д холбох хэрэгтэй. Үүнийг хийхийн тулд бид доорх хүснэгтийн дагуу DuPont утсыг ашиглана.

Тодорхой болгохын тулд би өөр диаграммыг өгөх болно.

Энэ туршилтыг хийхийн тулд та "LiquidCrystal_I2C" номын санг татаж аваад суулгах хэрэгтэй. Дараа нь энэ жишээ кодыг Arduino IDE програмын цонхонд хуулж буулгаад хянагч руу ачаална уу.

/* Arduino IDE 1.6.11 дээр туршсан Туршилтын огноо 2016/09/15 */ #include #оруулна LiquidCrystal_I2C lcd(0x27,16,2); // Дэлгэцийн хаяг, хэмжээг тохируулах void setup() ( lcd.init(); // Initialize lcd lcd.backlight(); // lcd.setCursor(0,0) арын гэрлийг асаана; // курсорыг 1 мөрийн эхэнд lcd .print("Сайн уу, ертөнц"); // Текстийг хэвлэх lcd.setCursor(0,1) // lcd.print("www. robotchip.ru"); // Текстийг хэвлэх ) хүчингүй давталт() ( )

Програм татаж авах

Хэрэв та бүх зүйлийг зөв хийсэн боловч дэлгэц дээр ямар ч тэмдэг байхгүй бол потенциометрийн тусламжтайгаар тодосгогчийг нэмэгдүүлэхийг оролдоорой.


Холбоосууд
LiquidCrystal_I2C номын санг татаж авна уу
PCF8574T чипийн баримт бичиг
LCD1602A-д зориулсан баримт бичиг

Aliexpress дээр худалдаж аваарай

Би эндээс авсан сайн дэлгүүрЧип резистор нь хэрэгцээтэй төхөөрөмжүүдийг судлах, ашиглах өөр нэг төхөөрөмж юм. Энэхүү төхөөрөмж нь HD44780 хянагчаар удирддаг LCD дэлгэцийг 4 битийн горимд удирдахад зориулагдсан юм. Энэ зорилгоор I2C автобусыг зэрэгцээ 8 битийн порт руу хөрвүүлэгч бичил схемийг самбар дээр суурилуулсан.

Самбарыг LCD дэлгэцтэй шууд холбож болохуйц байдлаар чиглүүлдэг. Оролт нь цахилгаан болон I2C шугамыг нийлүүлдэг. Уг самбар нь SCL ба SDA шугамууд дээрх татах резисторууд, тодосгогчийг тохируулах потенциометр, дэлгэцийн тэжээлийн эх үүсвэрээр нэн даруй тоноглогдсон байна.

Баруун талд байгаа холбогч нь арын гэрлийг асаах / унтраадаг. Дараа нь тестерээр зэвсэглэн дараах хүснэгтийг эмхэтгэсэн. Модулийг судалсны дараа энэ нь тодорхой болсон P3арын гэрлийг хянадаг. Хэрэв холбогч суурилуулсан бол 1 нь арын гэрлийг асааж, 0 нь унтраадаг. Холбогчийг салгах үед арын гэрэлтүүлэг үргэлж унтардаг. Дараа нь axlib номын санг I2C автобустай ажиллах функцууд (програм хангамжийн хэрэгжилт) болон PCF8574 чипийг удирдах функцээр нэмэхээр шийдсэн. Товчхондоо модуль хэрхэн ажилладаг талаар. Нэг байтыг зэрэгцээ гаргахын тулд та микро схемийн хаягийг I2C автобус руу илгээх хэрэгтэй (анхдагчаар энэ нь 0x4E байна. Мөн самбар дээрх холбогчийг гагнах, хамгийн бага ач холбогдолтой гурван утгыг өөрчлөх замаар хаягийг өөрчилж болно. хаягийн бит), дараа нь ACK хүлээн авсны дараа өгөгдлийн байт илгээгдэнэ. Чип нь ACK-д хариу өгсний дараа байт нь чипийн зэрэгцээ порт дээр гарч ирнэ. LCD дэлгэцийг удирдахын тулд би axlib номын сангаас функцуудыг авч, I2C автобустай ажиллахын тулд тэдгээрийг бага зэрэг өөрчилсөн. #оруулна #оруулна #оруулна #оруулна #ADD 0x4E-г тодорхойлох // Чип хаяг /* LCD чип RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 P3 холболтын хөл дээр арын гэрэлтүүлэг байна. 1 асаалттай, 0 унтраалттай */ // Гаралтын өгөгдөл com |= 0x04; // Нэгж тутамд E pcf8574_byte_out(com, ADD); // Гаралтын өгөгдөл com &= 0xFB; // E хүртэл тэг pcf8574_byte_out(com, ADD); // Гаралтын өгөгдөл) void init(void) ( _delay_ms(30); com(0x30); _бидний_хоцролт(40); com(0x30); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x30); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x20); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x20); // Параметрүүдийг тохируулах com(0x80); // Параметрүүдийг тохируулах com(0x00); // Дэлгэц унтраах com(0x80); // Дэлгэц унтраах com(0x00); // Дэлгэцийг арилгах com(0x10); // Дэлгэцийг арилгах com(0x00); com(0x60); // Өгөгдөл оруулах горимыг тохируулна уу com(0x00); com(0xC0); // Сонгосон курсороор дэлгэцийг асаана) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((өгөгдөл // Хамгийн чухал 4 бит өгөгдлийг дамжуулах_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Хамгийн чухал 4 битийг шилжүүлэх // Хамгийн чухал 4 битийг шилжүүлэх // Доод 4 бит дамжуулах // Доод 4 бит дамжуулах // Доод 4 бит дамжуулах) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ); while(1) ( ) )Энд яг юу болоод байна. Эхлээд бид I2C болон PCF8574-ийн сангуудыг холбодог. Би I2C-ийн талаар аль хэдийн бичсэн тул энэ талаар дахин үргэлжлүүлэх болно, гэхдээ би PCF8574.h дээр юу байгааг хэлэх болно. Номын сан нь зөвхөн гурван функцийг агуулдаг.
BYTE pcf8574_test(BYTE нэмэх) ( BYTE асуух = ACK; нэмэх &= 0xFE; i2c_start(); асуух = i2c_send_byte(add); i2c_stop(); буцах асуух; )Эхний функцийг автобусанд төхөөрөмж байгаа эсэхийг шалгахын тулд бичсэн. Зарчмын хувьд автобусанд байрлах ямар ч төхөөрөмжийг хайхад ашиглаж болно. Функц нь хүссэн төхөөрөмжийн хаягийг авдаг бөгөөд хэрэв хариу өгвөл тэгийг буцаана. Ийм хаягтай төхөөрөмж автобусанд байхгүй бол буцаана.
BYTE pcf8574_byte_out(BYTE data, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); i2c_s буцах; )Энэ функц нь аль хэдийн зөвхөн энэ чипэд зориулагдсан. Аргумент болгон автобус руу шилжүүлэх байт болон чипийн хаягийг өгдөг. Функц эхлээд чипийг хаягаар нь асууж, дараа нь байт илгээнэ. Хэрэв чип нь байт хүлээн аваад ACK гэж хариулсан бол функц нь чиптэй ажиллаж дуусгаад байтыг амжилттай илгээснээр тэгийг буцаана. Мөн энэ үед микро схем энэ байтыг параллель порт руугаа гаргана. Үгүй бол бид NACK хүлээн аваад нэгийг нь буцааж өгөх болно, дамжуулалт амжилтгүй болсон.
BYTE pcf8574_str_out(BYTE *өгөгдөл, BYTE col, BYTE нэмэх) ( BYTE асуух = ACK; нэмэх &= 0xFE; i2c_start(); асуух = i2c_send_byte(add); for(BYTE i=0; i) Энэ функцийг туршилт хийх зорилгоор бүтээсэн. Нэг байт өгөгдлийн массив, эдгээр байтуудын тоо болон чипийн хаягийг заагчийг хүлээн авна. Үнэн хэрэгтээ бүх өгөгдлийг нэг сессэд шилжүүлэх оролдлого, нэг сессэд нэг байт биш. Функц ажиллаж байгаа боловч LCD дэлгэцэнд тохиромжгүй. Одоо үндсэн програм руугаа буцъя. Номын сангуудыг холбосны дараа бид микро схемийн хаягийг бичнэ. Дараа нь бид lcd.h-тэй төстэй гурван функцийг үүсгэдэг. Ганц ялгаа нь өгөгдөл дамжуулах зарчим юм.
хүчингүй com(BYTE com) ( com |= 0x08; // P3-ийг нэг болгож, арын гэрэлтүүлэг асаалттай байна pcf8574_byte_out(com, ADD); // Гаралтын өгөгдөл com |= 0x04; // Нэгж тутамд E pcf8574_byte_out(com, ADD); // Гаралтын өгөгдөл com &= 0xFB; // E хүртэл тэг pcf8574_byte_out(com, ADD); // Гаралтын өгөгдөл } Энэ функц нь зөвхөн командуудыг дэлгэц рүү илгээдэг. Эндээс 0x08 командын логик нэмэлтээр эхний мөр гарч ирэв. Бид байтыг LCD дэлгэцийн порт руу шууд дамжуулдаггүй, харин дахин дамжуулагчаар дамжуулж байгаа тул энэ алдаа хэрэгтэй байна. Өөрөөр хэлбэл, хэрэв бид байт нийлүүлсэн бол зөвхөн нэг бит гаргах шаардлагатай бол өмнөх байт руу шаардлагатай битийг оноож, порт руу дахин илгээнэ үү. Энэ бол ийм төвөг юм. Гурав дахь оронтой тоонд нэгийг байнга байлгахын тулд 0x08-тай нэмэх шаардлагатай. Арын гэрлийг санаж байна уу? Энэ нэмэлт нь арын гэрлийг асаадаг. Дараа нь бид байтыг автобус руу шилжүүлэх функцийг дууддаг. Энэ тухай дээр бичсэн байгаа. Дараа нь бид байтыг автобусаар чип рүү шилжүүлдэг. Дараа нь та E-г нэг болгож тохируулах хэрэгтэй бөгөөд энэ нь 0x04-тэй байтыг логикоор нэмэхэд яг ийм зүйл болдог. E-г дахин тохируулсны дараа та командыг өөрөө аргумент болгон дамжуулснаар дэлгэц рүү дурын командыг илгээх боломжтой. void init(void) ( _delay_ms(30); // Асаасны дараа түр зогсоох com(0x30); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x30); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x30); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x20); // 4 битийн горимд шилжих _бидний_хоцролт(40); // Тушаалын гүйцэтгэлийн саатал com(0x20); // Параметрүүдийг тохируулах com(0x80); // Параметрүүдийг тохируулах com(0x00); // Дэлгэц унтраах com(0x80); // Дэлгэц унтраах com(0x00); // Дэлгэцийг арилгах com(0x10); // Дэлгэцийг арилгах com(0x00); // Өгөгдөл оруулах горимыг тохируулна уу com(0x60); // Өгөгдөл оруулах горимыг тохируулна уу com(0x00); // Сонгосон курсороор дэлгэцийг асаана com(0xC0); // Сонгосон курсороор дэлгэцийг асаана } Энэ функц нь зөвхөн дэлгэцийг эхлүүлдэг. Тушаалуудын дарааллыг LCD дэлгэц дээрх мэдээллийн хуудаснаас авна. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((өгөгдөл // Хамгийн чухал 4 бит өгөгдлийг дамжуулах_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Хамгийн чухал 4 битийг шилжүүлэх data_h &= 0xF9; pcf8574_byte_out(өгөгдлийн_цаг, ADD); // Хамгийн чухал 4 битийг шилжүүлэх pcf8574_byte_out(өгөгдлийн_л, ADD); // Доод 4 бит дамжуулах data_l |= 0x04; pcf8574_byte_out(өгөгдлийн_л, ADD); // Доод 4 бит дамжуулах data_l &= 0xF9; pcf8574_byte_out(өгөгдлийн_л, ADD); // Доод 4 бит дамжуулах } Энэ функц нь өгөгдлийг LCD дэлгэц рүү дамжуулдаг. Энэ нь командын нэгэн адил хэрэгждэг бөгөөд зөвхөн байтыг эхлээд хамгийн чухал хазайлтаар, дараа нь бага байтаар дамжуулдаг. Мөн бусад нь адилхан. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) )За, энэ функц нь дэлгэц рүү мөр дамжуулахад зориулагдсан. Үнэндээ энэ нь бидний сэдэвтэй ямар ч холбоогүй юм.

AtmelStudio 6.2-д зориулсан төсөл

Эрх бүхий 01.08.15 17:11

Таслал дутуу байна. Энэ нь зөв: "Сайн уу ДЭЛХИЙ!" Мөн энэ төхөөрөмж нь зөвхөн HD44780-д зориулагдсан биш юм. Мастер талд татах резистор суурилуулсан. Тодорхойлолтын дагуу LCD хянагч руу өгөгдлүүд буурах чиглэлд бичигддэг E. Тиймээс эхний функцийг хялбаршуулсан: void com(BYTE com) ( com |= 0x08; // арын гэрэлтүүлэг pcf8574_byte_out(com | 0x04, ADD); / / Өгөгдлийн гаралт pcf8574_byte_out(com , ADD); Жишээлбэл, void char_out(BYTE өгөгдөл) нь зөвхөн хоёр дуудлага хүлээн авах бөгөөд үүнээс ч илүү нэмэлт хувьсагчгүйгээр. LCD дэлгэцийн эхлэлийг цаг хугацааны үзүүлэлтүүдийг зөрчиж гүйцэтгэсэн.

Алексей 02.08.15 19:11

Таслал дутуу байгаа тул дэлгэцэнд нөлөөлөхгүй. Энэ төхөөрөмж нь энэ эсвэл ижил төстэй хянагчтай дэлгэцэнд зориулагдсан. Гэхдээ энэ микро схем бол үнэхээр энгийн порт өргөтгөгч юм. Би Э-тэй санал нэг байна. Нэмэлт хувьсагч шаардлагатай. Хэрэв та функцэд аргумент дамжуулж, тодорхой үйлдлүүдийг логикоор хийвэл алдаа гарч болзошгүй. Би үүнтэй аль хэдийн тулгарсан. Эхлүүлэх нь цаг хугацааг зөрчихгүйгээр хийгддэг. Баримт бичигт тушаалуудын хооронд 40 μs-ийн завсарлага байгаа гэж бичсэн байна. Шилжүүлэлт нь i2c автобусаар явагддаг бөгөөд энэ нь програм хангамжид суурилсан, удаан байдаг тул хугацаа нь хүүтэй дуусдаг. Хэрэв та залхуураагүй хэвээр байгаа бол хувилбараа бичээд над руу илгээгээрэй. Би үүнийг нийтлэх болно. Эцэст нь хэлэхэд, энэ сайт нь сонирхогч үзэгчдэд зориулагдсан бөгөөд хүссэн хүн бүр М.К.-ийн амьдралын талаархи санал бодол, алсын хараагаа илэрхийлж болно.

Алексей 06.08.15 09:14

Эрхэм хүндэт "Бичиг үсэгт тайлагдсан"-ын тэмдэглэснээр дэлгэцийг эхлүүлэхэд цаг хугацаа нэмсэн.

Дмитрий 14/06/16 21:57

Сайн уу Алексей. Та PCF8574-тэй ажиллахын тулд код үүсгэгч рүү номын сан нэмж болно.

Алексей 14/06/16 22:32

Би бодох болно.))

Руслан 12.12.21 19:54
Алексей 21/12/16 21:53

Тиймээ. Ялангуяа Асма дахь код. Arduino-ийн мэргэжилтнүүд үүнийг бүрэн дүүрэн үнэлэх болно)))

Py.sy.
Хэдийгээр та ASM-г харахгүй байсан ч тэнд байгаа програмыг PIC контроллерт зориулж бичсэн байдаг. Энэ нь AVR мэргэжилтнүүдэд "маш" хэрэгтэй мэдээлэл мөн үү? ялангуяа эхлэгчдэд зориулсан))) Надад PIC-ийн эсрэг юу ч байхгүй, гэхдээ PIC болон AVR-ийн ASM хүртэл ялгаатай. LCD дэлгэцийн үйл ажиллагааны нарийн ширийн зүйлсийн хувьд та харж болно))) Үнэн, би үүнийг CVAVR дор бичсэн боловч бүх тушаалуудыг задалж, тавиур болгон ангилсан. Гэхдээ ямар ч тохиолдолд хаана илүү тодорхой бичсэнийг өөрөө шийдээрэй))) Зохиогч бичдэг, уншигч өөрөө сонгодог.

GeK 04.01.17 12:52

"Чипийн I2C хаяг (анхдагчаар энэ нь 0x4E"

Хаягийн хамгийн чухал 4 бит нь тогтмол,
PCF8574-ийн угтвар нь 0100, PCF8574A-ийн хувьд 0111 байна.
Доод 3 бит нь чипийн A2-A0 оролтын төлөвөөс хамаарна. Анхдагч байдлаар, бүх 3 холбогч нээлттэй байгаа тул чип хаяг нь 0111111 утгыг авна.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Алексей 01/04/17 14:27

Та ямар нэг зүйл хольсон байна.
Бичил схемийн баримт бичгээс гаргаж авах

0b01001110 нь 0x4E юм
Тиймээс энд бүх зүйл зөв байна. Хэрэв та хаягаа өөрчлөх шаардлагатай бол Define дээр өөрчлөх хэрэгтэй.

Юрий 14/12/17 21:26

Сайхан өдөр! Мөн та PCF8574 адаптертай ажиллахын тулд lcdgotoxy болон lcdclear функцийн кодыг ашиглаж болно.

Александр 20.05.18 18:14

Сайхан өдөр! Орос хэл дээрх текстийг хэрхэн гаргах вэ?

Алексей 20.05.18 23:04

Энэ бол MELT-ийн дотоодын дэлгэц юм. Кирилл үсгийг түүний ой санамжинд шингээжээ.

Александр 21/05/18 04:55

Сайхан өдөр! Би чиний AtmelStudio 6.2 төсөл дээр бичсэн шиг "ЁPҐBET MҐP!" Энэ нь хэвийн гарна
мөн хэрэв та "HELLO WORLD!" гэж бичвэл. янз бүрийн утгагүй зүйлийг гаргаж ирдэг. Надад хоёр байна
Дэлгэцийн сонголтуудын нэг нь кирилл цагаан толгойтой. хоёр дахь нь Хятад.

Алексей 21/05/18 09:22

Би эхлээд туршилтын програм бичнэ. Санах ойг бүхэлд нь давтаж, тэмдэгтүүд болон тэдгээрийн хаягуудыг харуулна. Тэгээд асуудал нь юу болохыг олж мэдээрэй. Тэмдэгтийн хүснэгт нь ascii хүснэгттэй таарахгүй байх магадлалтай.

Андрей 09/03/18 08:32

Өдрийн мэнд!

Та Proteus-ийн схемийг өгч чадах уу?

Андрей 09/03/18 10:22

Эсвэл Proteuse дээр хэн ч шалгаагүй юм уу?

Андрей 09/03/18 10:56

main_init-г олж мэдсэн

Павел 05/30/19 23:35

Сонирхолтой зүйл бол дэлгэцийн хаяг нь 0x4E бөгөөд хэрэв ижил дэлгэц Arduino-д холбогдсон бол хаяг нь 0x27 байна.

Павел 31/05/19 11:04

Таны ажилд маш их баярлалаа! Би интернетийг бүхэлд нь гүйлгэсэн бөгөөд таныхаас бусад жишээнүүдийн аль нь ч тус болсонгүй. Цорын ганц зүйл бол төслийн архивт _саатгалын_ саатал нь дэлгэцийг эхлүүлэх функцэд тодорхойлогдоогүй бөгөөд үүний дагуу ажиллахгүй байна.

Алексей 01/06/19 09:52

За, энэ бол илүү үзүүлэх төсөл юм. Сайн шалтгааны улмаас axlib номын санг дахин бичих шаардлагатай боловч STM32 болон STM8 нь хурдацтай хөдөлж байгаа тул AVR-д ямар ч утга алга.

Павел 05/06/19 12:57

STM-д DIP багц байхгүй; хэвлэмэл хэлхээний самбар хийх нь илүү хэцүү байдаг. Миний төслүүдийн хувьд AVR-ийн боломжууд маш их, та нэг Atmega 8 дээр маш их багтах боломжтой.

Алексей 05.06.19 15:20

Тийм ээ, гэхдээ Atmega8, stm8s003 ямар үнэтэй вэ)))

Дмитрий 06/07/19 00:41

Сайн уу Алексей.
pcf8574-ээс портын статусыг хэрхэн уншихыг хэлж өгнө үү?
Би i2c автобусанд 8 GPIO гадаад нэгж хийхийг хүсч байна - ингээд л болоо.

Дмитрий 07.06.19 17:56

Би өөрөө хариулах болно
Функц нь байтыг буцаана - микро схемийн портуудын төлөв
uint8_t pcf8574_byte_rcv(uint8_t хаяг)
{
uint8_t асуух = ACK;
addr |= 0b01; //УНШ
uint8_t өгөгдөл=0;
i2c_start();
асуух = i2c_send_byte(addr);
if(!ask) өгөгдөл = i2c_read_byte(NACK);
i2c_stop();

Өгөгдлийг буцаах;
}

Павел 06/07/19 20:37

Энэ нь ямар үнэтэй вэ, 150 рубль, ерөнхийдөө релений үнэ), STM-ийн хавтанг хэрхэн яаж утасдах вэ? LUT найдваргүй, CNC чиглүүлэгч нь юу авахаа мэдэхгүй байна (оролдож үзээгүй)

Магадгүй зах зээл дээрх хамгийн алдартай дэлгэцүүдийн нэг юм. Алдартай HD44780U хянагч дээр бүтээгдсэн. Загварын нэрнээс харахад дэлгэц нь 16 тэмдэгтээс бүрдэх хоёр мөрөөс бүрдэнэ. Энэ загварт орос хэлийг дэмждэггүй.

Sh2s дата автобус нь 127 хүртэлх төхөөрөмжийг хоёр утсаар нэгэн зэрэг холбох боломжийг олгодог. Энэхүү I2C нь PCF8574T чип дээр хэрэгждэг.

Холболтын диаграм:

Цэнхэр зүйл бол дэлгэцийн тодосгогчийг тохируулах боломжийг олгодог хувьсах эсэргүүцэл юм.

Зүүн талд байгаа холбогч нь дэлгэцийн арын гэрлийг хариуцдаг.

4 контактын блок arduino-д дараах байдлаар холбогдсон байна.

GND - GND
VCC - 5V
SDA - A4 (хэрэв Arduino MEGA бол D20 хүртэл)
SCL - A5 (хэрэв Arduino MEGA бол D21 хүртэл)

Номын сан

Ноорог

Дэлгэц нь өөр IIC хаягтай байж болох бөгөөд 0x27-ийн оронд 0x3F байж болно. Хаягийг нарийн тодорхойлохын тулд та i2c төхөөрөмжийн сканнер ашиглаж болно.

#оруулна #оруулна //LCD дэлгэцийн хаягийг 0x27, 16 тэмдэгт, 2 мөр тохируулна LiquidCrystal_I2C lcd(0x27, 16, 2); хүчингүй тохиргоо() ( lcd.init(); // Дэлгэцийг эхлүүлэх //арын гэрлийг асаана lcd.backlight(); //Текст гарч ирэх байрлалыг тохируулна. lcd.setCursor(2, 0); //гаралтын мөр 1 lcd.print("Сайн уу, Дэлхий!"); //хоёр дахь мөрийг мөн адил хэвлэнэ lcd.setCursor(1, 1); lcd.print("www.site"); ) хүчингүй давталт () ( )

Магадгүй зах зээл дээрх хамгийн алдартай дэлгэцүүдийн нэг юм. Алдартай HD44780U хянагч дээр бүтээгдсэн. Загварын нэрнээс харахад дэлгэц нь 16 тэмдэгтээс бүрдэх хоёр мөрөөс бүрдэнэ. Энэ загварт орос хэлийг дэмждэггүй.

Sh2s дата автобус нь 127 хүртэлх төхөөрөмжийг хоёр утсаар нэгэн зэрэг холбох боломжийг олгодог. Энэхүү I2C нь PCF8574T чип дээр хэрэгждэг.

Холболтын диаграм:

Цэнхэр зүйл бол дэлгэцийн тодосгогчийг тохируулах боломжийг олгодог хувьсах эсэргүүцэл юм.

Зүүн талд байгаа холбогч нь дэлгэцийн арын гэрлийг хариуцдаг.

4 контактын блок arduino-д дараах байдлаар холбогдсон байна.

GND - GND
VCC - 5V
SDA - A4 (хэрэв Arduino MEGA бол D20 хүртэл)
SCL - A5 (хэрэв Arduino MEGA бол D21 хүртэл)

Номын сан

Ноорог

Дэлгэц нь өөр IIC хаягтай байж болох бөгөөд 0x27-ийн оронд 0x3F байж болно. Хаягийг нарийн тодорхойлохын тулд та i2c төхөөрөмжийн сканнер ашиглаж болно.

#оруулна #оруулна //LCD дэлгэцийн хаягийг 0x27, 16 тэмдэгт, 2 мөр тохируулна LiquidCrystal_I2C lcd(0x27, 16, 2); хүчингүй тохиргоо() ( lcd.init(); // Дэлгэцийг эхлүүлэх //арын гэрлийг асаана lcd.backlight(); //Текст гарч ирэх байрлалыг тохируулна. lcd.setCursor(2, 0); //гаралтын мөр 1 lcd.print("Сайн уу, Дэлхий!"); //хоёр дахь мөрийг мөн адил хэвлэнэ lcd.setCursor(1, 1); lcd.print("www.site"); ) хүчингүй давталт () ( )

  • FC-113 модуль нь PCF8574T чип дээр суурилдаг бөгөөд энэ нь 8 битийн ээлжийн бүртгэл болох I2C цуваа автобусны оролт-гаралтын "өргөтгөл" юм. Зураг дээр микро схемийг DD1 гэж тодорхойлсон.
  • R1 нь LCD дэлгэцийн тодосгогчийг тохируулах зориулалттай резистор юм.
  • Jumper J1 нь дэлгэцийн арын гэрлийг асаахад ашиглагддаг.
  • 1…16 зүү нь модулийг LCD дэлгэцийн зүүтэй холбоход ашиглагддаг.
  • Төхөөрөмжийн I2C хаягийг өөрчлөхөд A1...A3 контакт дэвсгэрүүд хэрэгтэй. Тохирох холбогчийг гагнах замаар та төхөөрөмжийн хаягийг өөрчилж болно. Хүснэгтэд хаяг, холбогчтой харьцах харьцааг харуулав: "0" нь нээлттэй хэлхээтэй, "1" нь суурилуулсан холбогчтой тохирч байна. Анхдагч байдлаар, бүх 3 холбогч нээлттэй бөгөөд төхөөрөмжийн хаяг байна 0x27.

2 LCD дэлгэцийг Arduino руу холбох диаграмм I2C протоколоор дамжуулан

Модуль нь Arduino-д I2C автобусны стандарт аргаар холбогдсон: модулийн SDA зүү нь A4 аналог порттой, SCL зүү нь Arduino-ийн A5 аналог порттой холбогдсон. Модуль нь Arduino-аас +5 В-оор тэжээгддэг. Модуль нь өөрөө LCD дэлгэц дээрх харгалзах 1…16 зүү 1…16 зүүгээр холбогдсон байна.


3 Ажлын номын сан I2C протоколоор дамжуулан

Одоо бидэнд I2C интерфейсээр дамжуулан LCD-тэй ажиллах номын сан хэрэгтэй байна. Жишээлбэл, та үүнийг ашиглаж болно ("Жишээ код ба номын сан татаж авах" мөр дэх холбоос).

Татаж авсан архив LiquidCrystal_I2Cv1-1.rarхавтас руу задлах \номын сангууд\, энэ нь Arduino IDE санд байрладаг.

Номын сан нь LCD дэлгэцийн стандарт функцуудыг дэмждэг.

Чиг үүрэгЗорилго
LiquidCrystal() LiquidCrystal төрлийн хувьсагчийг үүсгэж, дэлгэцийн холболтын параметрүүдийг (зүүний дугаар) хүлээн авдаг;
Эхлэх() LCD дэлгэцийг эхлүүлэх, параметрүүдийг тохируулах (мөр ба тэмдэгтүүдийн тоо);
тодорхой() дэлгэцийг цэвэрлэж, курсорыг анхны байрлал руу буцаах;
гэр() курсорыг эхлэх байрлал руу буцаана;
setCursor() курсорыг өгөгдсөн байрлалд тохируулах;
бичих() LCD дэлгэц дээрх тэмдгийг харуулдаг;
хэвлэх() LCD дэлгэц дээр текстийг харуулдаг;
курсор() курсорыг харуулж байна, өөрөөр хэлбэл. дараагийн тэмдэгтийн газрын доогуур зураас;
noCursor() курсорыг нуух;
анивчих() курсор анивчих;
noBlink() Анивчихыг цуцлах;
noDisplay() харуулсан бүх мэдээллийг хадгалахын зэрэгцээ дэлгэцийг унтраах;
харуулах() харуулсан бүх мэдээллийг хадгалахын зэрэгцээ дэлгэцийг асаах;
гүйлгэхDisplayLeft() дэлгэцийн агуулгыг 1 байрлалд зүүн тийш гүйлгэх;
scrollDisplayRight() дэлгэцийн агуулгыг 1 байрлалд баруун тийш гүйлгэх;
авто гүйлгэх() автомат гүйлгэхийг идэвхжүүлэх;
noAutoscroll() авто гүйлгэх ажиллагааг идэвхгүй болгох;
зүүнээс баруун тийш() текстийн чиглэлийг зүүнээс баруун тийш тохируулах;
баруунаас зүүн тийш() баруунаас зүүн тийш текстийн чиглэл;
createChar() LCD дэлгэцэнд тусгай тэмдэгт үүсгэдэг.

4 Текст гаралтын тойм зураг I2C автобусаар LCD дэлгэц рүү

Загварыг нээцгээе: Файлын дээж LiquidCrystal_I2C CustomCharsмөн бид үүнийг бага зэрэг дахин боловсруулах болно. Бид мессежийг харуулах бөгөөд төгсгөлд нь анивчих тэмдэг байх болно. Кодын тайлбар нь ноорог бүх нарийн ширийн зүйлийг тайлбарладаг.

#оруулна // Wire номын санг #include оруулна // LCD санг холбох #define printByte(args) write(args); // uint8_t зүрх = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // "зүрх" тэмдгийн бит маск LiquidCrystal_I2C lcd(0x27, 16, 2); // 16x2 LCD дэлгэцийн хувьд 0x27 хаягийг тохируулна уу хүчингүй тохиргоо() ( lcd.init(); // LCD дэлгэцийг эхлүүлэх lcd.backlight(); // дэлгэцийн арын гэрлийг асаах lcd.createChar(3, зүрх); // санах ойн 3 нүдэнд "зүрх" тэмдэг үүсгэх lcd.home(); // курсорыг зүүн дээд буланд (0,0) lcd байрлалд байрлуулна.!"); // lcd.setCursor(0, 1) текстийн мөр хэвлэх; // курсорыг 2-р мөрөнд шилжүүлнэ, тэмдэгт. 1 lcd.print( " i "); // 2-р мөрөнд мессежийг хэвлэх lcd.printByte(3); // lcd.print(" Arduino "); } хүчингүй давталт() (// сүүлийн тэмдэгтийг анивчуулж байна lcd.setCursor(13, 1); // курсорыг 2-р мөрөнд 1-р тэмдэгт рүү шилжүүлэх lcd.print("\t"); саатал (500); lcd.setCursor(13, 1); // курсорыг 2-р мөр, 1 тэмдэгт рүү зөөнө lcd.print(" "); саатал (500); }

Дашрамд хэлэхэд, тушаалаар бичсэн тэмдэгтүүд lcd.createChar();, цахилгааныг унтраасны дараа ч дэлгэцийн санах ойд үлдэнэ, учир нь ROM 1602-г харуулахын тулд бичсэн.

5 Өөрийнхөө бэлгэдлийг бий болго LCD дэлгэцийн хувьд

LCD дэлгэцийн хувьд өөрийн гэсэн тэмдэглэгээг бий болгох асуудлыг нарийвчлан авч үзье. Дэлгэц дээрх тэмдэгт бүр 35 цэгээс бүрдэнэ: 5 өргөн, 7 өндөр (доогуур зурахад +1 нөөц мөр). Дээрх тойм зургийн 6-р мөрөнд бид 7 тооны массивыг тодорхойлно. (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Аравтын тоонуудыг хоёртын тоо руу хөрвүүлье: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Эдгээр тоо нь тэмдэгтийн 7 мөр тус бүрийн битийн маскаас өөр зүйл биш бөгөөд "0" нь гэрлийн цэгийг, "1" нь харанхуй цэгийг илэрхийлдэг. Жишээлбэл, бит маск гэж тодорхойлсон зүрхний тэмдэг зурагт үзүүлсэн шиг дэлгэцэн дээр гарч ирнэ.

6 LCD дэлгэцийн удирдлага I2C автобусаар

Ноорог Arduino-д байршуулъя. Төгсгөлд нь анивчдаг курсороор бидний заасан бичээс дэлгэцэн дээр гарч ирнэ.


7 Цаана нь юу байна I2C автобус

Урамшууллын хувьд "A", "B", "C" латин үсгийг LCD дэлгэц дээр харуулах цагийн диаграммыг харцгаая. Эдгээр тэмдэгтүүд нь дэлгэцийн ROM-д хадгалагдаж, хаягийг нь дэлгэц рүү дамжуулах замаар л дэлгэцэн дээр харагдана. Диаграммыг дэлгэцийн RS, RW, E, D4, D5, D6, D7 тээглүүрүүдээс авсан болно. аль хэдийн FC-113 "I2C зэрэгцээ автобус" хөрвүүлэгчийн дараа. Бид техник хангамжид бага зэрэг гүнзгий нэвтэрч байна гэж хэлж болно.


LCD дэлгэц дээрх "A", "B", "C" латин үсгийн гаралтын цаг хугацааны диаграмм 1602

Диаграммаас харахад дэлгэцийн ROM-д байгаа тэмдэгтүүд (өгөгдлийн хуудасны 11-р хуудас, доорх холбоосыг үзнэ үү) хоёр nibble хэлбэрээр дамждаг бөгөөд эхнийх нь хүснэгтийн баганын дугаар, хоёр дахь нь мөрийн дугаарыг тодорхойлдог. Энэ тохиолдолд өгөгдөл нь шугам дээрх дохионы ирмэг дээр "хаагдсан" байна Э(Идэвхжүүлэх) болон мөр R.S.(Бүртгүүлэх сонгох) нь логик нэг төлөвт байгаа бөгөөд энэ нь өгөгдөл дамжуулагдаж байна гэсэн үг. RS шугам дээрх бага төлөв нь заавар илгээж байна гэсэн үг бөгөөд тэмдэгт бүрийг дамжуулахаас өмнө бидний харж байгаа зүйл юм. Энэ тохиолдолд LCD дэлгэцийн байрлалд (0, 0) буцах зааврын кодыг дамжуулдаг бөгөөд үүнийг дэлгэцийн техникийн тайлбарыг судалж үзэх замаар олж мэдэж болно.

Бас нэг жишээ. Энэхүү цаг хугацааны диаграм нь LCD дэлгэц дээрх Зүрхний тэмдгийн гаралтыг харуулж байна.


Дахин хэлэхэд эхний хоёр импульс Идэвхжүүлэхзааврыг дагаж мөрдөх Нүүр хуудас()(0000 0010 2) - тэргэнцрийг (0; 0) байрлал руу буцаана, хоёр дахь хоёр нь санах ойн нүд 3 10 (0000 0011 2) "Зүрх" тэмдэг (заавар) -д хадгалагдсан LCD дэлгэц рүү гарна. lcd.createChar(3, зүрх);ноорог).