แผนภาพการเชื่อมต่อสำหรับโมดูล i2c สองตัวกับ Arduino การเชื่อมต่อหน้าจอ LCD LCM1602 กับ I2C เข้ากับ Arduino สร้างสัญลักษณ์ของคุณเอง

ในบทความนี้ ฉันจะบอกวิธีใช้โมดูลอินเทอร์เฟซ I2C เพื่อควบคุมจอแสดงผล LCD (2x16 / 20x4) ด้วย โดยใช้อาดูโน่- โมดูลนี้ช่วยให้คุณลดจำนวนพินของคอนโทรลเลอร์ที่ใช้ แทนที่จะใช้การเชื่อมต่อแบบ 8 หรือ 4 บิต โดยต้องใช้เพียง 2 พินเท่านั้น (SDA และ SCL)

พารามิเตอร์ทางเทคนิค

รองรับการแสดงผล: จอแอลซีดี 16×02 / 20×04
ทางเลือก: การปรับคอนทราสต์
แรงดันไฟฟ้า 5V
อินเทอร์เฟซ: I2C
ขนาด: 54มม.x 19มม.x 15มม

ข้อมูลทั่วไปเกี่ยวกับโมดูลอินเทอร์เฟซ I2C

เนื่องจากจำนวนพินบนคอนโทรลเลอร์ Arduino มีจำนวนจำกัด และบ่อยครั้งเมื่อใช้ เซ็นเซอร์ต่างๆและโมดูลหมด จำเป็นต้องบันทึกโมดูลเหล่านั้น ในกรณีเหล่านี้ โมดูลนี้ได้รับการพัฒนาขึ้น ด้วยความช่วยเหลือที่คุณสามารถใช้ส่งข้อมูลผ่านผู้ติดต่อสองราย (SDA และ SCL)

ตอนนี้เล็กน้อยเกี่ยวกับโมดูลนั้นมันถูกสร้างขึ้นบนชิป PCF8574T ตัวต้านทาน R8 (4.7 kOhm) และ R9 (4.7 kOhm) จำเป็นสำหรับการดึงสาย SDA และ SCL ตามหลักการแล้ว เมื่อเชื่อมต่ออุปกรณ์สองตัวขึ้นไปผ่านบัส I2C คุณต้องใช้การดึงขึ้นบนอุปกรณ์เพียงเครื่องเดียว จะเขียนว่าทำไมในภายหลัง บนกระดานมีจัมเปอร์สามตัว (แผนภาพแสดงว่าสาย A0, A1, A2 เชื่อมต่อกับแหล่งจ่ายไฟผ่านตัวต้านทาน R4, R5, R6) ซึ่งจำเป็นต้องเปลี่ยนที่อยู่ของอุปกรณ์มีทั้งหมด 8 ตัวเลือก . การเปลี่ยนที่อยู่ทำให้เราสามารถเชื่อมต่ออุปกรณ์ได้สูงสุดแปดเครื่องผ่านบัส IC2 ด้วยชิป PCF8574T ตัวเลือกที่อยู่จะแสดงในรูป (ที่อยู่อุปกรณ์เริ่มต้นคือ 0x27) โมดูลนี้ยังมาพร้อมกับโพเทนชิออมิเตอร์ R11 ซึ่งช่วยให้คุณเปลี่ยนคอนทราสต์ของจอแสดงผล LCD ได้

มีผู้ติดต่อสามกลุ่มบนโมดูลสำหรับการเชื่อมต่อ:

กลุ่มแรก:
SCL: นาฬิกาอนุกรม
SDA: สายข้อมูล (Serial Dфta)
VCC: กำลัง "+"
GND: แหล่งจ่ายไฟ "-"

กลุ่มที่สอง:
VSS: พลัง "-"
VDD: กำลัง "+"
VO: พินควบคุมคอนทราสต์
RS: ลงทะเบียน เลือก
RW: อ่าน/เขียน (โหมดเขียนเมื่อเชื่อมต่อกับกราวด์)
E: เปิดใช้งาน (ตกแสงแฟลช)
DB0-DB3: อินเตอร์เฟสบิตต่ำ
DB4-DB7: อินเตอร์เฟสบิตสูง
A: "+" แหล่งจ่ายไฟแบ็คไลท์
K: "-" แหล่งจ่ายไฟแบ็คไลท์

กลุ่มที่สาม: (จัมเปอร์ตั้งค่าตามค่าเริ่มต้น)
วีซีซี:
A จากจอแอลซีดี:

การเชื่อมต่อกับ Arduino

ชิ้นส่วนที่จำเป็น:
Arduino UNO R3 x 1 ชิ้น
จอแสดงผล LCD 1602A (2×16, 5V, สีน้ำเงิน) x 1 ชิ้น
โมดูลอินเทอร์เฟซ I2C, IIC, TWI สำหรับ LCD x 1 ชิ้น
ลวดดูปองท์ 2.54 มม. 20 ซม. F-M (ตัวเมีย-ตัวผู้) x 1 ชิ้น
สายยูเอสบี 2.0 A-B x 1 ชิ้น

การเชื่อมต่อ:
ก่อนอื่น ประสานโมดูล I2C ไปที่ จอ LCDจากนั้นคุณจะต้องเชื่อมต่อจอแสดงผลกับ Arduino UNO ในการทำเช่นนี้เราจะใช้การเดินสายของดูปองท์โดยเชื่อมต่อตามตารางด้านล่าง

เพื่อความชัดเจนฉันจะให้แผนภาพอื่น

