제07강 입출력 디바이스 iv - cms3.koreatech.ac.kr · raspberrypi 입출력디바이스iv 3...

43
RaspberryPi 입출력디바이스IV 1 제07강 입출력 디바이스 IV 도트매트릭스 제어 키패드 제어 CLCD 제어

Upload: others

Post on 27-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 1

제07강

입출력 디바이스 IV

도트매트릭스 제어

키패드 제어

CLCD 제어

Page 2: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 2

도트매트릭스

* DotMatrix 모듈 회로 (8x8)

: 64개의 LED 2차원배열

: 제어를 위해 16개 GPIO 핀 필요

Page 3: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 3

도트매트릭스(계속)

* DotMatrix 모듈의 동적제어

: 인간 시각의 잔상효과를 활용

: 칼럼선택을 위한 8비트, 패턴데이터를 위한 8비트 제어신호

: 한 시점에서 한 칼럼만 선택후, 패턴데이터를 고속 출력

unsigned char colData = 0x01;unsighed char i;

COLS = colData;i = 0;while(1) {

delay(10); // short delayif(++i == 8)

i = 0;

COLS = ~(colData << i); // low signal to only a colP1 = 0xFF; // all bits ON pattern

}

Page 4: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 4

도트매트릭스(계속)

* 8x8 DotMatrix 모듈

: LED가 8x8로 나열된 모듈

: MAX7219 드라이버 IC 활용

: 모듈 회로도(도트매트릭스 + MAX7219)

Page 5: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 5

도트매트릭스(계속)

* wiringShift.h 라이브러리

: 데이터를 비트단위로 쉬프트하여 입력 혹은 출력하는 함수

: 비트 쉬프트에 순서위한 상수(LSB 비트부터, MSB 비트부터)

#define LSBFIRST 0 // order constant

#define MSBFIRST 1 // order constant

: 데이터를 비트단위로 쉬프트하며 입력받는 함수

extern uint8_t shiftIn(uint8_t dPin, uint8_t cPin, uint8_t order);

// dpin은 GPIO data핀, cPin은 GPIO ClK핀

: 데이터를 비트단위로 쉬프트하면서 출력하는 함수

extern void shiftOut(uint8_t dPin, uint8_t cPin, uint8_t order,

uint8_t val);

// dpin은 GPIO data핀, cPin은 GPIO ClK핀

Page 6: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 6

도트매트릭스(계속)

* MAX7219 드라이버(여러자리 FND, dotMtx 제어)

: 요구되는 GPIO 핀 수와 동적제어의 난제 해결 위한 IC

: 비트단위 쉬프트 함수 활용 ( wiringShift.h 라이브러리 )

: 시리얼 데이터 포맷 ... address(1B,상위)+data(1B,하위)

Page 7: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 7

도트매트릭스(계속)

* MAX7219 드라이버(계속)

: 제어 레지스터 와 그 주소 (초록부분은 초기화용)

: digit 0 레지스터의 주소는 0xX1임을 유의!!

Page 8: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 8

도트매트릭스(계속)

* MAX7219 드라이버(계속)

: 타이밍도

void MAX7219_WRITE(uint8_t address, uint8_t data) {digitalWrite(P_MAX_CS, LOW);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, address);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, data);digitalWrite(P_MAX_CS, HIGH);

}

Page 9: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 9

도트매트릭스(계속)

* MAX7219 초기화

: Decode mode(주소 0xX9)...no BCD font all digits(0x00)

: Intensity(주소 0xXa)...밝기 설정, 0x00~0x0f(max 0x0f)

: Scan limit(주소 0xXb)...사용 Digit R수, Digit R#(0x07)

: shutdown(주소 0xXc)...shutdown(0x00), Normal(0x01)

void MAX7219_INIT(void) {MAX7219_WRITE(0x09, 0x00);

// Decode Mode : no decode all digits(0x00)MAX7219_WRITE(0x0A, 0x0F); // Intensity : max(0x0F)MAX7219_WRITE(0x0B, 0x07);

// Scan Limit : Digit 0 ~ Digit 7, (0x07)MAX7219_WRITE(0x0C, 0x01); // Shutdown : Normal(0x01)

}

