- 7 세그먼트 및 4 자리 7 세그먼트 디스플레이 모듈 :
- PIC 마이크로 컨트롤러와 4 자리 7 세그먼트 모듈 연결 :
- PIC16F877A를 사용한 프로그래밍 :
- 하드웨어 설정 및 테스트 :
이것은 MPLAB 및 XC8을 사용하는 PIC 마이크로 컨트롤러 학습에 대한 8 번째 튜토리얼입니다. MPLABX를 설치하는 것부터 PIC MCU가있는 LCD를 사용하는 방법에 이르기까지 우리는 끝까지 왔습니다. 여기에 처음 오신 분은 타이머, LED 깜박임, LCD 인터페이스 등을 배울 수있는 이전 자습서를 참조하십시오. 여기에서 모든 PIC 자습서를 찾을 수 있습니다. 지난 튜토리얼에서 16 * 2 LCD 디스플레이로 사용자 지정 문자를 생성하는 방법을 보았습니다. 이제 7- 세그먼트 디스플레이 라고하는 다른 유형의 디스플레이 모듈을 장착 하고 PIC 마이크로 컨트롤러와 인터페이스합니다.
16x2 LCD는 7 세그먼트 디스플레이보다 훨씬 더 편안하지만 7 세그먼트 디스플레이가 LCD 디스플레이보다 더 편리하게 나오는 시나리오는 거의 없습니다. LCD는 문자 크기가 작다는 단점이 있으며 일부 숫자 값을 표시하려는 경우 프로젝트에 과도하게 사용됩니다. 7 세그먼트는 또한 열악한 조명 조건에 대한 장점이 있으며 일반 LCD 화면보다 더 큰 각도에서 볼 수 있습니다. 그러니 우리가 그것을 알게합시다.
7 세그먼트 및 4 자리 7 세그먼트 디스플레이 모듈:
7 세그먼트 디스플레이에는 7 개의 세그먼트가 있으며 각 세그먼트에는 해당 세그먼트를 켜서 숫자를 표시하는 하나의 LED가 있습니다. 7 세그먼트에 숫자 "5"가 표시되도록하려면 해당 핀을 높게 설정하여 세그먼트 a, f, g, c, d를 발광해야합니다. 7 세그먼트 디스플레이에는 Common Cathode 및 Common Anode의 두 가지 유형이 있습니다. 여기서는 Common Cathode 7 세그먼트 디스플레이를 사용 합니다. 여기에서 7 세그먼트 디스플레이에 대해 자세히 알아보십시오.
이제 우리는 하나의 7 세그먼트 디스플레이에 원하는 숫자를 표시하는 방법을 알았습니다. 그러나 한 자리 이상의 정보를 전달하려면 7 세그먼트 디스플레이가 두 개 이상 필요하다는 것은 매우 분명합니다. 따라서이 튜토리얼 에서는 아래와 같이 4 자리 7 세그먼트 디스플레이 모듈 을 사용합니다.
보시다시피 4 개의 7 개의 세그먼트 디스플레이가 함께 연결되어 있습니다. 우리는 7 세그먼트 모듈마다 10 개의 핀이 있고, 4 개의 7 세그먼트 디스플레이에는 총 40 개의 핀이있을 것이라는 것을 알고 있으며 누구든지 도트 보드에 납땜하는 것이 바쁠 것이므로 누구나 모듈을 구입하는 것이 좋습니다. 또는 4 자리 7 세그먼트 디스플레이를 사용하기 위해 자신 만의 PCB를 만드십시오. 동일한 연결 회로도는 다음과 같습니다.
4 자리 7 세그먼트 모듈 이 어떻게 작동하는지 이해하려면 위의 회로도를 살펴 봐야합니다. 표시된 것처럼 4 개의 디스플레이 모두의 A 핀이 하나의 A로 모이고 B, C….까지 DP까지 동일한 핀이 연결되어 있습니다. 그래서 기본적으로 트리거 A가 켜지면 네 개의 A가 모두 높아야합니다.
그러나 그것은 일어나지 않습니다. D0에서 D3 (D0, D1, D2 및 D3)까지 4 개의 핀이 추가되어있어 4 개 중 어떤 디스플레이가 하이로 이동해야하는지 제어하는 데 사용할 수 있습니다. 예: 출력이 두 번째 디스플레이에만 표시되도록하려면 다른 핀 (D0, D2 및 D3)을 낮게 유지하면서 D1 만 높게 만들어야합니다. D0에서 D3까지의 핀을 사용하여 활성화 할 디스플레이를 선택하고 A에서 DP까지의 핀을 사용하여 표시 할 문자를 선택할 수 있습니다.
PIC 마이크로 컨트롤러와 4 자리 7 세그먼트 모듈 연결:
여기서 우리는 PIC 마이크로 컨트롤러 PIC16F877A를 사용 했으며 회로의 회로도는 아래에 나와 있습니다.
우리는 모듈에서 12 개의 출력 핀을 가지고 있으며, 그 중 8 개는 문자를 표시하는 데 사용되고 4 개는 4 개 중 하나의 디스플레이를 선택하는 데 사용됩니다. 따라서 8 개의 문자 핀이 모두 PORTD에 할당되고 디스플레이 선택 핀이 PORTC의 처음 4 개 핀에 할당됩니다.
참고: 모듈의 접지 핀은 여기에 표시되지 않은 MCU의 접지에도 연결되어야합니다.
PIC16F877A를 사용한 프로그래밍:
이제이 모듈이 실제로 어떻게 작동하는지 알았으므로 PIC16F877A를 프로그래밍하여 4 자리 숫자를 표시하는 방법을 알아 보겠습니다. 변수를 0에서 1000까지 증가시키고 7 세그먼트 디스플레이에 인쇄 해 보겠습니다. MPLABX 프로그램을 시작하고 새 프로젝트를 만듭니다. 구성 비트부터 시작하겠습니다.
#pragma config FOSC = HS // 오실레이터 선택 비트 (HS 오실레이터) #pragma config WDTE = OFF // 워치 독 타이머 활성화 비트 (WDT 비활성화 됨) #pragma config PWRTE = ON // 파워 업 타이머 활성화 비트 (PWRT 활성화 됨) # pragma config BOREN = ON // 저전압 리셋 활성화 비트 (BOR 활성화) #pragma config LVP = OFF // 저전압 (단일 전원) 인-서킷 직렬 프로그래밍 활성화 비트 (RB3는 디지털 I / O, HV 켜기 프로그래밍에 MCLR을 사용해야 함) #pragma config CPD = OFF // 데이터 EEPROM 메모리 코드 보호 비트 (데이터 EEPROM 코드 보호 해제) #pragma config WRT = OFF // 플래시 프로그램 메모리 쓰기 활성화 비트 (쓰기 방지 해제, 모든 프로그램 메모리 EECON 제어에 의해 기록 될 수 있음) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
평소와 같이 구성 비트 설정 창을 사용하여 이러한 비트를 설정합니다. 의미가 확실하지 않은 경우 여기에서 LED 깜박임 자습서를 참조하십시오.
다음으로 디스플레이의 각 숫자 사이를 전환하기위한 출력 핀을 정의하겠습니다.
// *** 4 개 디스플레이 모두의 신호 핀 정의 *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** 정의 끝 ** ////
여기서 핀 RC0, RC1, RC2 및 RC3은 7 세그먼트 디스플레이 모듈의 4 자리 숫자 중에서 선택하는 데 사용됩니다. 이 핀은 각각 s1, s2, s3 및 s4로 정의됩니다.
다음으로 void main () 으로 들어가 보겠습니다. 그 안에 다음과 같은 변수 선언이 있습니다.
int i = 0; // 표시 될 4 자리 값 int flag = 0; // 부호없는 지연 생성 int a, b, c, d, e, f, g, h; // 단지 변수 unsigned int seg = {0X3F, // 숫자를 표시하는 16 진수 값 0X06, // 숫자를 표시하는 16 진수 값 0X5B, // 숫자를 표시 할 16 진수 값 0X4F, // 표시 할 16 진수 값 숫자 3 0X66, // 숫자 4를 표시하는 16 진수 값 0X6D, // 숫자 5를 표시하는 16 진수 값 0X7C, // 숫자 6을 표시하는 16 진수 값 0X07, // 숫자 7을 표시하는 16 진수 값 0X7F, / / 숫자 8을 표시하는 16 진수 값 0X6F // 숫자 9를 표시하는 16 진수 값}; // 0에서 9까지의 숫자를 표시하기위한 배열의 끝
여기서 변수 i 와 플래그 는 표시 할 값을 저장하고 각각 지연을 생성하는 데 사용됩니다. H 부호없는 정수 변수 A는 하나의 숫자로 4 개 자리 숫자를 끊고 (여기서 나중에 설명 될 것이다)로 저장하기 위해 사용된다.
여기서 주목해야 할 한 가지 핵심은 "seg" 배열 선언입니다. 이 프로그램에서 우리는 Array라는 새로운 데이터 유형을 사용하고 있습니다. 배열은 유사한 데이터 유형 값의 모음 일뿐입니다. 여기에서는이 배열을 사용하여 0에서 9까지의 숫자를 표시하는 데 필요한 모든 16 진수 값을 저장했습니다.
배열의 주소는 항상 0부터 시작합니다. 따라서이 배열은 아래에 표시된 숫자와 동일한 주소에 저장된 숫자 (0-9)의 16 진수 값을 갖습니다.
변하기 쉬운: |
세그 |
세그 |
세그 |
세그 |
세그 |
세그 |
세그 |
세그 |
세그 |
세그 |
16 진수 코드: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
식. 숫자: |
0 |
1 |
2 |
삼 |
4 |
5 |
6 |
7 |
8 |
9 |
따라서 간단히 7 세그먼트에 숫자 0을 표시하려면 seg 를 호출 할 수 있습니다 . 마찬가지로 숫자 6을 표시하려면 seg 를 사용해야 합니다.
HEX 값이 실제로 어떻게 얻어 졌는지 이해하기 위해 아래 표를 살펴 보겠습니다. 각 진수 상당 HEX 값은 어레이에 저장되는 이 하나 개의 특정 숫자를 표시하기 위해 호출 될 수 있도록.
이제 I / O 구성 인 코드의 다음 부분으로 이동하겠습니다.
// ***** I / O 구성 **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** I / O 구성 끝 ** ///
7- 세그먼트의 모든 핀이 출력 핀이고 연결이 위의 회로도에 표시되어 있으므로 I / O 구성이 간단하므로 출력으로 선언하고 0으로 초기화하면됩니다.
이제 무한 루프 (while (1)) 로 이동해 보겠습니다 . 여기서 우리는 "i"의 값을 4 자리로 나누어 7 세그먼트에 표시해야합니다. 먼저 "i"의 값을 분할하여 시작하겠습니다.
// *** "i"를 4 자리로 분할 *** // a = i % 10; // 4 번째 자리가 여기에 저장됩니다. b = i / 10; c = b % 10; // 3 번째 숫자가 여기에 저장됩니다. d = b / 10; e = d % 10; // 두 번째 자리는 여기에 저장됩니다. f = d / 10; g = f % 10; // 첫 번째 자리는 여기에 저장됩니다. h = f / 10; // *** 분할 종료 *** //
단순 계수 및 나눗셈 연산을 사용하여 4 자리 숫자 (i)가 개별 숫자로 분리됩니다. 이 경우 "i"값이 4578 인 예를 들어 보겠습니다. 그런 다음이 프로세스의 끝에서 변수 g = 4, e = 5, c = 7 및 a = 8을 사용합니다. 이제 해당 변수를 사용하여 각 숫자를 쉽게 표시 할 수 있습니다.
PORTD = seg; s1 = 1; // 디스플레이 1을 켜고 네 번째 자리를 인쇄합니다. __delay_ms (5); s1 = 0; // 5ms 지연 후 디스플레이 1 끄기 PORTD = seg; s2 = 1; // 디스플레이 2를 켜고 세 번째 숫자를 인쇄합니다. __delay_ms (5); s2 = 0; // 5ms 지연 후 디스플레이 2 끄기 PORTD = seg; s3 = 1; // 디스플레이 3을 켜고 두 번째 숫자를 인쇄합니다. __delay_ms (5); s3 = 0; // 5ms 지연 후 디스플레이 3 끄기 PORTD = seg; s4 = 1; // 디스플레이 4를 켜고 첫 번째 숫자를 인쇄합니다. __delay_ms (5); s4 = 0; // 5ms 지연 후 디스플레이 4 끄기
MCU가 7 세그먼트와 대화하는 실제 장소입니다. 아시다시피 한 번에 한 자리 만 표시 할 수 있지만 표시 할 네 자리가 있으며 네 자리가 모두 켜져있는 경우에만 완전한 네 자리 숫자가 사용자에게 표시됩니다.
그래서 우리는 이것을 어떻게할까요?
다행스럽게도 MCU는 사람의 눈보다 훨씬 빠르기 때문에 실제로 수행하는 작업은 한 번에 한 자릿수를 표시하지만 위와 같이 매우 빠르게 수행합니다.
우리는 MCU와 7- 세그먼트가 처리 할 수 있도록 5ms 동안 대기하는 한 자리 디스플레이를 선택하고 그 자리를 끄고 다음 자리로 이동하고 마지막 자리에 도달 할 때까지 동일하게 수행합니다. 이 5ms의 지연은 사람의 눈으로 관찰 할 수 없으며 네 자리 모두 동시에 켜진 것처럼 보입니다.
즉, 마지막으로 아래와 같이 지연을 사용하여 표시된 숫자의 값을 증가시킵니다.
if (flag> = 100) // 플래그가 100에 도달 할 때까지 기다립니다 {i ++; flag = 0; // 플래그가 100 인 경우에만 "i"가 증가합니다.} flag ++; // 플래시마다 증가 플래그
지연은 한 숫자에서 다른 숫자로 변경하는 데 걸리는 시간이 변경 사항을인지 할 수있을만큼 충분히 길도록 사용됩니다.
전체 코드는 아래에 주어진 그 과정도 설명되어 비디오 마지막에.
하드웨어 설정 및 테스트:
항상 그렇듯이 실제로 하드웨어를 사용하기 전에 Proteus를 사용하여 프로그램을 시뮬레이션하겠습니다. 시뮬레이션이 성공하면 다음과 같은 내용이 표시됩니다.
이 프로젝트에는 복잡한 하드웨어 설정이 없으며 LED 깜박임 자습서에서 만든 동일한 PIC 마이크로 컨트롤러 보드 를 다시 사용하고 있습니다. 연결 다이어그램에 따라 7- 세그먼트 모듈을 PIC 마이크로 컨트롤러 보드 와 연결하기 만하면됩니다. 연결이 끝나면 PicKit 3 프로그래머를 사용하여 코드를 덤프하기 만하면 출력을 즐길 수 있습니다.