สำหรับการทดลองนี้ คุณต้องดาวน์โหลดและติดตั้งไลบรารี “LiquidCrystal_I2C” จากนั้นคัดลอกและวางโค้ดตัวอย่างนี้ลงในหน้าต่างโปรแกรม Arduino IDE แล้วโหลดลงในคอนโทรลเลอร์

/* ทดสอบบน Arduino IDE 1.6.11 วันที่ทดสอบ 15/9/2559 */ #รวม #รวม จอแอลซีดี LiquidCrystal_I2C (0x27,16,2); // ตั้งค่าที่อยู่และขนาดของการตั้งค่าโมฆะการแสดงผล() ( lcd.init(); // เริ่มต้น lcd lcd.backlight(); // เปิดแบ็คไลท์ lcd.setCursor(0,0); // ตั้งค่า เคอร์เซอร์ไปที่จุดเริ่มต้นของ 1 บรรทัด lcd .print("Hello, world"); // พิมพ์ข้อความ lcd.setCursor(0,1); // ตั้งเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัด 2 lcd.print("www. robotchip.ru"); // พิมพ์ข้อความ ) void loop() ( )

ดาวน์โหลดโปรแกรม

หากคุณทำทุกอย่างถูกต้อง แต่ไม่มีสัญลักษณ์บนจอแสดงผล ให้ลองเพิ่มความเปรียบต่างด้วยโพเทนชิออมิเตอร์


ลิงค์
ดาวน์โหลดไลบรารี LiquidCrystal_I2C
เอกสารประกอบสำหรับชิป PCF8574T
เอกสารประกอบสำหรับ LCD1602A

ซื้อใน Aliexpress

ฉันได้มันมาจากที่นี่ ร้านค้าที่ดี Chip Resistor เป็นอีกหนึ่งอุปกรณ์สำหรับศึกษาและใช้งานในอุปกรณ์ที่มีประโยชน์ อุปกรณ์นี้ได้รับการออกแบบมาเพื่อควบคุมจอแสดงผล LCD ที่ควบคุมโดยคอนโทรลเลอร์ HD44780 ในโหมด 4 บิต เพื่อจุดประสงค์นี้ มีการติดตั้งไมโครวงจรบนบอร์ดซึ่งเป็นตัวแปลงบัส I2C ให้เป็นพอร์ตขนาน 8 บิต

บอร์ดถูกกำหนดเส้นทางในลักษณะที่สามารถเชื่อมต่อกับจอ LCD ได้ทันที อินพุตจ่ายไฟและสาย I2C บอร์ดจะติดตั้งตัวต้านทานแบบดึงขึ้นบนเส้น SCL และ SDA ทันที โพเทนชิออมิเตอร์สำหรับปรับคอนทราสต์ และแหล่งจ่ายไฟสำหรับจอแสดงผล

