Tuesday, September 30, 2014

LCD 4x20, Modul klasik yang masih asik


Ceritanya dimulai dari saat pengembangan perangkat yang membutuhkan modul LCD karakter 4x20. Modul ini adalah sebuah modul LCD karakter yang terdiri dari 4 barus dan 20 kolom.

Sebenarnya Perkenalan dengan modul ini sudah terjadi sejak lama, kurang lebih 8 tahun yang lalu, waktu itu menggunakan LCD 2x16. Menurut datasheet yang diperoleh, karakteristik dari LCD 4x20 mirip dengan LCD 2x16. Sehingga dalam pikiran saya hal ini tidak sulit untuk di jalani kembali. yang menjadi tantangannya adalah uC yang digunakan, berbeda dengan waktu lalu.

Seperti biasa, percobaan dimulai dengan mencari apakah sudah perna ada orang yang membuat kode atau librari modul ini sebelum nya dengan target uC yang digunakan saat ini. dan kemungkinan besar pasti sudah ada, lebih mengejutkan lagi saya menemukan dua library gihub yang mempublikasikan librari dari modul ini yang telah mereka buat.

Langkah selanjutnya adalah mencoba program tersebut. dan hasilnya adalah negatif. kedua library tersebut tidak dapat berjalan dengan baik, atau bahkan dapat dikatakan harus diberi sentuhan agar dapat digunakan sesuai dengan yang diinginkan. Sementara itu ada masalah lain yang mengnatui di pikiran, yaitu perbedaan tegangan kerja antar uC dengan modul.

Tegangan kerja modul LCD adalah 5v DC sementara tengangan kerja uC yang digunakan adalah 3.3 v DC. Ada kekawatiran dalam pikiran yaitu, perbedaan tengangan kerja ini dapat mempengaruhi proses antarmuka antara modul dan uC. Penarasan berlanjut, dengan mencari video di internet yang menampilkan percobaan yang berhasil antarmuka modul dengan uC, dan ternyata videonya juga sudah ada di internet. dari semua video yang ada, semuanya menunjukkan percobaan yang berhasil dengan cara hubungkan langsung, yaitu langsung menghubungkan kaki uC ke kaki control dan data pada modul.

Percaya diri pun bertambah, namun masi tetap pusing karena pikiran ini selalu berasumsi bahwa, apa yang telah di posting di internet sudah pasti benar dan akan selalu berhasil. Namun untuk kasus yang satu ini. asusmi itu salah. Di suatu ketika, saya bertekat untuk keluar dari kebiasaan atau dari pendirian selama ini dan rasa malas.

Saat itu saya coba untuk mengambil devboard dari uC yang digunakan dan menyolderkan kaki idc pada modul LCD. yang percobaan sebelumnya saya lakukan pada uC yang sudah terpasang pada board yang telah di kastem sesuai dengan kebutuhan. Berdasarkan tekat tersebut, dilakukan percobaan program diatas devboard dan LCD.

Hasilnya masi sama. kode yang didapat dari internet ternyata masi tetap tidak bisa jalan, meskipun pin dan portnya sudah disesuaikan dengan library yang diperoleh. untuk diketahui dua library yang saya peroleh tersebut, memiliki perbedaan cara mengakses modul yaitu, menggunakan cara komunikasi 8-bit dan komunikas 4-bit.

Dampak yang signifikan dapat dilihat dari beberapa sudut pandang. misalnya dari jumlah kabel yang nantinya akan menghubungkan modul dengan uC. Jika dalam desain perangkatnya mengharuskan modul terpasang pada kesing sehingga diperlukan kabel penghubung untuk menghubungkan board dengan modul. selain itu, jalur pada PCB Lebih sedikit sehingga area board dapat digunakan oleh rangkaian yang lain.

Saya rasa cukup basa basinya. berikut ini adalah contoh program yang sangat sederhana dan langsung pada penampakan satu karakter. oh ya... projek ini di kembangkan diatas keil uVision. namun sangat mungkin untuk menjalankannya diatas Coocox atau IDE yang lain sesuai dengan keterikatan kita dengan IDE/ Text editor yang kita gunakan.




