디스플레이는 가전 제품이든 산업용 기계이든 기계의 필수 부분입니다. 디스플레이는 기계를 작동하기위한 제어 옵션을 표시 할뿐만 아니라 해당 기계가 수행 한 작업의 상태 및 출력도 표시합니다. 7 세그먼트 디스플레이, LCD 디스플레이, TFT 터치 스크린 디스플레이, LED 디스플레이 등과 같은 전자 제품에 사용되는 많은 유형의 디스플레이가 있습니다. 16x2 LCD 디스플레이 는 가장 기본적인 디스플레이이며 일부 소형 전자 장비에도 사용됩니다. 다른 마이크로 컨트롤러와의 기본 인터페이스를 포함하여 16x2 LCD를 사용하는 프로젝트:
- 8051 마이크로 컨트롤러와 LCD 인터페이스
- ATmega32 마이크로 컨트롤러와 LCD 인터페이스
- PIC 마이크로 컨트롤러와 LCD 인터페이스
- Arduino와 16x2 LCD 인터페이스
- Python을 사용하여 Raspberry Pi와 16x2 LCD 인터페이스
이 튜토리얼에서는 16x2 LCD를 ARM7-LPC2148 마이크로 컨트롤러 와 인터페이스 하고 간단한 환영 메시지를 표시하는 방법을 살펴 봅니다. ARM7을 처음 사용하는 경우 ARM7 LPC2148의 기초부터 시작하여 Keil uVision을 사용하여 프로그래밍하는 방법을 배웁니다.
필요한 재료
하드웨어
- ARM7-LPC2148 마이크로 컨트롤러 보드
- LCD (16X2)
- 전위차계
- 5V 전압 조정기 IC
- 브레드 보드
- 전선 연결
- 9V 배터리
- 마이크로 USB 케이블
소프트웨어
- Keil uVision 5
- Magic Flash 도구
프로젝트를 시작하기 전에 LCD 작동 모드와 LCD Hex 코드에 대해 몇 가지 알아야합니다.
16X2 LCD 디스플레이 모듈
16X2 LCD는 16 개의 열과 2 개의 행이 있다고 말합니다. 이 LCD에는 16 개의 핀이 있습니다. 아래 이미지와 표는 LCD 디스플레이의 핀 이름과 기능을 보여줍니다.
이름 |
함수 |
VSS |
접지 핀 |
VDD |
+ 5V 입력 핀 |
VEE |
대비 조정 핀 |
RS |
등록 선택 |
R / W |
읽기 / 쓰기 핀 |
이자형 |
핀 활성화 |
D0-D7 |
데이터 핀 (8 핀) |
LED A |
양극 핀 (+ 5V) |
LED K |
음극 핀 (GND) |
LCD는 4 비트 모드와 8 비트 모드의 두 가지 모드에서 작동 할 수 있습니다. 4 비트 모드 에서는 데이터 니블을 니블, 먼저 상위 니블, 다음 하위 니블로 보냅니다. 니블이 무엇인지 모르는 분들을 위해: 니블은 4 비트 그룹이므로 바이트의 하위 4 비트 (D0-D3)가 하위 니블을 형성하고 상위 4 비트 (D4-D7) 더 높은 니블을 형성합니다. 이를 통해 8 비트 데이터를 전송할 수 있습니다.
8 비트 모드 에서는 8 개의 데이터 라인을 모두 사용하기 때문에 8 비트 데이터를 한 번의 스트로크로 직접 보낼 수 있습니다.
이 프로젝트에서는 가장 일반적으로 사용되는 4 비트 모드를 사용합니다. 4 비트 모드에서는 마이크로 컨트롤러의 4 핀을 절약하고 배선 오버 헤드도 줄일 수 있습니다.
16x2는 또한 HEX 코드를 사용하여 모든 명령을 수행합니다. 커서 이동, 모드 선택, 컨트롤을 두 번째 줄로 이동 등과 같은 LCD에 대한 많은 16 진수 명령이 있습니다. 16X2 LCD 디스플레이 모듈 및 16 진수 명령에 대해 자세히 알아 보려면 링크를 따르십시오..
회로도 및 연결
아래 표는 LCD와 ARM7-LPC2148 간의 회로 연결을 보여줍니다.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (등록 선택) |
P0.6 |
E (사용) |
P0.12 |
D4 (데이터 핀 4) |
P0.13 |
D5 (데이터 핀 5) |
P0.14 |
D6 (데이터 핀 6) |
P0.15 |
D7 (데이터 핀 7) |
LCD 및 ARM7 스틱과 전압 조정기 연결
아래 표는 전압 조정기가있는 ARM7과 LCD 간의 연결을 보여줍니다.
전압 조정기 IC |
핀 기능 |
LCD 및 ARM-7 LPC2148 |
1. 왼쪽 핀 |
+ 배터리 9V 입력에서 Ve |
체크 안함 |
2. 센터 핀 |
-배터리에서 Ve |
VSS, R / W, K LCD ARM7의 GND |
3. 오른쪽 핀 |
조정 된 + 5V 출력 |
LCD의 VDD, A ARM7의 + 5V |
LCD가있는 전위차계
전위차계는 LCD 디스플레이의 대비를 변경하는 데 사용됩니다. 포트에는 3 개의 핀이 있는데 왼쪽 핀 (1)은 + 5V에 연결되고 가운데 (2)는 LCD 모듈의 VEE 또는 V0에 연결되고 오른쪽 핀 (3)은 GND에 연결됩니다. 노브를 돌려 대비를 조정할 수 있습니다.
점퍼 설정
ARM7-Stick에는 점퍼 핀이 있으므로 USB를 사용하거나 전원 전용 5V DC 입력을 사용하여 코드에 전원을 공급하고 업로드 할 수 있습니다. 아래 이미지를 볼 수 있습니다.
아래 이미지는 점퍼가 DC 위치에 있음을 보여줍니다. 즉, 외부 5V 전원에서 보드에 전원을 공급해야합니다.
이 이미지는 점퍼가 USB 모드로 연결된 것을 보여줍니다. 여기에서 전원과 코드는 마이크로 USB 포트를 통해 제공됩니다.
참고: 이 자습서에서는 점퍼를 USB로 설정 한 다음 점퍼를 DC 모드로 변경하여 레귤레이터의 5v 입력에서 LPC2148에 전원을 공급하여 USB를 사용하여 코드를 업로드했습니다. 당신은 마지막에 주어진 비디오 에서 이것을 확인할 수 있습니다.
16x2 LCD와 ARM7 마이크로 컨트롤러 를 연결 하는 최종 회로 는 다음과 같습니다.
ARM7-LPC2148 프로그래밍
ARM7-LPC2148을 프로그래밍하려면 keil uVision 및 Flash Magic 도구가 필요합니다. 마이크로 USB 포트를 통해 ARM7 Stick을 프로그래밍하기 위해 USB 케이블을 사용하고 있습니다. Keil을 사용하여 코드를 작성하고 16 진수 파일을 만든 다음 Flash Magic을 사용하여 HEX 파일을 ARM7 스틱에 플래시합니다. keil uVision 및 Flash Magic 설치 및 사용 방법에 대한 자세한 내용은 ARM7 LPC2148 마이크로 컨트롤러 시작하기 링크를 클릭하고 Keil uVision을 사용하여 프로그래밍하십시오.
ARM 7과 LCD를 인터페이싱하기위한 전체 코드는이 튜토리얼의 끝 부분에 제공되며 여기에서는 그 일부를 설명합니다.
먼저 필요한 헤더 파일을 포함해야합니다.
#포함
LCD 모듈 초기화는 매우 중요한 단계입니다. 여기에서는 실제로 명령 인 특정 HEX 코드를 사용하여 작동 모드 (4 비트), LCD 유형 (16x2), 시작 줄 등을 LCD에 알립니다.
void LCD_INITILIZE (void) // LCD를 준비하는 기능 { IO0DIR = 0x0000FFF0; // OUTPUT으로 핀 P0.4, P0.6, P0.12, P0.13, P0.14, P0.15 설정 delay_ms (20); LCD_SEND (0x02); // 4 비트 동작 모드로 LCD 초기화 LCD_SEND (0x28); // 2 줄 (16X2) LCD_SEND (0x0C); // 커서를 벗어난 커서에 표시 LCD_SEND (0x06); // 커서 자동 증가 LCD_SEND (0x01); // 클리어 LCD_SEND (0x80); // 첫 줄 첫 번째 위치 }
4 비트 모드의 경우 핀에 대해 서로 다른 유형의 쓰기 기능, 즉 상단 및 하단 니블을 사용합니다. 어떻게하는지 보자
void LCD_SEND (char command) // 16 진수 명령을 nibble로 전송하는 기능 { IO0PIN = ((IO0PIN & 0xFFFF00FF)-((command & 0xF0) << 8)); // 명령의 상위 니블 보내기 IO0SET = 0x00000040; // 인 에이블 HIGH IO0CLR = 0x00000030; // RS & RW LOW 만들기 delay_ms (5); IO0CLR = 0x00000040; // 낮은 값 활성화 delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF)-((명령 & 0x0F) << 12)); // 명령의 아래쪽 니블 보내기 IO0SET = 0x00000040; // 높은 IO0CLR 활성화 = 0x00000030; // RS & RW 낮음 delay_ms (5); IO0CLR = 0x00000040; // 낮은 활성화 delay_ms (5); }
니블 전송 로직
IO0PIN = ((IO0PIN & 0xFFFF00FF)-((명령 & 0x0F) << 12)); // 명령의 하위 니블 보내기 IO0PIN = ((IO0PIN & 0xFFFF00FF)-((command & 0xF0) << 8)); // 명령의 상위 니블 보내기
위의 두 진술은이 프로그램에서 중요한 역할을합니다. 첫 번째 명령은 아래쪽 니블을 보내고 두 번째 명령은 위쪽 니블을 보냅니다. 그것은 우리가하는 다른 핀에 영향을주지 않습니다. 이 논리에 대해 먼저 알기 전에 어떻게 일어나는지 봅시다.
ORing- (A-0 = A), (A-1 = 1) ANDing- (A & 0 = 0), (A & 1 = A)
따라서 다른 핀에 영향을주지 않고 마스킹 개념과 논리적 시프트 연산을 사용합니다. 핀 (P0.12-P0.15) 만 사용되며 P0.4, P0.6과 같은 다른 핀은 영향을받지 않음을 의미합니다. 데이터를 4 비트로 이동하고 하단 니블 대신 상단 니블을 만들고 상단 니블을 마스킹하여 수행됩니다. 그런 다음 하위 비트를 0 (0XF0)으로 만들고 니블 데이터와 OR 처리하여 출력에서 상위 니블 데이터를 얻습니다.
낮은 니블 데이터에 유사한 프로세스가 사용 되지만 여기서는 데이터 를 이동할 필요가 없습니다.
출력에 데이터를 쓰는 동안, 즉 명령 모드에서 RS는 LOW가되어야하고 실행하려면 enable은 HIGH 여야하고, 데이터 모드에서는 RS는 HIGH 여야하고 실행하려면 enable은 HIGH 여야합니다.
이제 출력에서 인쇄 할 문자열 데이터를 보낼 때 동일한 원리가 니블에 의해 사용됩니다. 여기서 중요한 단계는 REGISTER SELECT (RS)가 데이터 모드에 대해 HIGH 여야한다는 것입니다.
void LCD_DISPLAY (char * msg) // 전송 된 문자를 하나씩 출력하는 기능 { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0xF0) << 8)); // 상단 니블 전송 IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW 쓰기 모드 지연 ms (2); IO0CLR = 0x00000040; // EN = 0, RS 및 RW 변경되지 않음 (예: RS = 1, RW = 0) 지연 ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0x0F) << 12)); // 하단 니블 전송 IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; 지연 ms (2); IO0CLR = 0x00000040; 지연 ms (5); i ++; }
완전한 코딩 및 데모 비디오 는 다음과 같습니다.