จัมเปอร์ทางด้านขวาจะเปิด/ปิดไฟแบ็คไลท์ จากนั้นจึงรวบรวมตารางต่อไปนี้พร้อมกับผู้ทดสอบ หลังจากศึกษาโมดูลแล้วพบว่า ป3ควบคุมแสงไฟ หากติดตั้งจัมเปอร์แล้ว 1 จะเปิดไฟแบ็คไลท์และ 0 จะปิด เมื่อถอดจัมเปอร์ออก ไฟแบ็คไลท์จะดับอยู่เสมอ ต่อไปมีการตัดสินใจที่จะเสริมไลบรารี axlib ด้วยฟังก์ชันสำหรับการทำงานกับบัส I2C (การใช้งานซอฟต์แวร์) และฟังก์ชันสำหรับควบคุมชิป PCF8574 สรุปว่าโมดูลทำงานอย่างไร ในการส่งออกไบต์แบบขนานคุณจะต้องส่งที่อยู่ของวงจรไมโครไปยังบัส I2C (โดยค่าเริ่มต้นคือ 0x4E คุณยังสามารถเปลี่ยนที่อยู่ได้โดยการบัดกรีจัมเปอร์บนบอร์ดและเปลี่ยนค่าของสามค่าที่มีนัยสำคัญน้อยที่สุด บิตของที่อยู่) จากนั้นหลังจากได้รับ ACK แล้ว ไบต์ข้อมูลจะถูกส่งไป หลังจากที่ชิปตอบสนองด้วย ACK ไบต์จะปรากฏบนพอร์ตขนานของชิป เพื่อควบคุมจอแสดงผล LCD ฉันใช้ฟังก์ชันจากไลบรารี axlib และปรับเปลี่ยนเล็กน้อยให้ทำงานกับบัส I2C #รวม #รวม #รวม #รวม #define เพิ่ม 0x4E // ที่อยู่ชิป /* ชิป LCD RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 มีไฟแบ็คไลท์ที่ขาเชื่อมต่อ P3 1 เปิด, 0 ปิด - // ข้อมูลเอาท์พุตดอทคอม |= 0x04; // E ต่อหน่วย pcf8574_byte_out(com, เพิ่ม); // ข้อมูลเอาท์พุตดอทคอม &= 0xFB; // E ถึงศูนย์ pcf8574_byte_out(com, เพิ่ม); // ข้อมูลเอาท์พุต) เป็นโมฆะ init(เป็นโมฆะ) ( _delay_ms(30); ดอทคอม(0x30); _delay_us(40); ดอทคอม(0x30); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x30); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x20); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x20); // การตั้งค่าพารามิเตอร์ดอทคอม(0x80); // การตั้งค่าพารามิเตอร์ดอทคอม(0x00); // ปิดจอแสดงผลดอทคอม(0x80); // ปิดจอแสดงผลดอทคอม(0x00); // ล้างจอแสดงผลดอทคอม(0x10); // ล้างจอแสดงผลดอทคอม(0x00); ดอทคอม(0x60); // ตั้งค่าโหมดป้อนข้อมูลดอทคอม(0x00); ดอทคอม(0xC0); // เปิดจอแสดงผลด้วยเคอร์เซอร์ที่เลือก) เป็นโมฆะ char_out(ข้อมูล BYTE) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // ถ่ายโอน data_h ที่สำคัญที่สุด 4 บิต |= 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!" ) ); ในขณะที่(1) ( ) )สิ่งที่เกิดขึ้นที่นี่ ก่อนอื่นเราเชื่อมต่อไลบรารีสำหรับ I2C และ PCF8574 ฉันได้เขียนเกี่ยวกับ I2C แล้ว ดังนั้นฉันจะเขียนเกี่ยวกับเรื่องนี้อีกครั้ง แต่ฉันจะบอกคุณว่ามีอะไรอยู่ใน PCF8574.h ห้องสมุดมีเพียงสามฟังก์ชันเท่านั้น
BYTE pcf8574_test(BYTE เพิ่ม) ( BYTE Ask = ACK; เพิ่ม &= 0xFE; i2c_start(); ถาม = i2c_send_byte(เพิ่ม); i2c_stop(); กลับถาม; )ฟังก์ชันแรกถูกเขียนขึ้นเพื่อตรวจสอบว่าอุปกรณ์อยู่บนบัสหรือไม่ โดยหลักการแล้วสามารถใช้ค้นหาอุปกรณ์ใดๆ ที่อยู่บนรถบัสได้ ฟังก์ชันรับที่อยู่ของอุปกรณ์ที่ต้องการ และหากตอบสนอง ก็จะส่งกลับค่าศูนย์ หากอุปกรณ์ที่มีที่อยู่ดังกล่าวไม่ได้อยู่บนบัส อุปกรณ์ก็จะส่งคืนอุปกรณ์นั้น
BYTE pcf8574_byte_out(ข้อมูล BYTE, BYTE เพิ่ม) ( BYTE ถาม = ACK; เพิ่ม &= 0xFE; i2c_start(); ถาม = i2c_send_byte(เพิ่ม); if(!ask) ถาม = i2c_send_byte(data); i2c_stop(); กลับถาม; )ฟังก์ชันนี้ได้รับการปรับแต่งสำหรับชิปนี้โดยเฉพาะแล้ว ตามข้อโต้แย้ง จะได้รับไบต์ที่จะถ่ายโอนไปยังบัสและที่อยู่ของชิป ฟังก์ชันจะค้นหาชิปตามที่อยู่ก่อนแล้วจึงส่งไบต์ หากชิปได้รับไบต์และตอบกลับด้วย ACK ฟังก์ชันก็จะทำงานกับชิปเสร็จสิ้นและคืนค่าศูนย์เป็นการส่งไบต์สำเร็จ และในเวลานี้ไมโครวงจรจะส่งออกไบต์นี้ไปยังพอร์ตขนาน มิฉะนั้นเราจะได้รับ NACK และส่งคืนอันหนึ่ง การส่งข้อมูลล้มเหลว
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE add) ( BYTE ถาม = ACK; เพิ่ม &= 0xFE; i2c_start(); ถาม = i2c_send_byte(เพิ่ม); สำหรับ(BYTE i=0; i ฟังก์ชั่นนี้ถูกสร้างขึ้นสำหรับการทดลอง ยอมรับตัวชี้ไปยังอาร์เรย์ของข้อมูลหนึ่งไบต์ จำนวนไบต์เหล่านี้ และที่อยู่ของชิป จริงๆ แล้ว เป็นความพยายามในการถ่ายโอนข้อมูลทั้งหมดในเซสชันเดียว ไม่ใช่หนึ่งไบต์ต่อเซสชัน ฟังก์ชั่นใช้งานได้ แต่ไม่เหมาะกับจอ LCD ตอนนี้เรากลับมาที่โปรแกรมหลักกันดีกว่า หลังจากเชื่อมต่อไลบรารีแล้วให้เขียนที่อยู่ของไมโครวงจร ต่อไป เราจะสร้างฟังก์ชันสามรายการที่คล้ายกับ lcd.h ข้อแตกต่างเพียงอย่างเดียวคือหลักการถ่ายโอนข้อมูล
เป็นโมฆะ com (BYTE com) ( com |= 0x08; // P3 ไปที่หนึ่งเพื่อให้ไฟแบ็คไลท์เปิดอยู่ pcf8574_byte_out(com, เพิ่ม); // ข้อมูลเอาท์พุตดอทคอม |= 0x04; // E ต่อหน่วย pcf8574_byte_out(com, เพิ่ม); // ข้อมูลเอาท์พุตดอทคอม &= 0xFB; // E ถึงศูนย์ pcf8574_byte_out(com, เพิ่ม); // ข้อมูลเอาท์พุต } ฟังก์ชั่นนี้จะส่งคำสั่งไปยังจอแสดงผลเท่านั้น นี่คือจุดที่บรรทัดแรกปรากฏขึ้นพร้อมกับการเพิ่มคำสั่งเชิงตรรกะจาก 0x08 ข้อบกพร่องนี้จำเป็นเนื่องจากเราไม่ได้ส่งไบต์โดยตรงไปยังพอร์ตของจอแสดงผล LCD แต่ส่งผ่านทวนสัญญาณของเรา นั่นคือถ้าเราระบุไบต์แล้วเราต้องส่งออกเพียงบิตเดียว ดังนั้นโปรดกำหนดบิตที่ต้องการให้กับไบต์ก่อนหน้าแล้วส่งอีกครั้งไปที่พอร์ต นี่เป็นเรื่องยุ่งยาก การบวกด้วย 0x08 จำเป็นต้องรักษาหนึ่งในหลักที่สามอย่างต่อเนื่อง จำแสงไฟได้ไหม? ส่วนเสริมนี้เองที่เปิดไฟแบ็คไลท์ จากนั้นเราเรียกใช้ฟังก์ชันการถ่ายโอนไบต์ไปยังบัส มันเขียนเกี่ยวกับข้างต้น จากนั้นเราจะถ่ายโอนไบต์ผ่านบัสไปยังชิป ถัดไป คุณควรตั้งค่า E เป็นหนึ่ง ซึ่งเป็นสิ่งที่การเพิ่มตรรกะของไบต์ด้วย 0x04 ทำได้จริง หลังจากรีเซ็ต E ดังนั้น คุณสามารถส่งคำสั่งใด ๆ ไปยังจอแสดงผลได้โดยส่งคำสั่งเป็นอาร์กิวเมนต์เท่านั้น เป็นโมฆะ init (เป็นโมฆะ) ( _delay_ms (30); // หยุดชั่วคราวหลังจากเปิดเครื่องดอทคอม(0x30); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x30); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x30); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x20); // เปลี่ยนเป็นโหมด 4 บิต _delay_us(40); // หน่วงเวลาสำหรับการดำเนินการคำสั่งดอทคอม(0x20); // การตั้งค่าพารามิเตอร์ดอทคอม(0x80); // การตั้งค่าพารามิเตอร์ดอทคอม(0x00); // ปิดจอแสดงผลดอทคอม(0x80); // ปิดจอแสดงผลดอทคอม(0x00); // ล้างจอแสดงผลดอทคอม(0x10); // ล้างจอแสดงผลดอทคอม(0x00); // ตั้งค่าโหมดป้อนข้อมูลดอทคอม(0x60); // ตั้งค่าโหมดป้อนข้อมูลดอทคอม(0x00); // เปิดจอแสดงผลด้วยเคอร์เซอร์ที่เลือกดอทคอม(0xC0); // เปิดจอแสดงผลด้วยเคอร์เซอร์ที่เลือก } ฟังก์ชันนี้จะเริ่มต้นการแสดงผลเท่านั้น ลำดับของคำสั่งนำมาจากแผ่นข้อมูลบนจอแสดงผล LCD เป็นโมฆะ char_out (ข้อมูล BYTE) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // ถ่ายโอน data_h ที่สำคัญที่สุด 4 บิต |= 0x04; pcf8574_byte_out (data_h, เพิ่ม); // ถ่ายโอน 4 บิตที่สำคัญที่สุด data_h &= 0xF9; // ถ่ายโอน 4 บิตที่สำคัญที่สุด pcf8574_byte_out(data_h, เพิ่ม); // โอนต่ำ 4 บิต pcf8574_byte_out(data_l, เพิ่ม); // โอนต่ำ 4 บิต data_l |= 0x04; // โอนต่ำ 4 บิต } pcf8574_byte_out(data_l, เพิ่ม); data_l &= 0xF9; pcf8574_byte_out(data_l, เพิ่ม);

ฟังก์ชั่นนี้จะส่งข้อมูลไปยังจอ LCD มันถูกดำเนินการในลักษณะเดียวกับคำสั่ง ยกเว้นว่าไบต์จะถูกส่งก่อนด้วย nibble ที่สำคัญที่สุด จากนั้นจึงส่งด้วยไบต์ต่ำ และส่วนที่เหลือก็เหมือนกัน

เป็นโมฆะ 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); // E ถึงศูนย์) และที่เหลือก็อาจน้อยลงเช่นกัน ตัวอย่างเช่น void char_out(ข้อมูล BYTE) จะรับการเรียกเพียงสองครั้ง และยิ่งกว่านั้นโดยไม่มีตัวแปรเพิ่มเติม การเริ่มต้นใช้งาน LCD เกิดขึ้นโดยละเมิดข้อกำหนดด้านเวลา

อเล็กซ์เซย์ 02.08.15 19:11 น

เนื่องจากเครื่องหมายจุลภาคหายไป จอแสดงผลจะไม่ได้รับผลกระทบ อุปกรณ์นี้ได้รับการออกแบบมาเป็นพิเศษสำหรับจอแสดงผลที่มีตัวควบคุมนี้หรือตัวควบคุมที่คล้ายกัน แต่ไมโครวงจรนี้เป็นตัวขยายพอร์ตที่เรียบง่ายจริงๆ ฉันเห็นด้วยกับเรื่องอี จำเป็นต้องมีตัวแปรเพิ่มเติม หากคุณส่งอาร์กิวเมนต์ไปยังฟังก์ชันและดำเนินการบางอย่างโดยใช้ตรรกะ อาจเกิดข้อผิดพลาดได้ ฉันเคยเจอสิ่งนี้มาแล้ว การเริ่มต้นจะดำเนินการโดยไม่มีการละเมิดกำหนดเวลา เอกสารระบุว่ามีการหยุดชั่วคราว 40 µs ระหว่างคำสั่ง เนื่องจากการถ่ายโอนเกิดขึ้นบนบัส i2c ซึ่งเป็นซอฟต์แวร์และช้า ระยะเวลาจึงเสร็จสิ้นพร้อมดอกเบี้ย หากคุณยังไม่ขี้เกียจเกินไปก็เขียนเวอร์ชันของคุณแล้วส่งมาให้ฉัน ฉันจะเผยแพร่มัน ท้ายที่สุดแล้ว ไซต์นี้มีไว้สำหรับผู้ชมสมัครเล่น และใครก็ตามที่ต้องการสามารถแสดงความคิดเห็นและวิสัยทัศน์เกี่ยวกับชีวิตของ MK ได้

อเล็กซ์ 06.08.15 09:14

เพิ่มการกำหนดเวลาเมื่อเริ่มต้นการแสดงผลตามที่ระบุไว้โดย "ผู้รู้หนังสือ" ที่เคารพ

มิทรี 14/06/59 21:57 น

รุสลัน 21.12.16 19:54
อเล็กซ์ 21/12/59 21:53

โอ้ใช่ โดยเฉพาะโค้ดใน ASMA ผู้เชี่ยวชาญ Arduino จะประทับใจอย่างเต็มที่)))