Kode dari program ini adalah :
1:  /*  
2:   * main.c  
3:   *  
4:   * Created on: Sep 30, 2014  
5:   *   Author: Ricky  
6:   */  
7:    
8:  #include "stm32f4xx.h"  
9:  #include "stm32f4xx_gpio.h"  
10:  #include "stm32f4xx_rcc.h"  
11:  #include "stm32f4_discovery.h"  
12:    
13:  // Port yang digunakan  
14:  #define LCD_GPIO_D GPIOE  
15:  #define LCD_GPIO_C GPIOB  
16:    
17:  // Pin data yang digunakan  
18:  #define LCD_D4 GPIO_Pin_12  
19:  #define LCD_D5 GPIO_Pin_13  
20:  #define LCD_D6 GPIO_Pin_14  
21:  #define LCD_D7 GPIO_Pin_15  
22:    
23:  // pin control yang digunakan  
24:  #define LCD_RS GPIO_Pin_12  
25:  #define LCD_EN GPIO_Pin_13  
26:    
27:    
28:  // resume control pada LCD  
29:  #define HD44780_CLEAR                                0x01  
30:    
31:  #define HD44780_HOME                              0x02  
32:    
33:  #define HD44780_ENTRY_MODE                           0x04  
34:       #define HD44780_EM_SHIFT_CURSOR            0  
35:       #define HD44780_EM_SHIFT_DISPLAY       1  
36:       #define HD44780_EM_DECREMENT            0  
37:       #define HD44780_EM_INCREMENT            2  
38:    
39:  #define HD44780_DISPLAY_ONOFF                      0x08  
40:       #define HD44780_DISPLAY_OFF                   0  
41:       #define HD44780_DISPLAY_ON                 4  
42:       #define HD44780_CURSOR_OFF                 0  
43:       #define HD44780_CURSOR_ON                 2  
44:       #define HD44780_CURSOR_NOBLINK             0  
45:       #define HD44780_CURSOR_BLINK            1  
46:    
47:  #define HD44780_DISPLAY_CURSOR_SHIFT          0x10  
48:       #define HD44780_SHIFT_CURSOR            0  
49:       #define HD44780_SHIFT_DISPLAY            8  
50:       #define HD44780_SHIFT_LEFT                 0  
51:       #define HD44780_SHIFT_RIGHT              4  
52:    
53:  #define HD44780_FUNCTION_SET                 0x20  
54:       #define HD44780_FONT5x7                     0  
55:       #define HD44780_FONT5x10                4  
56:       #define HD44780_ONE_LINE                0  
57:       #define HD44780_TWO_LINE                8  
58:       #define HD44780_4_BIT                     0  
59:       #define HD44780_8_BIT                     16  
60:    
61:  #define HD44780_CGRAM_SET                      0x40  
62:    
63:  #define HD44780_DDRAM_SET                      0x80  
64:    
65:    
66:  void LCD_Initialize(void);  
67:  void LCD_GoTo(unsigned char, unsigned char);  
68:  void LCD_WriteText(char *);  
69:  void LCD_WriteData(u8 dataToWrite);  
70:  void LCD_WriteNibble(u8 nibbleToWrite);  
71:  void CharLCD_Delay(int Count);  
72:  void LCD_WriteCommand(u8 commandToWrite);  
73:    
74:    
75:  int main(void)  
76:  {  
77:   LCD_Initialize();  
78:   LCD_GoTo(1,1);  
79:   LCD_WriteText("LCD 4x20");  
80:   LCD_GoTo(1,2);  
81:   LCD_WriteText("Modul    KLASIK!!");  
82:   LCD_GoTo(1,3);  
83:   LCD_WriteText("yang masih");  
84:   LCD_GoTo(13,4);  
85:   LCD_WriteText("ASIK!!");  
86:    
87:   while(1)  
88:   {  
89:   }  
90:    
91:  }  
92:    
93:  void LCD_Initialize(void)  
94:  {  
95:       GPIO_InitTypeDef GPIO_InitStructure;  
96:       vu8 i = 0;  
97:       vu32 delayCnt = 0;  
98:    
99:       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  
100:       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
101:    
102:    
103:       GPIO_InitStructure.GPIO_Pin  = LCD_D4|LCD_D5|LCD_D6|LCD_D7;  
104:       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
105:       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  
106:       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
107:    
108:       GPIO_Init(LCD_GPIO_D, &GPIO_InitStructure);  
109:    
110:       GPIO_InitStructure.GPIO_Pin  = LCD_RS|LCD_EN;  
111:       GPIO_Init(LCD_GPIO_C, &GPIO_InitStructure);  
112:    
113:       GPIO_ResetBits(LCD_GPIO_C, LCD_RS | LCD_EN );  
114:    
115:       for(delayCnt = 0; delayCnt < 300000; delayCnt++);  
116:    
117:       for(i = 0; i < 3; i++)  
118:       {  
119:            LCD_WriteNibble(0x03);  
120:            for(delayCnt = 0;delayCnt < 30000; delayCnt++);  
121:       }  
122:    
123:       LCD_WriteNibble(HD44780_HOME);  
124:    
125:       for(delayCnt = 0;delayCnt < 6000; delayCnt++);  
126:    
127:       LCD_WriteCommand(HD44780_FUNCTION_SET |  
128:                            HD44780_FONT5x7 |  
129:                            HD44780_TWO_LINE |  
130:                            HD44780_4_BIT);  
131:    
132:       LCD_WriteCommand(HD44780_DISPLAY_ONOFF |  
133:                            HD44780_DISPLAY_OFF);  
134:    
135:       LCD_WriteCommand(HD44780_CLEAR);  
136:    
137:       LCD_WriteCommand(HD44780_ENTRY_MODE |  
138:                            HD44780_EM_SHIFT_CURSOR |  
139:                            HD44780_EM_INCREMENT);  
140:    
141:       LCD_WriteCommand(HD44780_DISPLAY_ONOFF |  
142:                            HD44780_DISPLAY_ON |  
143:                            HD44780_CURSOR_ON |  
144:                            HD44780_CURSOR_BLINK);  
145:    
146:       LCD_WriteCommand(HD44780_CLEAR);  
147:  }  
148:    
149:  void LCD_GoTo(unsigned char x, unsigned char y)  
150:  {  
151:       u8 position;  
152:    
153:       switch(y) {  
154:            case 1:  
155:                 position = x - 0x01;  
156:                 break;  
157:            case 2:  
158:                 position = x + 0x3F;  
159:                 break;  
160:            case 3:  
161:                 position = x + 0x13;  
162:                 break;  
163:            case 4:  
164:                 position = x + 0x53;  
165:                 break;  
166:            default:  
167:                 break;  
168:       }  
169:       LCD_WriteCommand(position | 0x80);  
170:    
171:  }  
172:    
173:  void LCD_WriteTextXY(char * text, u8 x, u8 y)  
174:  {  
175:       LCD_GoTo(x,y);  
176:       LCD_WriteText(text);  
177:  }  
178:    
179:  void LCD_WriteText(char * text)  
180:  {  
181:       while((*text !=0) && (*text != 13))  
182:             LCD_WriteData(*text++);  
183:  }  
184:    
185:  void LCD_WriteData(u8 dataToWrite)  
186:  {  
187:       GPIO_WriteBit(LCD_GPIO_C, LCD_RS, Bit_SET);  
188:    
189:       LCD_WriteNibble(dataToWrite >> 4);  
190:       LCD_WriteNibble(dataToWrite & 0x0F);  
191:    
192:  }  
193:    
194:  void LCD_WriteCommand(u8 commandToWrite)  
195:  {  
196:       GPIO_WriteBit(LCD_GPIO_C, LCD_RS, Bit_RESET);  
197:       LCD_WriteNibble(commandToWrite >> 4);  
198:       LCD_WriteNibble(commandToWrite & 0x0F);  
199:    
200:  }  
201:    
202:  void LCD_WriteNibble(u8 nibbleToWrite)  
203:  {  
204:       GPIO_WriteBit(LCD_GPIO_C, LCD_EN, Bit_SET);  
205:       GPIO_WriteBit(LCD_GPIO_D, LCD_D4, (nibbleToWrite & 0x01));  
206:       GPIO_WriteBit(LCD_GPIO_D, LCD_D5, (nibbleToWrite & 0x02));  
207:       GPIO_WriteBit(LCD_GPIO_D, LCD_D6, (nibbleToWrite & 0x04));  
208:       GPIO_WriteBit(LCD_GPIO_D, LCD_D7, (nibbleToWrite & 0x08));  
209:       CharLCD_Delay(0x1F000); // tundaan yang paling cepat yang masi dapat berjalan  
210:       GPIO_WriteBit(LCD_GPIO_C, LCD_EN, Bit_RESET);  
211:    
212:  }  
213:    
214:  void CharLCD_Delay(int Count)  
215:  {  
216:       while(Count--)  
217:       {  
218:       }  
219:  }  
220:    

Kode ini sebenarnya saya gabungkan dari beberapa sumber di internet yaitu:
Namun, kode tersebut tidak dapat langsung digunakan, sehingga saya berikan beberapa sentuhan asik. sampai bisa berjalan dengan baik (setidaknya menurut saya).

No comments:

Post a Comment