Anda di halaman 1dari 17

Praktikum Mikrokontroller Dan Interface

PERCOBAAN 2
LCD DAN KEYPAD
I.

Tujuan:

Mahasiswa mengerti cara membuat program C pada mikrokontroller ARM untuk


melakukan pemrograman pada modul LCD

Mahasiswa mengerti cara membuat program C pada mikrokontroller ARM untuk


melakukan pemrograman pada modul keypad

Mahasiswa mampu mengintegrasikan antara keypad dan LCD pada mikrokontroller


ARM
II. Peralatan yang digunakan:
Modul ARM
Modul LCD
Modul Keypad
Software STM32 Cube Mx
Software Keil uVision
III. Dasar Teori

Gambar 1. LCD character (tampak visual)

Gambar 2. Wiring Diagram LCD Karakter 20x2

Tabel.1. Pin Out LCD character


Pins
1

Description
Ground

Vcc

Contrast Voltage

"R/S" _Instruction/Register Select

"R/W" _Read/Write LCD Registers

"E" Clock

7 - 14

Data I/O Pins (D0..D7)

15

Anoda (+) backlight

16

Katoda (-) backlight

Gambar 3. Rangkaian pengatur kontras tampilan LCD


Tabel.2. Daftar Instruksi LCD Character
R/S R/W D7 D6 D5 D4 D3 D2 D1 D0

Instruction/Description

14 13 12 11 10 9

7 Pins

1 Clear Display

* Return Cursor and LCD to Home Position

1 ID S Set Cursor Move Direction

D C B Enable Display/Cursor

1 SC RL *

1 DL N F

1 A A A A A A Move Cursor into CGRAM

1 A A A A A A A Move Cursor to Display

BF *

D D D D D D D D

Write a Character to the Display at the Current


Cursor Position

D D D D D D D D

Read the Character on the Display at the Current


Cursor Position

* Move Cursor/Shift Display


* Set Interface Length

* Poll the "Busy Flag"

The bit descriptions for the different commands are:


"*" - Not Used/Ignored.

This bit can be either "1" or "0"

Set Cursor Move Direction:


ID - Increment the Cursor After Each Byte Written to Display if Set
S - Shift Display when Byte Written to Display
Enable
D C B -

Display/Cursor
Turn Display On(1)/Off(0)
Turn Cursor On(1)/Off(0)
Cursor Blink On(1)/Off(0)

Move Cursor/Shift Display


SC - Display Shift On(1)/Off(0)
RL - Direction of Shift Right(1)/Left(0)
Set Interface Length
DL - Set Data Interface Length 8(1)/4(0)
N - Number of Display Lines 1(0)/2(1)
F - Character Font 5x10(1)/5x7(0)
Poll the "Busy Flag"
BF - This bit is set while the LCD is processing
Move Cursor to CGRAM/Display
A - Address
Read/Write ASCII to the Display
D - Data

Proses inisialisasi pemrograman LCD dalam mode 4 four bit:


1. Wait more than 15 msecs after power is applied.
2. Write 0x03 to LCD and wait 5 msecs for the instruction to complete
3. Write 0x03 to LCD and wait 160 usecs for instruction to complete
4. Write 0x03 AGAIN to LCD and wait 160 usecs (or poll the Busy Flag)
5. Set the Operating Characteristics of the LCD
o

Write 0x02 to the LCD to Enable Four Bit Mode


All following instruction/Data Writes require two nibble writes.

Write "Set Interface Length"

Write 0x01/0x00 to turn off the Display

Write 0x00/0x01 to Clear the Display

Write "Set Cursor Move Direction" Setting Cursor Behaviour Bits

Write "Enable Display/Cursor" & enable Display and Optional Cursor

Gambar 4. Daftar Kode Karakter yang bisa ditampilkan di LCD karakter


Fungsi-fungsi yang sudah disediakan dalam pustaka (library) file LCD.H:

_lcd_ready() memeriksa kesiapan LCD untuk melakukan perintah selanjutnya


(memeriksa status busy flag)

_lcd_write_data(unsigned char data) beri perintah ke LCD


lcd_write_byte(unsigned char addr, unsigned char data) write a byte to the LCD
character generator or display RAM
unsigned char lcd_read_byte(unsigned char addr) read a byte from the
LCD
character generator or display RAM

lcd_gotoxy(unsigned char x, unsigned char y) set the LCD display


position x=0..39 y=0..3

lcd_clear() clear the LCD


lcd_putchar(char c) write the string str located in SRAM to the LCD
lcd_puts(char *str) write the string str located in SRAM to the LCD
lcd_putsf(char flash *str) write the string str located in FLASH to the LCD
unsigned char lcd_init(unsigned char lcd_columns) initialize the LCD controller

IV.

Algorithma Pemrograman
1. Percobaan 1
Tampilkan tulisan TEST LCD dengan cara masing masing huruf keluar
secara bergantian dari T kemudian E kemudian S sampai huruf yang terakhir
yaitu D dengan delay waktu 1 detik untuk pemunculan tiap hurufnya.
2. Percobaan 2
Tampilkan huruf dan angka yang ditekan pada keypad 4x4 pada LCD
dengan cara saat keypad ditekan maka huruf atau angka tersebut akan tampil
pada LCD dan saat dilepas keypadnya maka tidak akan tampil lagi.
3. Percobaan 3
Jika keypad 1 ditekan maka relay 1 akan aktif
Jika keypad 2 ditekan maka relay 2 akan aktif
Jika keypad 3 ditekan maka relay 3 akan aktif
Jika keypad 4 ditekan maka relay 4 akan aktif
Jika keypad 5 ditekan maka relay 5 akan aktif
Jika keypad 6 ditekan maka relay 6 akan aktif
Jika keypad 7 ditekan maka relay 7 akan aktif
Jika keypad 8 ditekan maka relay 8 akan aktif
Jika keypad A ditekan maka relay 1,2,3,4 akan aktif
Jika keypad B ditekan maka relay 5,6,7,8 akan aktif
Jika keypad C ditekan maka semua relay akan aktif

Jika keypad * ditekan maka akan meng-lock perintah terakhir dan tidak
merespon perintah keypad lainnya

Jika

keypad

ditekan

maka akan

meng-unlock

dan

keypad

akan merespon kembali perintah yang diberikan

Jika keypad * dan # ditekan bersamaan maka relay akan menyala sacara
bergantian dari relay 1 sampai relay 8 dengan delay waktu 1 detik setiap
pergantiannya

V.

Program

Percobaan 1
#include "stm32f4xx_hal.h"
#include "lcd_character.h"
#include "stdio.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
lcd_init();
lcd_gotoxy(0,0);
lcd_puts("T");
HAL_Delay(1000);
lcd_gotoxy(1,0);
lcd_puts("E");
HAL_Delay(1000);
lcd_gotoxy(2,0);
lcd_puts("S");
HAL_Delay(1000);
lcd_gotoxy(3,0);
lcd_puts("T");
HAL_Delay(1000);
lcd_gotoxy(5,0);
lcd_puts("L");
HAL_Delay(1000);
lcd_gotoxy(6,0);
lcd_puts("C");
HAL_Delay(1000);
lcd_gotoxy(7,0);
lcd_puts("D");
HAL_Delay(1000);
while (1)
{
}

void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
}

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
GPIOH_CLK_ENABLE();
GPIOD_CLK_ENABLE();
/*Configure GPIO pins : PD0 PD1 PD2 PD3
PD4 PD5 PD6 PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif

Percobaan 2
#include
#include
#include
#include

"stm32f4xx_hal.h"
"lcd_character.h"
"stdio.h"
"keypad_4x4.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
char simpan[1000];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
lcd_init();
keypad_init();

while (1)
{

sprintf(simpan,"Key means=%c",keypad_get_key_value());
lcd_gotoxy(0,0);
lcd_puts(simpan);

void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */


HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
GPIOH_CLK_ENABLE();
GPIOD_CLK_ENABLE();
GPIOE_CLK_ENABLE();
/*Configure GPIO pins : PD0 PD1 PD2 PD3
PD4 PD5 PD6 PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PE12 PE13 PE14 PE15 */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PE8 PE9 PE10 PE11 */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif

Percobaan 3
#include
#include
#include
#include

"stm32f4xx_hal.h"
"lcd_character.h"
"stdio.h"
"keypad_4x4.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
char simpan[1000];
char key;
int ubah=1;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
lcd_init();
keypad_init();
while (1)
{
key=keypad_get_key_value();
sprintf(simpan,"Key means=%c",keypad_get_key_value());
lcd_gotoxy(0,0);
lcd_puts(simpan);
if(keypad_get_key_value()=='.') ubah=0;
else if(keypad_get_key_value()=='#') ubah=1;
if(ubah)
{
if(key=='1')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
}
else if(key=='2')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
}
else if(key=='3')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);

}
else if(key=='4')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
}
else if(key=='5')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
}
else if(key=='6')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7,0);
}
else if(key=='7')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7,0);
}
else if(key=='8')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,0);
}
else if(key=='A')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
|GPIO_PIN_7,0);
}
else if(key=='B')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3,0); HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4|
GPIO_PIN_5|GPIO_PIN_6
|GPIO_PIN_7,1);
}
else if(key=='C')
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3 GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,1);
}
else if(key=='#'&&key=='.') /* Running Relay */
{ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2
|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,0);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,0);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,0);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,0);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,0);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,1);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,0);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,0);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,1);

HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,0);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,1);

}
}

void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
PWR_CLK_ENABLE();
HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */


HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
GPIOH_CLK_ENABLE();
GPIOD_CLK_ENABLE();
GPIOE_CLK_ENABLE();
/*Configure GPIO pins : PD0 PD1 PD2 PD3
PD4 PD5 PD6 PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PE12 PE13 PE14 PE15 */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PE0 PE1 PE2 PE3
PE4 PE5 PE6 PE7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/*Configure GPIO pins : PE8 PE9 PE10 PE11 */


GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif

VI.

Flow Chart
Percobaan 1
START

Gotoxy(0,0)
Cetak(T)
Delay 1s

Gotoxy(1,0)
Cetak(E)
Delay 1s
Gotoxy(2,0)
Cetak(S)
Delay 1s
Gotoxy(3,0)
Cetak(T)
Delay 1s
Gotoxy(5,0)
Cetak(L)
Delay 1s

Gotoxy(6,0)
Cetak(C)
Delay 1s

Gotoxy(7,0)
Cetak(D)
Delay 1s

END

Percobaan 2

START

Simpan = key means =


%c,keypad_get_key_value

Gotoxy(0,0)
Cetak(Simpan)

AND

Percobaan 3
START

Key=keypad_get_key_value
Simpan = key means =
%c,keypad_get_key_value

Gotoxy(0,0)
Cetak(Simpan)

Key==.

Key==#

YA

YA

Ubah=0

Ubah=1

Ubah==1
YA

Key==1

Key==2

YA

YA

PINE.0=1

PINE.1=1

Key==3
Key==4

YA

PINE.2=1

Key==5
YA

PINE.3=1

Key==6
Key==7

YA

PINE.4=1

YA

PINE.5=1

Key==8
Key==A

YA

YA

YA

PINE.6=1

PINE.7=1

PINE.0= PINE.1=PINE.2=PINE.3=1

YA

Key==B

YA

Key==C

Key==*
&&
Key=#

YA

PINE.4= PINE.5=PINE.6=PINE.7=1

PINE.0= PINE.1=PINE.2=PINE.3=1
PINE.4= PINE.5=PINE.6=PINE.7=1