พี.ซี.
แม้ว่าคุณจะไม่ได้ดู ASM แต่โปรแกรมก็ถูกเขียนขึ้นสำหรับคอนโทรลเลอร์ PIC นี่เป็นข้อมูลที่มีประโยชน์ "มาก" สำหรับผู้เชี่ยวชาญ AVR หรือไม่ โดยเฉพาะสำหรับผู้เริ่มต้น))) ฉันไม่มีอะไรเทียบกับ PIC แต่แม้แต่ ASM สำหรับ PIC และ AVR ก็แตกต่างออกไป ส่วนรายละเอียดการทำงานของจอ LCD ก็ลองดูนะครับ))) จริงครับ ผมเขียนไว้ใต้ CVAVR เหมือนกัน แต่คำสั่งทั้งหมดจะถูกแยกชิ้นส่วนและจัดเรียงเป็นชั้นวาง แต่ไม่ว่าในกรณีใดให้ตัดสินใจด้วยตัวเองว่าเขียนตรงไหนชัดเจนกว่านี้))) ผู้เขียนเขียนผู้อ่านเลือก

อ. 01/04/60 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/60 21:26 น

ขอให้เป็นวันที่ดี! และคุณยังสามารถใช้โค้ดฟังก์ชัน lcdgotoxy และ lcdclear เพื่อทำงานร่วมกับอะแดปเตอร์ PCF8574 ได้

