Giao tiếp LCD 16*2 với 74HC595 dùng PIC16F887

https://paste.ofcode.org/37VJkSqBkf66UhQhhJBdfKq?fbclid=IwAR2wD0m7oNOWVaTyaBhz2wMKHQSC0dUhvxQnHTbZQBu5WnFy-yPO-Or25gU
Code của e không thể hiển thị được dòng 2 của LCD , mọi người có thể giúp e biết lỗi đâu không ạ

Sau khi click vào link.

404 Not Found

The resource could not be found.

/6jxdbPzGjwqjYLNwwmFY4J
3 Likes

Tại sao em không nối thẳng vào mà phải qua 2 con IC kia làm gì ?
Tiết kiệm được 3 chân và mất thêm 2 con IC ?

3 Likes

Nối thẳng mới tốn nhiều chân ấy. Thường thì vdk sẽ dùng nhiều chân nên phải qua hai con U1, U3 kia để tiết kiệm chân vs điều khiển tiện hơn

1 Like

Nối thẳng mất 6 chân.
Nối thế kia mất 3 chân và 2 con IC.

Giữa 3 chân và 2 con IC thì em chọn giải pháp nào ::))

3 Likes

Nối từ LCD sang U1 mất 11 chân.
Trong một project ngoài LCD còn dùng nhiều Sensors, Motor,… cần nhiều chân nối với vdk
Anh nối trực tiếp hết vào vdk như vậy, sẽ tốn nhiều chân của vdk, hơn nữa giá 2 con IC U2, U3 rẻ hơn rất nhiều so vs con vdk U1
Còn một giải giáp dùng thêm một con vdk như rứa nữa giá cũng hơi chát và lập trình giao tiếp giữa 2 con nữa
Ko có chân để các Sensors, Motor,… kết nối vs vdk, vs tốn 3 chân và 2 con IC rẻ tiền anh chọn giải pháp nào :))

2 Likes

3 Likes

LCD có thể kết nối theo kiểu 4 chân hoặc 8 chân. Bạn ấy đang dùng theo chuẩn 8 chân :))
Nếu nối theo anh vẫn tốn 6 chân so vs 3 chân
Dùng 2 con IC kia thì vẫn hiệu quả về mặt code vs lại tối ưu hơn, để chân còn dự phòng khi mở rộng project :))

1 Like

Rồi rồi hiệu quả về mặt code, tối ưu… ::))

3 Likes

e đã edit lại rồi ạ . a vào xem lại thử ạ

1 Like

dạ mục đích cuối của e là muốn dùng 1 con 595 mất 3 chân và giao tiếp 4 bit , e viết thử 8bit trước , được e mới chuyển qua viết 4 bit chỉ còn 1 con 595 ạ . muốn tiếp kiệm mấy chân data lỡ làm việc khác ạ

dạ ý em cũng là thế , mình có khi không dùng hết chân nhưng muốn biết thêm để biết đâu có lần phải dùng kiểu này

Em đưa code lên…
Đưa code của thư viện lcd.
Nếu viết spi thì 4 bit dễ và tốt hơn 8 bit.

3 Likes

e chưa học tới phần giao tiếp , code e e để ở link trên , a có t/g vào xem thử hộ e với ạ

A ko có thời gian xem, chỉ sửa thư viện một chút thôi.

lm1602a_spi.c — Thư viện lcd 2 dòng 4 bit giao tiếp spi qua ghi dịch 595


#include "system_conf.h"

unsigned char lcd_data = 0;

#separate void LCD_Sync(){
   unsigned char dat = lcd_data;
   output_low(SPI_CLK);
   output_low(SPI_LAT);
   for(int i=0;i<8;i++){
      output_low(SPI_CLK);
      output_bit(SPI_DAT, dat & 0x80);
      dat<<=1;
      output_high(SPI_CLK);
   }
   output_high(SPI_LAT);
}

#separate void LCD_SetEN(unsigned char on){
   if(on) lcd_data |= 0b00000100;
   else lcd_data &= 0b11111011;
   LCD_Sync();
}

#separate void LCD_SetRS(unsigned char on){
   if(on) lcd_data |= 0b00000001;
   else lcd_data &= 0b11111110;
   LCD_Sync();
}

#separate void LCD_PulseEnable ( void ){
    LCD_SetEN(1);
    delay_us(10); // was 10
    LCD_SetEN(0);
    delay_us(100); // was 5
}



#separate void LCD_SetData ( unsigned int data ){
    lcd_data &= 0x0F;
    if(data & 0x01) lcd_data |= 0x10;
    if(data & 0x02) lcd_data |= 0x20;
    if(data & 0x04) lcd_data |= 0x40;
    if(data & 0x08) lcd_data |= 0x80;
    LCD_Sync();
} 

#separate void LCD_PutCmd ( unsigned int cmd ){
    LCD_SetData ( swap ( cmd ) ); 
    LCD_PulseEnable();
    LCD_SetData ( swap ( cmd ) ); 
    LCD_PulseEnable();
}

#separate void LCD_PutClear (){
    LCD_PutCmd ( 0x01 );
    delay_ms(2);
}

#separate void LCD_Init (){
    LCD_SetData ( 0x00 );
    delay_ms(20); /* wait enough time after Vdd rise >> 15ms */
    LCD_SetRS(0);
    LCD_SetData (0x03); /* init with specific nibbles to start 4-bit mode */
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_PulseEnable();
    LCD_SetData ( 0x02 ); /* set 4-bit interface */
    LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
    LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
    LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
    LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */
    LCD_PutClear();
}

#separate void LCD_Goto(unsigned char line, unsigned char pos){
    if(line==0)LCD_PutCmd (0x80 + pos);
    else if(line==1) LCD_PutCmd(0xC0 + pos);
}

#separate void LCD_PutChar ( unsigned int c ){
    LCD_SetRS(1);
    LCD_PutCmd(c);
    LCD_SetRS(0);
}

system_conf.h — Khai báo chân SPI và cấu hình CPU

#ifndef __SYSTEM_CONF_H
#define __SYSTEM_CONF_H

#fuses HS
#use delay(clock=20000000)
#use fast_io(B)

// SPI
#define SPI_DAT PIN_B2
#define SPI_CLK PIN_B3
#define SPI_LAT PIN_B0

#endif

system.h — Tập tin khai báo CPU

#ifndef __SYSTEM_H
#define __SYSTEM_H
#include <16f887.h>
#endif

main.c — main để test

#include "system.h"
#include "lm1602a_spi.c"

int main(){
   set_tris_b(0xF0);
   LCD_Init();
   while(true){
      LCD_Goto(0,0);
      LCD_PutChar("The nay thi");
      LCD_Goto(1,0);
      LCD_PutChar("da duoc chua ?");
      delay_ms(1000);
   }
   return 0;
}

Đây là kết quả và cách nối. Có thể thay đổi chân nối vào chip (nhưng phải khai báo lại trong system_conf.h cho đúng).

4 Likes

em cảm ơn a nhiều ạ <3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?