이 튜토리얼은 PIC 튜토리얼 시리즈 의 여섯 번째 튜토리얼이며,이 튜토리얼 에서는 16x2 LCD와 PIC 마이크로 컨트롤러의 인터페이스를 배웁니다. 이전 자습서에서 일부 LED 깜박임 프로그램을 사용하여 PIC의 기본 사항을 배웠으며 PIC 마이크로 컨트롤러에서 타이머를 사용하는 방법도 배웠습니다. MPLABX 및 XC8 컴파일러를 사용하여 PIC 마이크로 컨트롤러 학습에 대한 모든 자습서를 여기에서 확인할 수 있습니다.
이 튜토리얼은 PIC16F877A와 16x2 LCD를 인터페이스하는 방법을 배우고이 튜토리얼의 끝에서 자세한 비디오를 확인하기 때문에 흥미로운 튜토리얼이 될 것입니다. 사용자 표시를 위해 LED를 사용했던 옛날은 지났습니다. LCD 디스플레이를 사용하여 프로젝트를 더 멋지고 유용하게 만드는 방법을 살펴 보겠습니다. 또한 Interfacing LCD with 8051, Arduino, Raspberry Pi, AVR에 대한 이전 기사를 확인하십시오.
LCD와 PIC 마이크로 컨트롤러를 연결하는 기능:
일을 더 쉽게하기 위해 우리는 PIC16F877A와 함께이 LCD 를 사용하는 동안 일을 쉽게 할 수 있는 작은 라이브러리 를 만들었습니다. 여기에는 PIC MCU를 사용하여 LCD를 구동하는 데 필요한 모든 기능이 포함 된 헤더 파일 "MyLCD.h"가 다운로드 용으로 제공됩니다. 라이브러리 코드는 주석 줄로 잘 설명되어 있지만 여전히 의심스러운 점이 있으면 주석 섹션을 통해 문의하십시오. 또한 기본 LCD 작동 및 핀 배치에 대한이 문서를 확인하십시오.
참고: 디버깅이나 MCU 변경에 도움이되므로 헤더 파일 내부에서 실제로 어떤 일이 발생하는지 항상 아는 것이 좋습니다.
이제이 코드를 프로그램에 추가하는 두 가지 방법이 있습니다. MyLCD.h에서 위의 모든 코드 줄을 복사하여 void main () 앞에 붙여 넣을 수 있습니다. 또는 링크를 사용하여 헤더 파일을 다운로드하고 프로젝트의 헤더 파일 ( #include "MyLCD.h "; )에 추가 할 수 있습니다. 헤더 파일을 마우스 오른쪽 버튼으로 클릭하고 기존 항목 추가를 선택 하고이 헤더 파일을 찾아 보면 됩니다.
여기에서 헤더 파일 코드를 복사하여 메인 C 파일에 붙여 넣었습니다. 따라서 우리 코드를 사용하는 경우 헤더 파일을 다운로드하여 프로그램에 추가 할 필요가 없습니다. 이 자습서 끝에 제공된 전체 코드를 사용하면됩니다. 또한이 라이브러리는 PIC16F 시리즈 PIC 마이크로 컨트롤러 만 지원합니다.
다음은 아래 헤더 파일 의 각 기능을 설명 합니다.
void Lcd_Start (): 이 함수는 LCD 작업을 시작하기 위해 호출해야하는 첫 번째 함수 여야합니다. 프로그램의 지연을 피하기 위해이 함수를 한 번만 호출해야합니다.
void Lcd_Start () {Lcd_SetBit (0x00); for (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H는 Return home에 사용-> RAM을 지우고 LCD를 초기화합니다. Lcd_Cmd (0x02); // 02H는 Return home에 사용-> RAM을 지우고 LCD를 초기화합니다. Lcd_Cmd (0x08); // 1 행 선택 Lcd_Cmd (0x00); // 1 행 표시 지우기 Lcd_Cmd (0x0C); // 2 행 선택 Lcd_Cmd (0x00); // 행 2 디스플레이 지우기 Lcd_Cmd (0x06); }
Lcd_Clear (): 이 함수는 LCD 화면을 지우고 루프 내부에서 이전 데이터의 모양을 지우는 데 사용할 수 있습니다.
Lcd_Clear () {Lcd_Cmd (0); // LCD 지우기 Lcd_Cmd (1); // 커서를 첫 번째 위치로 이동}
void Lcd_Set_Cursor (x pos, y pos): 일단 시작되면 LCD는 명령을받을 준비가됩니다.이 함수를 사용하여 LCD가 원하는 위치에 커서를 설정하도록 지시 할 수 있습니다. 첫 번째 행의 5 번째 문자에 커서가 필요하다고 가정합니다. 그러면 함수는 void Lcd_Set_Cursor (1, 5)가됩니다.
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; if (a == 1) {온도 = 0x80 + b-1; // 80H는 커서를 이동하는 데 사용됩니다. z = temp >> 4; // 낮은 8 비트 y = temp & 0x0F; // 상위 8 비트 Lcd_Cmd (z); // 행 설정 Lcd_Cmd (y); // 열 설정} else if (a == 2) {temp = 0xC0 + b-1; z = 온도 >> 4; // 낮은 8 비트 y = temp & 0x0F; // 상위 8 비트 Lcd_Cmd (z); // 행 설정 Lcd_Cmd (y); // 열 설정}}
void Lcd_Print_Char (char data): 커서가 설정되면이 함수를 간단히 호출하여 해당 위치에 문자를 쓸 수 있습니다.
void Lcd_Print_Char (char data) // 4 비트 모드로 8 비트 전송 {char Lower_Nibble, Upper_Nibble; Lower_Nibble = 데이터 & 0x0F; Upper_Nibble = 데이터 & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // 4만큼 이동하여 위쪽 절반 보내기 EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // 하반부 보내기 EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): 문자 그룹이 표시 될 경우 문자열 함수를 사용할 수 있습니다.
void Lcd_Print_String (char * a) {int i; for (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // 포인터를 사용하여 문자열을 분할하고 Char 함수를 호출합니다.}
Lcd_Print_Char (char data) 가 호출 될 때마다 해당 문자 값이 LCD의 데이터 라인으로 전송됩니다. 이러한 문자는 비트 형태로 HD44780U에 도달합니다. 이제이 IC는 아래 표와 같이 ROM 메모리를 사용하여 표시 할 문자에 비트를 연결합니다. HD44780U LCD 컨트롤러 의 데이터 시트에서 모든 문자에 대한 비트를 찾을 수 있습니다 .
이제 헤더 파일에 만족 했으므로 회로를 빌드하고 프로그램을 테스트 해 보겠습니다. 또한 위에 제공된 링크에 제공된 전체 헤더 파일을 확인하십시오.
회로도 및 테스트:
아래는 16x2 LCD와 PIC 마이크로 컨트롤러를 연결하기위한 회로도입니다.
이전 튜토리얼에서 사용한 것과 동일한 보드를 사용하고 있으므로 위 회로에서 전원 공급 장치 또는 ICSP 연결을 표시하지 않았습니다. 여기에서 확인하십시오.
프로그램에서 주목해야 할 중요한 사항은 LCD의 핀 정의입니다.
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
이러한 핀 정의는 프로그래머 하드웨어 설정에 따라 변경할 수 있습니다. 여기서 변경하는 경우 주 기능에서 존중되는 포트 구성을 변경해야합니다.
이 프로젝트의 하드웨어는 매우 간단합니다. 지난번에 사용한 것과 동일한 PIC 모듈을 재사용하고 점퍼 와이어를 사용하여 LCD 모듈을 PIC에 연결합니다.
연결은 다음 표에서 이해할 수 있습니다.
LCD 핀 번호 |
LCD 핀 이름 |
MCU 핀 이름 |
MCU 핀 번호 |
1 |
바닥 |
바닥 |
12 |
2 |
VCC |
+ 5V |
11 |
삼 |
VEE |
바닥 |
12 |
4 |
등록 선택 |
RD2 |
21 |
5 |
읽기 / 쓰기 |
바닥 |
12 |
6 |
활성화 |
RD3 |
22 |
7 |
데이터 비트 0 |
체크 안함 |
- |
8 |
데이터 비트 1 |
체크 안함 |
- |
9 |
데이터 비트 2 |
체크 안함 |
- |
10 |
데이터 비트 3 |
체크 안함 |
- |
11 |
데이터 비트 4 |
RD4 |
27 |
12 |
데이터 비트 5 |
RD5 |
28 |
13 |
데이터 비트 6 |
RD6 |
29 |
14 |
데이터 비트 7 |
RD7 |
30 |
15 |
LED 긍정적 |
+ 5V |
11 |
16 |
LED 네거티브 |
바닥 |
12 |
이제 간단히 연결하고 코드를 MCU에 덤프하고 출력을 확인하겠습니다.
궁금한 점이 있으면 댓글란을 이용해주세요. 또한 아래 제공된 데모 비디오를 확인하십시오.