อเล็กซานเดอร์ 05.20.18 18:14

ขอให้เป็นวันที่ดี! คุณจะแสดงข้อความภาษารัสเซียได้อย่างไร?

อเล็กซ์ 05.20.18 23:04

นี่คือจอแสดงผลภายในประเทศจาก MELT อักษรซีริลลิกเดินสายอยู่ในความทรงจำของเขา

อเล็กซานเดอร์ 21/05/18 04:55

ขอให้เป็นวันที่ดี! ฉันเขียนเหมือนที่คุณทำในโครงการสำหรับ AtmelStudio 6.2 "ЁPҐBET MҐP!" มันออกปกติ
และถ้าคุณเขียนว่า "HELLO WORLD!" ก่อให้เกิดเรื่องไร้สาระทุกประเภท ฉันมีสอง
หนึ่งในตัวเลือกการแสดงผลมีอักษรซีริลลิก ประการที่สองคือภาษาจีน

อเล็กซ์ 21/05/18 09:22

ฉันจะเขียนโปรแกรมทดสอบก่อน วนซ้ำผ่านหน่วยความจำทั้งหมดและแสดงสัญลักษณ์และที่อยู่ แล้วจะรู้ว่าปัญหาคืออะไร เป็นไปได้มากว่าตารางอักขระไม่ตรงกับตาราง ASCII

อันเดรย์ 03.09.18 08:32

ขอให้เป็นวันที่ดี!

คุณสามารถจัดเตรียมแผนภาพวงจรสำหรับ Proteus ได้หรือไม่?

อันเดรย์ 09/03/18 10:22

หรือไม่มีใครตรวจสอบที่ Proteuse?

อันเดรย์ 09/03/18 10:56

คิดออก main_init

พาเวล 30/05/19 23:35

สิ่งที่น่าสงสัยคือที่อยู่ที่แสดงคือ 0x4E และหากจอแสดงผลเดียวกันเชื่อมต่อกับ Arduino ที่อยู่จะเป็น 0x27

พาเวล 31/05/19 11:04

ขอบคุณมากสำหรับงานของคุณ! ฉันค้นหาอินเทอร์เน็ตทั้งหมดแล้ว และไม่มีตัวอย่างใดที่ให้ไว้ยกเว้นตัวอย่างของคุณที่ได้ผล สิ่งเดียวคือในไฟล์เก็บถาวรโครงการไม่ได้ระบุความล่าช้า _delay_ ในฟังก์ชันการเริ่มต้นการแสดงผล ดังนั้นจึงไม่ทำงาน

อเล็กซ์ 06/01/19 09:52

นี่เป็นโครงการสาธิตมากกว่า ด้วยเหตุผลที่ดี จำเป็นต้องเขียนไลบรารี axlib ใหม่ แต่เนื่องจากข้อเท็จจริงที่ว่า STM32 และ STM8 มีการเคลื่อนไหวแบบก้าวกระโดด ทำให้ AVR ไม่มีประโยชน์เลย

พาเวล 06/05/19 12:57

STM ไม่มีแพ็คเกจ DIP การสร้างแผงวงจรพิมพ์ทำได้ยากกว่า สำหรับโปรเจ็กต์ของฉัน ความสามารถของ AVR มีมากมาย คุณสามารถใส่ Atmega 8 ได้มากมาย

อเล็กซ์ 06/05/19 15:20

ใช่ แต่ Atmega8 และ stm8s003 ราคาเท่าไหร่)))

มิทรี 06/07/19 00:41 น