Page 10: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 10

도트매트릭스(계속)

[실습1] 도트매트릭스 제어 I

: 글자 마를 구성하는 한열씩 표시해가는 프로그램

$ nano dotMtx_01.c

//=======================================// dotMtx_01.c// using shift functions//=======================================#include <stdio.h>#include <wiringPi.h>#include <wiringShift.h> // shift funciton

#define P_MAX_CLK 0 // BCM_GPIO #17#define P_MAX_CS 2 // BCM_GPIO #27#define P_MAX_DIN 3 // BCM_GPIO #22

const uint8_t image[] = { // 5x8 font0x1E, 0x12, 0x1E, 0x00, 0x04, 0x07, 0x04, 0x04 //마

};

const uint8_t allOff[] = {

Page 11: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 11

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

uint8_t buf[8];

void MAX7219_WRITE(uint8_t address, uint8_t data) {digitalWrite(P_MAX_CS, LOW);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, address);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, data);digitalWrite(P_MAX_CS, HIGH);

}

void MAX7219_INIT(void) {MAX7219_WRITE(0x09, 0x00);

// Decode Mode : no decode all digits(0x00)MAX7219_WRITE(0x0A, 0x0F); // Intensity : max(0x0F)MAX7219_WRITE(0x0B, 0x07);

// Scan Limit : Digit 0 ~ Digit 7, (0x07)MAX7219_WRITE(0x0C, 0x01); // Shutdown : Normal(0x01)

}

void setup(void) {pinMode(P_MAX_DIN, OUTPUT);pinMode(P_MAX_CS, OUTPUT);pinMode(P_MAX_CLK, OUTPUT);digitalWrite(P_MAX_CS, HIGH);

MAX7219_INIT();

Page 12: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 12

}

int main(void) {int i, j;int k;

printf("[Dot Matrix testing....]\n");

if(wiringPiSetup() == -1)return 1;

setup();

for(i=0; i<8; i++){ MAX7219_WRITE(i+1, image[i]);

delay(1000);}

for(i=0; i<8; i++){MAX7219_WRITE(i+1, allOff[i]);

}delay(1000);

return 0;}

$ make dotMtx_01

Page 13: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 13

$ ./dotMtx_01

Page 14: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 14

도트매트릭스(계속)

[실습2] 도트매트릭스 제어 II

: 마이크로프로세서란 문자열을 차례로 출력하는 프로그램

$ nano dotMtx_02.c

//=======================================// dotMtx_02.c// using shift functions + user pattern//=======================================#include <stdio.h>#include <wiringPi.h>#include <wiringShift.h> // shift funciton

#define P_MAX_CLK 0 //BCMGPIO 17#define P_MAX_CS 2 //BCMGPIO 27#define P_MAX_DIN 3 //BCMGPIO 22

const uint8_t image[] = { // 5x8 font0x1E, 0x12, 0x1E, 0x00, 0x04, 0x07, 0x04, 0x04, //마0x09, 0x15, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, //이0x1F, 0x01, 0x07, 0x01, 0x00, 0x1F, 0x00, 0x00, //크0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //로

Page 15: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 15

0x1F, 0x0A, 0x0A, 0x1F, 0x00, 0x1F, 0x00, 0x00, //프0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //로0x04, 0x0A, 0x11, 0x00, 0x05, 0x1D, 0x05, 0x05, //세0x04, 0x0A, 0x11, 0x00, 0x01, 0x1F, 0x01, 0x01 //서

};

const uint8_t allOff[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

};

uint8_t buf[8];

void MAX7219_WRITE(uint8_t address, uint8_t data) {digitalWrite(P_MAX_CS, LOW);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, address);shiftOut(P_MAX_DIN, P_MAX_CLK, MSBFIRST, data);

digitalWrite(P_MAX_CS, HIGH);}