PINE.0=1 delay 1S
PINE.1=1 delay 1S
PINE.2=1 delay 1S
PINE.3=1 delay 1S
PINE.4=1 delay 1S
PINE.5=1 delay 1S
PINE.6=1 delay 1S
PINE.7=1 delay 1S

END

VII.

Gambar Rangkaian

Relay 1
Relay 1
Relay 1
Relay 1
Relay 1
Relay 1
Relay 1
Relay 1

PE 0
.
.
.
.
.

PD 0 PD 7

LCD

ARM
STM32F4
KEYPAD

VIII. Analisa
Pada praktikum kali ini mempraktekkan tentag penerapan penggunaan LCD dan
Keypad menggunakan mikrokontroller STM32 F4. Perlu diketahui bahwa untuk bisa
menggunakan LCD dan Keypad pada ARM maka perlu menambahkan file header pada library
ARM secara manual karena pada software keil uVision tidak disediakan library untuk LCD
dan Keypad. Ada 2 buah library yang harus di copykan ke dalam library keil yaitu file bertipe
header dan file bertipe source. Hal tersebut bisa dilakukan dengan mengcopy file yang bertipe
header lcd_character.h dan keypad_4x4.h ke dalam folder inc. Serta mengcopy file bernama
lcd_character.c dan keypad_4x4.c ke dalam folder src.seperti gambar di bawah ini.

Langkah selanjutnya adalah menambahkan file header tersebut ke dalam application


user dengan cara klik kanan dan pilih Add Exsiting Files to Group.

Kemudian carilah file lcd_character dan keypad_4x4 di dalam folder Src blok kedua
file kemudian tambahkan dengan klik Add

Jika di dalam Application/Users sudah tedapat kedua file header maka bisa dilakukan
langkah selanjutnya.
Untuk memanggil header tersebut maka di dalam program perlu ditambahkan program
untukk memanggil kedua file header terebut. Hal tersebut bisa dilakukan dengan
menambahkan program sebagai berikut :
#includelcd_character.h
#includekeypad_4x4.h
Inisialisai juga diperlukan agar program mengenal fungi fungsi yang ada di dalam
header tersebut. Hal ini dilakukan dengan melakukan penulisan program pada fungsi main/
utama tetapi di luar fungsi while(1) dengan program sebagai berikut :
lcd_init();
keypad_init();
dengan penambahan ini maka bisa langsung dilakukan pemrograman untuk LC
dan
Keypad terebut.
Pada praktikum kali ini LCD dihubungkan dengan PIN D mulai bit 0 sampai bit
7 sehingga untuk inisialisasi kita jadikan PIN D ini sebagai GPIO_output. Sedangkan
untuk keypad menggunakan PINE mulai bit 8 sampai bit 15. Dimana untuk bit 8 11 dijadikan
sebagai GPIO_input dan bit 12-15 dijadikan ebagai GPIO_output. Hal ini dikarenakan
konfigurasi untuk keypad 4x4 ini membutuhkan 4 buah input dan 4 buah output untuk
mengetahui posisi keypad mana yang sedang ditekan. Untuk output relay menggunakan
PORTE pin 0 sampai pin
7 sehingga PORTE ini diiniialisasikan sebagai GPIO_output.
IX.

Kesimpulan

1. Untuk menggunakan modul keypad dan LCD pada mikrokontroller ARM maka perlu
menambahkan file tambahan yang diperoleh dari luar berupa file .H (lcd_character.h &
keypad_4x4.h) yang bertipe header dan file .C (lcd_character.c & keypad_4x4.c) yang
bertipe source.
2. File yang bertipe .H perlu di copy dan ditempatkan pada folder Inc dan file yang bertpe
.C ditempatkan pada folder Src
3. Pada program uVision Keil memerlukan untuk menambahkan file source .C pada
Application/User jika menggunakan LCD dan keypad