สวัสดีอเล็กซี่
ช่วยบอกวิธีอ่านสถานะพอร์ตจาก pcf8574 หน่อยได้ไหม?
ฉันต้องการสร้างหน่วยภายนอก 8 GPIO บนบัส i2c แค่นั้นแหละ

มิทรี 06/07/19 17:56

ฉันจะตอบตัวเอง
ฟังก์ชั่นส่งคืนไบต์ - สถานะของพอร์ตไมโครวงจร
uint8_t pcf8574_byte_rcv (uint8_t เพิ่ม)
{
uint8_t ถาม = ACK;
เพิ่ม |= 0b01; //อ่าน
ข้อมูล uint8_t=0;
i2c_start();
ถาม = i2c_send_byte (addr);
ถ้า (! ถาม) ข้อมูล = i2c_read_byte (NACK);
i2c_stop();

ส่งคืนข้อมูล;
}

พาเวล 06/07/19 20:37

ราคาเท่าไหร่ 150 รูเบิลสำหรับราคารีเลย์โดยทั่วไป) และคุณจะต่อสายบอร์ดสำหรับ STM ได้อย่างไร? LUT ไม่น่าเชื่อถือ เราเตอร์ CNC ไม่แน่ใจว่าจะต้องทำอะไร (ยังไม่ได้ลอง)

บางทีอาจเป็นหนึ่งในหน้าจอที่ได้รับความนิยมมากที่สุดในตลาด สร้างขึ้นบนคอนโทรลเลอร์ HD44780U ยอดนิยม จากชื่อรุ่นหน้าจอจะประกอบด้วยอักขระ 16 บรรทัดสองบรรทัด รุ่นนี้ไม่มีการรองรับภาษารัสเซีย

บัสข้อมูล sh2s ช่วยให้คุณเชื่อมต่ออุปกรณ์ได้สูงสุด 127 เครื่องผ่านสายสองเส้นพร้อมกัน I2C นี้ใช้กับชิป PCF8574T

แผนภาพการเชื่อมต่อ:

สีน้ำเงินคือความต้านทานแบบแปรผันที่ให้คุณปรับคอนทราสต์ของหน้าจอได้

จัมเปอร์ทางด้านซ้ายมีหน้าที่รับผิดชอบไฟแบ็คไลท์ของหน้าจอ

บล็อกผู้ติดต่อ 4 รายเชื่อมต่อกับ Arduino ดังนี้:

จีเอ็นดี - จีเอ็นดี
วีซีซี - 5V
SDA - A4 (ถ้า Arduino MEGA จากนั้นเป็น D20)
SCL - A5 (ถ้า Arduino MEGA จะเป็น D21)

ห้องสมุด

ร่าง

จอแสดงผลอาจมีที่อยู่ IIC ที่แตกต่างกัน แทนที่จะเป็น 0x27 อาจเป็น 0x3F คุณสามารถใช้เครื่องสแกนอุปกรณ์ i2c เพื่อระบุที่อยู่ได้อย่างแม่นยำ

#รวม #รวม //กำหนดที่อยู่ของหน้าจอ LCD 0x27, 16 ตัวอักษร, 2 บรรทัดจอแอลซีดี LiquidCrystal_I2C (0x27, 16, 2); การตั้งค่าเป็นโมฆะ() ( lcd.init(); // เริ่มต้นหน้าจอ //เปิดไฟแบ็คไลท์จอแอลซีดีแบ็คไลท์ (); //กำหนดตำแหน่งเริ่มต้นที่ข้อความจะแสดงจอแอลซีดี setCursor (2, 0); //บรรทัดเอาต์พุต 1 lcd.print("สวัสดีชาวโลก!"); //พิมพ์บรรทัดที่สองในลักษณะเดียวกันจอแอลซีดี setCursor (1, 1);

บางทีอาจเป็นหนึ่งในหน้าจอที่ได้รับความนิยมมากที่สุดในตลาด สร้างขึ้นบนคอนโทรลเลอร์ HD44780U ยอดนิยม จากชื่อรุ่นหน้าจอจะประกอบด้วยอักขระ 16 บรรทัดสองบรรทัด รุ่นนี้ไม่มีการรองรับภาษารัสเซีย

บัสข้อมูล sh2s ช่วยให้คุณเชื่อมต่ออุปกรณ์ได้สูงสุด 127 เครื่องผ่านสายสองเส้นพร้อมกัน I2C นี้ใช้กับชิป PCF8574T

แผนภาพการเชื่อมต่อ:

สีน้ำเงินคือความต้านทานแบบแปรผันที่ให้คุณปรับคอนทราสต์ของหน้าจอได้

จัมเปอร์ทางด้านซ้ายมีหน้าที่รับผิดชอบไฟแบ็คไลท์ของหน้าจอ

บล็อกผู้ติดต่อ 4 รายเชื่อมต่อกับ Arduino ดังนี้:

จีเอ็นดี - จีเอ็นดี
วีซีซี - 5V
SDA - A4 (ถ้า Arduino MEGA จากนั้นเป็น D20)
SCL - A5 (ถ้า Arduino MEGA จะเป็น D21)

ห้องสมุด

ร่าง

จอแสดงผลอาจมีที่อยู่ IIC ที่แตกต่างกัน แทนที่จะเป็น 0x27 อาจเป็น 0x3F คุณสามารถใช้เครื่องสแกนอุปกรณ์ i2c เพื่อระบุที่อยู่ได้อย่างแม่นยำ