void MAX7219_INIT(void) {MAX7219_WRITE(0x09, 0x00);

// Decode Mode : no decode all digits(0x00)MAX7219_WRITE(0x0A, 0x0F); // Intensity : max(0x0F)MAX7219_WRITE(0x0B, 0x07);

// Scan Limit : Digit 0 ~ Digit 7, (0x07)MAX7219_WRITE(0x0C, 0x01); // Shutdown : Normal(0x01)

}

Page 16: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 16

void setup(void) {pinMode(P_MAX_DIN, OUTPUT);pinMode(P_MAX_CS, OUTPUT);pinMode(P_MAX_CLK, OUTPUT);digitalWrite(P_MAX_CS, HIGH);

MAX7219_INIT();}

int main(void) {int i, j;int k;

printf("[Dot Matrix testing....]\n");

if(wiringPiSetup() == -1)return 1;

setup();

for(j=0; j<8; j++){ for(i=0; i<8; i++){ MAX7219_WRITE(i+1, *(image+j*8+i));

}delay(1000);

}

Page 17: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 17

for(i=0; i<8; i++){MAX7219_WRITE(i+1, *(allOff + i));

}delay(1000);

return 0;}

$ make dotMtx_02

$ ./dotMtx_02

Page 18: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 18

키패드 모듈

* 4x4 keypad 모듈

: 외양 및 회로도

: 연결잭의 1 ~ 4 핀은 행(Rows)용

: 연결잭의 5 ~ 8 핀은 열(Columns)용

: 회로도와 같이 키패드 모듈의 D7,..., D4단에 풀업저항 연결?

Page 19: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 19

Keypad 모듈(계속)

* Keypad 모듈 회로 (4x4)

: 16개의 버튼스위치

Page 20: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 20

키패드 모듈(계속)

* Keypad 모듈의 동적제어(keyscan 방식)

: 행과 열을 위한 각각 4비트씩, 총 8비트로 제어

: 특정 열을 선택하고, 행의 정보 읽음

: 열선택 신호(4비트)와 행 판독정보(4비트)로 코드화

out = 0x01; // 특정 열 선택for(i=0; i<4; i++) {

P1 = ~out; // 특정 열에 Low 신호 인가

in = (~P1) & 0xF0; // 상위 니블 판독if(in) {

in |= out; // 코드 생성break;

}out <<= 1; // 다음 열

}

Page 21: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 21

키패드 모듈(계속)

* 각 키의 코드값

키 상위니블 하위니블 코드값 키 상위니블 하위니블 코드값

SW0 ~0x80 ~0x08 0x88 SW8 ~0x20 ~0x08 0x28

SW1 ~0x80 ~0x04 0x84 SW9 ~0x20 ~0x04 0x24

SW2 ~0x80 ~0x02 0x82 SW10 ~0x20 ~0x02 0x22

SW3 ~0x80 ~0x01 0x81 SW11 ~0x20 ~0x01 0x21

SW4 ~0x40 ~0x08 0x28 SW12 ~0x10 ~0x08 0x18

SW5 ~0x40 ~0x04 0x24 SW13 ~0x10 ~0x04 0x14

SW6 ~0x40 ~0x02 0x22 SW14 ~0x10 ~0x02 0x12

SW7 ~0x40 ~0x01 0x21 SW15 ~0x10 ~0x01 0x11

Page 22: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 22

키패드 모듈(계속)

* keypad.h 사용자라이브러리

: 키패드 제어를 위한 함수들을 정의

$ nano keypad.h

//=======================================// keypad.h//=======================================#ifndef __KEYPAD_H__#define __KEYPAD_H__

#include <stdint.h>

#define P_KPD_D0 21 // BCM_GPIO #5#define P_KPD_D1 22 // BCM_GPIO #6#define P_KPD_D2 23 // BCM_GPIO #13#define P_KPD_D3 24 // BCM_GPIO #19#define P_KPD_D4 25 // BCM_GPIO #26#define P_KPD_D5 26 // BCM_GPIO #12#define P_KPD_D6 27 // BCM_GPIO #16

Page 23: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 23

#define P_KPD_D7 28 // BCM_GPIO #20