#รวม #รวม //กำหนดที่อยู่ของหน้าจอ LCD 0x27, 16 ตัวอักษร, 2 บรรทัดจอแอลซีดี LiquidCrystal_I2C (0x27, 16, 2); การตั้งค่าเป็นโมฆะ() ( lcd.init(); // เริ่มต้นหน้าจอ //เปิดไฟแบ็คไลท์จอแอลซีดีแบ็คไลท์ (); //กำหนดตำแหน่งเริ่มต้นที่ข้อความจะแสดงจอแอลซีดี setCursor (2, 0); //บรรทัดเอาต์พุต 1 lcd.print("สวัสดีชาวโลก!"); //พิมพ์บรรทัดที่สองในลักษณะเดียวกันจอแอลซีดี setCursor (1, 1);

  • จอแอลซีดี.print("www.site"); ) วนซ้ำเป็นโมฆะ () ( )
  • โมดูล FC-113 ใช้ชิป PCF8574T ซึ่งเป็นรีจิสเตอร์กะ 8 บิต ซึ่งเป็น "ตัวขยาย" อินพุต-เอาต์พุตสำหรับบัสอนุกรม I2C ในรูปไมโครวงจรถูกกำหนดให้เป็น DD1
  • R1 เป็นตัวต้านทานแบบทริมสำหรับปรับคอนทราสต์ของจอ LCD
  • Jumper J1 ใช้เพื่อเปิดไฟแบ็คไลท์ของจอแสดงผล
  • พิน 1…16 ใช้สำหรับเชื่อมต่อโมดูลกับพินของจอแสดงผล LCD ต้องใช้คอนแทคแพด A1...A3 เพื่อเปลี่ยนที่อยู่ I2C ของอุปกรณ์ คุณสามารถเปลี่ยนที่อยู่ของอุปกรณ์ได้โดยการบัดกรีจัมเปอร์ที่เหมาะสม ตารางแสดงความสอดคล้องของที่อยู่และจัมเปอร์: “0” สอดคล้องกับวงจรเปิด “1” ถึงจัมเปอร์ที่ติดตั้งไว้ ตามค่าเริ่มต้น จัมเปอร์ทั้ง 3 ตัวจะเปิดอยู่และที่อยู่ของอุปกรณ์.

2 0x27แผนภาพการเชื่อมต่อจอแสดงผล LCD กับ Arduino

ผ่านโปรโตคอล I2C


3 โมดูลเชื่อมต่อกับ Arduino ด้วยวิธีมาตรฐานสำหรับบัส I2C: พิน SDA ของโมดูลเชื่อมต่อกับพอร์ตอะนาล็อก A4, พิน SCL เชื่อมต่อกับพอร์ตอะนาล็อก A5 ของ Arduino โมดูลนี้ใช้พลังงานจาก +5 V จาก Arduino ตัวโมดูลเชื่อมต่อกันด้วยพิน 1…16 กับพินที่เกี่ยวข้อง 1…16 บนจอแสดงผล LCDแผนภาพการเชื่อมต่อจอแสดงผล LCD กับ Arduino

ห้องสมุดเพื่อการทำงาน

ตอนนี้เราต้องการไลบรารีเพื่อทำงานกับ LCD ผ่านทางอินเทอร์เฟซ I2C คุณสามารถใช้อันนี้ได้ (ลิงก์ในบรรทัด "ดาวน์โหลดโค้ดตัวอย่างและไลบรารี") ดาวน์โหลดไฟล์เก็บถาวรแล้ว LiquidCrystal_I2Cv1-1.rar คลายซิปไปที่โฟลเดอร์\ห้องสมุด\

ซึ่งอยู่ในไดเร็กทอรี Arduino IDE

ไลบรารีรองรับชุดฟังก์ชันมาตรฐานสำหรับหน้าจอ LCD:การทำงาน
วัตถุประสงค์ ลิควิดคริสตัล()
สร้างตัวแปรประเภท LiquidCrystal และยอมรับพารามิเตอร์การเชื่อมต่อจอแสดงผล (หมายเลขพิน) เริ่ม()
การเริ่มต้นจอแสดงผล LCD การตั้งค่าพารามิเตอร์ (จำนวนบรรทัดและตัวอักษร) ชัดเจน()
การล้างหน้าจอและคืนเคอร์เซอร์ไปที่ตำแหน่งเริ่มต้น บ้าน()
เลื่อนเคอร์เซอร์กลับไปที่ตำแหน่งเริ่มต้น ตั้งเคอร์เซอร์()
การตั้งค่าเคอร์เซอร์ไปยังตำแหน่งที่กำหนด เขียน()
แสดงสัญลักษณ์บนหน้าจอ LCD; พิมพ์()
แสดงข้อความบนหน้าจอ LCD; เคอร์เซอร์()
แสดงเคอร์เซอร์เช่น ขีดเส้นใต้ใต้ตำแหน่งของตัวละครถัดไป ไม่มีเคอร์เซอร์()
ซ่อนเคอร์เซอร์ กะพริบ()
เคอร์เซอร์กะพริบ; ไม่กะพริบ()
ยกเลิกการกระพริบ; ไม่มีการแสดงผล()
ปิดจอแสดงผลขณะบันทึกข้อมูลที่แสดงทั้งหมด แสดง()
การเปิดจอแสดงผลในขณะที่บันทึกข้อมูลที่แสดงทั้งหมด scrollDisplayLeft ()
เลื่อนเนื้อหาที่แสดงไปทางซ้าย 1 ตำแหน่ง scrollDisplayRight ()
เลื่อนเนื้อหาที่แสดงไปทางขวา 1 ตำแหน่ง เลื่อนอัตโนมัติ()
เปิดใช้งานการเลื่อนอัตโนมัติ ไม่เลื่อนอัตโนมัติ()
ปิดการใช้งานการเลื่อนอัตโนมัติ กำหนดทิศทางข้อความจากซ้ายไปขวา
ขวาไปซ้าย() ทิศทางข้อความจากขวาไปซ้าย
createChar() สร้างอักขระแบบกำหนดเองสำหรับหน้าจอ LCD

4 ร่างสำหรับการส่งออกข้อความไปยังหน้าจอ LCD ผ่านบัส I2C

มาเปิดตัวอย่าง: ตัวอย่างไฟล์ 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); // ตั้งค่าที่อยู่ 0x27 สำหรับจอ LCD 16x2 การตั้งค่าเป็นโมฆะ () (จอแอลซีดี.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); // พิมพ์สัญลักษณ์ "หัวใจ" ที่อยู่ในเซลล์ที่ 3 lcd.print(" Arduino "); } เป็นโมฆะวน() (// กระพริบอักขระตัวสุดท้าย lcd.setCursor(13, 1); // เลื่อนเคอร์เซอร์ไปที่บรรทัดที่ 2 อักขระ 1 lcd.print("\t"); }

ล่าช้า (500); จอแอลซีดี setCursor (13, 1); // เลื่อนเคอร์เซอร์ไปที่บรรทัดที่ 2 อักขระ 1 lcd.print(" ");ล่าช้า (500);

5 โดยวิธีการเขียนตัวอักษรตามคำสั่งจอแอลซีดี. createChar();

ยังคงอยู่ในหน่วยความจำจอแสดงผลแม้หลังจากปิดเครื่องแล้วเพราะว่า เขียนเพื่อแสดง ROM 1602 สร้างสัญลักษณ์ของคุณเองสำหรับจอ LCD {00000, 01010, 11111, 11111, 01110, 00100, 00000} มาดูปัญหาการสร้างสัญลักษณ์ของคุณเองสำหรับหน้าจอ LCD กันดีกว่า อักขระแต่ละตัวบนหน้าจอประกอบด้วย 35 จุด: กว้าง 5 จุดและสูง 7 จุด (+1 บรรทัดสำรองสำหรับการขีดเส้นใต้) ในบรรทัดที่ 6 ของภาพร่างด้านบน เรากำหนดอาร์เรย์ของตัวเลข 7 ตัว:

6 (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0)- แปลงเลขฐานสิบหกเป็นไบนารี่:

- ตัวเลขเหล่านี้ไม่ใช่อะไรมากไปกว่าบิตมาสก์สำหรับแต่ละบรรทัดทั้ง 7 บรรทัดของสัญลักษณ์ โดยที่ "0" หมายถึงจุดสว่าง และ "1" หมายถึงจุดมืด ตัวอย่างเช่น สัญลักษณ์รูปหัวใจที่ระบุเป็นบิตมาสก์จะปรากฏบนหน้าจอดังแสดงในรูป


7 การควบคุมหน้าจอ LCDผ่านบัส I2C

นอกจากนี้ เรามาดูแผนภาพเวลาสำหรับการแสดงอักขระละติน "A", "B" และ "C" บนจอแสดงผล LCD อักขระเหล่านี้จะถูกจัดเก็บไว้ใน ROM การแสดงผลและแสดงบนหน้าจอเพียงแค่ส่งที่อยู่ไปยังจอแสดงผล แผนภาพนี้นำมาจากพิน RS, RW, E, D4, D5, D6 และ D7 ของจอแสดงผลเช่น หลังจากตัวแปลง "บัสขนาน I2C" ของ FC-113 แล้ว เราสามารถพูดได้ว่าเรากำลังเจาะลึกเข้าไปในฮาร์ดแวร์อีกเล็กน้อย


แผนภาพเวลาของเอาต์พุตของอักขระละติน "A", "B" และ "C" บนจอ LCD 1602

แผนภาพแสดงให้เห็นว่าอักขระที่อยู่ใน ROM การแสดงผล (ดูหน้า 11 ของแผ่นข้อมูลลิงก์ด้านล่าง) จะถูกส่งเป็นสอง nibbles โดยอันแรกจะกำหนดหมายเลขคอลัมน์ของตารางและอันที่สอง - หมายเลขแถว ในกรณีนี้ ข้อมูลจะถูก "ล็อค" ที่ขอบของสัญญาณบนเส้น อี(เปิดใช้งาน) และเส้น อาร์.เอส.(เลือกการลงทะเบียน) อยู่ในสถานะหนึ่งแบบลอจิคัล ซึ่งหมายความว่าข้อมูลกำลังถูกถ่ายโอน สถานะต่ำบนบรรทัด RS หมายความว่าคำสั่งกำลังถูกส่ง ซึ่งเป็นสิ่งที่เราเห็นก่อนที่จะส่งอักขระแต่ละตัว ในกรณีนี้ รหัสคำสั่งสำหรับการเลื่อนแคร่กลับไปยังตำแหน่ง (0, 0) ของจอ LCD จะถูกส่งไป ซึ่งสามารถพบได้โดยการศึกษาคำอธิบายทางเทคนิคของจอแสดงผลด้วย

และอีกตัวอย่างหนึ่ง แผนภาพเวลานี้แสดงเอาท์พุตของสัญลักษณ์รูปหัวใจบนจอ LCD


อีกครั้งสองแรงกระตุ้นแรก เปิดใช้งานปฏิบัติตามคำแนะนำ บ้าน()(0000 0010 2) - กลับแคร่ไปที่ตำแหน่ง (0; 0) และสองอันที่สอง - เอาต์พุตไปยังจอ LCD ที่เก็บไว้ในเซลล์หน่วยความจำ 3 10 (0000 0011 2) สัญลักษณ์ "หัวใจ" (คำแนะนำ lcd.createChar(3, หัวใจ);ร่าง).