#define NO_KEY 0x00

struct pins {unsigned int pin0 : 1; // LSBunsigned int pin1 : 1;unsigned int pin2 : 1;unsigned int pin3 : 1;unsigned int pin4 : 1;unsigned int pin5 : 1;unsigned int pin6 : 1;unsigned int pin7 : 1; // MSB

};

union ucode {uint8_t val;struct pins pin; // bit-field

};

uint8_t p_in = NO_KEY;union ucode acode;

void setup(void) {pinMode(P_KPD_D0, OUTPUT); // outputpinMode(P_KPD_D1, OUTPUT); // outputpinMode(P_KPD_D2, OUTPUT); // outputpinMode(P_KPD_D3, OUTPUT); // output

Page 24: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 24

pinMode(P_KPD_D4, INPUT); // inputpinMode(P_KPD_D5, INPUT); // inputpinMode(P_KPD_D6, INPUT); // inputpinMode(P_KPD_D7, INPUT); // input

}

void out_data(union ucode acode) {digitalWrite(P_KPD_D0, acode.pin.pin0);digitalWrite(P_KPD_D0, acode.pin.pin1);digitalWrite(P_KPD_D0, acode.pin.pin2);digitalWrite(P_KPD_D0, acode.pin.pin3);

}

uint8_t in_data(void) {union ucode acode;

acode.val = 0x00;

acode.pin.pin4 = digitalRead(P_KPD_D4);acode.pin.pin5 = digitalRead(P_KPD_D5);acode.pin.pin6 = digitalRead(P_KPD_D6);acode.pin.pin7 = digitalRead(P_KPD_D7);

return acode.val;}

static uint8_t keyScan(void) {

Page 25: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 25

uint8_t out, i, in, tmp;union ucode acode;

out = 0x01;for(i=0; i<4; i++) {

acode.val = ~out;out_data(acode);

tmp = in_data();in = (~tmp) & 0xF0;

if(in) {in |= out;break;

}out <<= 1;

}

return in;}

uint8_t keyInput(void) {uint8_t in, in1;

in = keyScan();

while(1) { delay(10);

Page 26: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 26

in1 = keyScan();if(in == in1)

break;in = in1;

}

if(!(in & 0xF0)) { // 상위니블 검사, 어떤키도 눌리지 않았다면p_in = NO_KEY;return NO_KEY;

}if(p_in==in) // 이전키와 같다면, 눌리지 않은 것으로 간주

return NO_KEY;

p_in = in;

return in;}

#endif

Page 27: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 27

키패드 모듈(계속)

[실습3] 키패드 제어 I

: 눌린 키의 코드값을 출력하는 프로그램

$ nano keypad_01.c

//=======================================// keypad_01.c// 4x4 Keypad module, dynamic control// keypad software module : keypad.h//=======================================#include <stdio.h>#include <stdint.h>#include <wiringPi.h>

#include "keypad.h"

int main(void) {uint8_t key;char ch;

printf("[4x4 Keypad testing....]\n");

Page 28: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 28

if(wiringPiSetup() == -1)return 1;

setup();

while(1) {key = keyInput();if(key==NO_KEY)

continue;

ch =' ';switch(key) {

case 0x88 :ch = '1'; break;

case 0x84 :ch = '2'; break;

case 0x82 :ch = '3'; break;

case 0x81 :ch = 'A'; break;

case 0x48 :ch = '4'; break;

case 0x44 :ch = '5'; break;

case 0x42 :ch = '6'; break;

case 0x41 :ch = 'B'; break;

Page 29: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 29

case 0x28 :ch = '7'; break;

case 0x24 :ch = '8'; break;

case 0x22 :ch = '9'; break;

case 0x21 :ch = 'C'; break;

case 0x18 :ch = '*'; break;

case 0x14 :ch = '0'; break;

case 0x12 :ch = '#'; break;

case 0x11 :ch = 'D'; break;

} printf("key : %x, symbol : %c\n", key, ch);

}

return 0;}

$ make keypad_01

$ ./keypad_01

Page 30: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 30

: 결과는 좌상단 키부터 우하단방향으로 순차적으로 키를 누른 결과임

Page 31: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 31

CLCD 모듈

* Character LCD 모듈

: 5V용 LCD 사용시, 라즈베리파이로 5V 신호 기록하지 말것!!

(보드 고장문제 발생가능)

=> R/W 핀을 GND에 연결, 항상 READ 모드로 둘 것!!

* LCD 라이브러리

: wiringPi 라이브러리에 포함됨

pi@raspberrypi:/usr/include $ ls lcd*

lcd.h lcd128x64.h

: 참고) https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/

Page 32: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 32

CLCD 모듈(계속)

* 회로연결(4비트 버스 모드)

Page 33: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 33

CLCD 모듈(계속)

* LCD 라이브러리 활용

: 참고 자료

https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/

: lcd.h 라이브러리 사용시 헤더파일 포함

#include <wiringPi.h>

#include <lcd.h>

Page 34: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 34

CLCD 모듈(계속)

* LCD 라이브러리 활용(계속)

: LCD 초기화 함수

extern int lcdInit (const int rows, const int cols, const int bits, const int rs, const int strb, const int d0, const int d1, const int d2, const int d3,

const int d4, const int d5, const int d6, const int d7) ;

* 사용된 GPIO 핀은 이 함수에서 pinmode가 자체 설정됨 유의

* 다른 LCD 함수보다 우선하여 호출되어야 함

rows, cols : LCD 유형에 따라(2, 16)

bits : 버스제어모드(4 혹은 8)

rs, strb : RS단자와 E단자의 GPIO 핀번호

d0 ~ d3 : 4비트제어모드를 위한 GPIO 핀번호

d0 ~ d7 : 8비트제어모드를 위한 GPIO 핀번호

return 값 : 이후에서 핸들로 사용(문제 발생시 –1 반환)

fd = lcdInit (2, 16, 4, 11, 10, 0, 1, 2, 3, 0, 0, 0, 0); //4비트모드

fd = lcdInit (2, 16, 8, 11, 10, 0, 1, 2, 3, 4, 5, 6, 7); //8비트모드

Page 35: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 35

CLCD 모듈(계속)

* LCD 라이브러리 활용(계속)

: 커서를 홈으로 이동, 화면 소거 등의 함수

extern void lcdHome(const int fd) ;

extern void lcdClear(const int fd) ;

extern void lcdDisplay(const int fd, int state) ;

extern void lcdCursor(const int fd, int state) ;

extern void lcdCursorBlink(const int fd, int state) ;

extern void lcdPosition(const int fd, int x, int y) ;

// x는 라인번호(0, 1), y는 칼럼번호(0, ....)

: 데이터 출력 함수(한 문자, 문자열, 서식지정된 문자열)

extern void lcdPutchar(const int fd, unsigned char data) ;

extern void lcdPuts(const int fd, const char *string) ;

extern void lcdPrintf(const int fd, const char *message, ...) ;

Page 36: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 36

CLCD 모듈(계속)

* LCD 라이브러리 활용(계속)

: LCD 명령을 LCD에 보내는 함수

extern void lcdSendCommand(const int fd, unsigned char command)

;

: LCD에 사용자 문자패턴을 등록하는 함수

extern void lcdCharDef(const int fd, int index, unsigned char data

[8]) ;

// index는 CGRAM의 주소, data[]는 한문자의 패턴 데이터

Page 37: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 37

CLCD 모듈(계속)

[실습4] CLCD 제어 I (4비트 제어모드)

: 4비트 버스모드

: 특정 문자열을 디스플레이

$ nano clcd_01.c

//=======================================// clcd_01.c// 2x16 CLCD, 4bit bus mode// lcd library : lcd..h////=======================================#include <stdio.h>#include <wiringPi.h>#include <lcd.h> // in /usr/include

#define CLCD_RS 0 // BCM_GPIO #17#define CLCD_RW 1 // BCM_GPIO #18

#define CLCD_D0 2 // BCM_GPIO #27#define CLCD_D1 3 // BCM_GPIO #22

Page 38: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 38

#define CLCD_D2 4 // BCM_GPIO #23#define CLCD_D3 5 // BCM_GPIO #24

int main(void) { int fd; // CLCD handle

printf("2x16 CLCD testing....4bit bus]\n");

if(wiringPiSetup() == -1) return 1;

// 4bit bus mode fd = lcdInit(2, 16, 4, CLCD_RS, CLCD_RW, CLCD_D0, CLCD_D1, CLCD_D2, CLCD_D3, 0, 0, 0, 0); lcdPosition(fd, 0, 0);

// diplay a strin lcdPrintf(fd, "CLCD Testing.."); delay(1000);

// display a char lcdPosition(fd, 1, 0); // lcdPutchar(fd,'A');

delay(10000);

lcdClear(fd);

Page 39: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 39

return 0;}

$ make clcd_01

$ ./clcd_01

Page 40: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 40

CLCD 모듈(계속)

[실습5] CLCD 제어 II (4비트 제어모드)

: 4비트 버스모드, 사용자 문자 패턴 등록 및 표시

$ nano clcd_02.c

//=======================================// clcd_02.c// 2x16 CLCD, 4bit bus mode// lcd library : lcd..h// register & display User patterns//=======================================#include <stdio.h>#include <wiringPi.h>#include <lcd.h> // in /usr/include

#define CLCD_RS 0 // BCM_GPIO #17#define CLCD_RW 1 // BCM_GPIO #18

#define CLCD_D0 2 // BCM_GPIO #27#define CLCD_D1 3 // BCM_GPIO #22#define CLCD_D2 4 // BCM_GPIO #23#define CLCD_D3 5 // BCM_GPIO #24

Page 41: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 41

unsigned char image[] = { // 5x8 font 0x1E, 0x12, 0x1E, 0x00, 0x04, 0x07, 0x04, 0x04, //▒▒ 0x09, 0x15, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, //▒▒ 0x1F, 0x01, 0x07, 0x01, 0x00, 0x1F, 0x00, 0x00, //ũ 0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //▒▒ 0x1F, 0x0A, 0x0A, 0x1F, 0x00, 0x1F, 0x00, 0x00, //▒▒ 0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //▒▒ 0x04, 0x0A, 0x11, 0x00, 0x05, 0x1D, 0x05, 0x05, //▒▒ 0x04, 0x0A, 0x11, 0x00, 0x01, 0x1F, 0x01, 0x01 //▒▒};

int main(void) { int fd; // CLCD handle int i;

printf("2x16 CLCD testing....4bit bus]\n");

if(wiringPiSetup() == -1) return 1;

// 4bit bus mode fd = lcdInit(2, 16, 4, CLCD_RS, CLCD_RW, CLCD_D0, CLCD_D1, CLCD_D2, CLCD_D3, 0, 0, 0, 0); lcdPosition(fd, 0, 0);

lcdPrintf(fd, "CLCD Testing.."); delay(1000);

Page 42: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 42

// register user patterns for(i=0; i<8; i++) lcdCharDef(fd, i, &image[i*8]);

// display user patterns lcdPosition(fd, 1, 0); for(i=0; i<8; i++) { lcdPutchar(fd, i); delay(1000); } delay(10000);

lcdClear(fd);

return 0;}

$ make clcd_02

$ ./clcd_02

Page 43: 제07강 입출력 디바이스 IV - cms3.koreatech.ac.kr · RaspberryPi 입출력디바이스IV 3 도트매트릭스(계속) * DotMatrix 모듈의 동적제어: 인간 시각의

RaspberryPi 입출력디바이스IV 43

응용과제

[응용1] DotMtx + keypad 모듈

: 도트매트릭스와 키패드 모듈을 사용하는 프로그램 구현

: 동작은 각자 정의할 것

[응용2] CLCD 제어 ( clcd_09.c 참조 )

: 8비트 버스 모드로 재구현

: 사용자 문자 패턴 등록 후 표시하도록