3.2 Inch TFT (IL9320) LCD interfacing to ATMega1284p


LCD ini sudah lama saya beli (sekitar tahun 2011) melalui ebay.com dari penjual di China, tetapi baru sempat diutak atik sekarang. Awalnya saya kesulitan menentukan jenis controller dari LCD ini karena penjual tidak melengkapi informasi tersebut. Ada banyak jenis TFT controller untuk kelas 3.2 Inch. Setelah try and error beberapa hari akhirnya saya menemukan cara mengetahui jenis controller LCD nya (ILI9320) dari source code embedded linux yang menggunakan LCD yang sama… busyet dah, ini pelajaran penting membeli barang dari China sebab umumnya mereka hanya penjual jangan berharap banyak untuk support teknis.

Akhirnya saya coba kaitkan kemungkinan memanfaatkan LCD ini untuk hobby transceiver saya.. mungkin untuk “my another bitx” dengan sedikit terinspirasi dengan project PICASTAR maka mulailah saya merancang rangkaiannya. Beberapa hal teknis yang menjadi pertimbangan adalah sbb:

  • LCD ini membutuh kan interface yang cukup banyak artinya memakan cukup banyak I/O pin dari mikrokontroler
  • Compiler yang saya gunakan jenis low end BASCOM konsekwensinya tidak ada default driver…semua harus start from the scratch (saya beruntung ternyata ada yang sudah memulai dengan BASCOM http://www.six1.net/), juga beberapa driver dari openmcu.com untuk bahasa C
  • Mikrokontroler saya pilih ATMega1284, 40 DIP dengan 128Kbyte Flash dan 16Kbyte RAM.. cukup untuk bahkan beberapa image kecil..
  • Mikrokontroler saya kerjakan pada clock 25Mhz (over clock dari maximum 20MHz operation). Banyak proses kalkulasi yang membutuhkan mcu power lebih besar
  • Walaupun LCD ini datang satu paket dengan interface touch panel dan SDCard saya tidak akan memasukkanya pada project kali ini
  • Berikut adalah skema nya:
schs

ATMega1284p 3.2 Inch TFT

  • LCD TFT 3.2″
LCD1s

3.2″ TFT LCD ILI9320

LCD2s

3.2″ TFT LCD Pinout

  • PCB component Side
pcb2s

Component Side (ATMEga1284) + Voltage Regulator LM317

  • PCB solder side
pcb1s

SOlder Side + 25Mhz overclocked Mega1284P

  • Its on now
dsips

LCD sudah menyala, kira2 tampilan untuk BITX

  • The Code

Saya berasumsi bahwa kunci penting pemrograman LCD ini adalah pada saat inisialiasi dan selebihnya operasi adalah operasi moveto RAM position dan putpixel, bisa  kita perhatikan pada code listing berikut belum banyak yang saya modifikasi dari coding aslinya:

‘*******************************************************************************
‘  Copyright Michael Koecher aka six1 8/2010
‘  -> http://www.six1.net/   michael@koecher-web.de
‘*******************************************************************************

‘——————————————————————————-
‘Initial the LCD Display Controller ILI9320  or SPFD5408
‘——————————————————————————-
Sub Ili9320_init(byval Modus As Byte)
‘(
Modus:
1 – Vertical
2 – Horizontal
‘)

Display_modus = Modus
‘ First, Reset the Display
Res_disp = 0
Waitms 1
Res_disp = 1
Waitms 1

Call Ili9320_write_reg(start_oscillation , &B0000_0000_0000_0001)
Waitms 10
Call Ili9320_write_reg(driver_output_control , &B0000_0000_0000_0000 )
Call Ili9320_write_reg(lcd_driving_control , &B0000_0111_0000_0000 )
‘Horizontal left-upper to right-bottom
If Modus = 1 Then
Call Ili9320_write_reg(entry_mode , &B0001_0000_0011_1000 )
X_pixel = 320
Y_pixel = 240
End If
‘Vertical left-upper to right-bottom
If Modus = 2 Then
Call Ili9320_write_reg(entry_mode , &B0001_0000_0010_0000)
X_pixel = 240
Y_pixel = 320
End If

Call Ili9320_write_reg(rgb_display_interface_control_1 , &B1110_0000_0000_0001)

Call Ili9320_write_reg(power_control_1 , &B0001_0110_1011_0000 )
Call Ili9320_write_reg(power_control_2 , &B0000_0000_0011_0111 )
Waitms 10
Call Ili9320_write_reg(power_control_3 , &B0000_0001_0011_1110 )
Call Ili9320_write_reg(power_control_4 , &B0001_1010_0000_0000 )
Call Ili9320_write_reg(power_control_7 , &B0000_0000_0000_1111 )

Call Ili9320_write_reg(horizontal_gram_address , &B0000_0000_0000_0000)
Call Ili9320_write_reg(vertical_gram_address , &B0000_0000_0000_0000)

Call Ili9320_write_reg(horizontal_add_start_position , &B0000_0000_0000_0000)
Call Ili9320_write_reg(horizontal_add_end_position , 239)       ‘&B0000_0000_1110_1111)
Call Ili9320_write_reg(vertical_add_start_position , &B0000_0000_0000_0000)
Call Ili9320_write_reg(vertical_add_end_position , 319)  ‘&B0000_0001_0011_1111)

Call Ili9320_write_reg(driver_output_control_2 , &B0010_0111_0000_0000)
Call Ili9320_write_reg(base_image_display_control , &B0000_0000_0000_0001 )
Call Ili9320_write_reg(vertical_scroll_control , &B0000_0000_0000_0000)

Call Ili9320_write_reg(gamma_control_1 , &B0000_0000_0000_0111)
Call Ili9320_write_reg(gamma_control_2 , &B0000_0100_0000_0011)
Call Ili9320_write_reg(gamma_control_3 , &B0000_0100_0000_0100)
Call Ili9320_write_reg(gamma_control_4 , &B0000_0000_0000_0010)
Call Ili9320_write_reg(gamma_control_5 , &B0000_0111_0000_0111)
Call Ili9320_write_reg(gamma_control_6 , &B0000_0110_0000_0110)
Call Ili9320_write_reg(gamma_control_7 , &B0000_0001_0000_0110)
Call Ili9320_write_reg(gamma_control_8 , &B0000_0000_0000_0111)
Call Ili9320_write_reg(gamma_control_9 , &B0000_0111_0000_0000)
Call Ili9320_write_reg(gamma_control_10 , &B0000_0111_0000_0111)

‘Enable Display
Call Ili9320_write_reg(display_control_1 , &B0000_0001_0111_0011)

End Sub

‘——————————————————————————-
‘ ILI9320_set_pixel  Set one Pixel in given color
‘——————————————————————————-
Sub Ili9320_set_pixel(byval X1 As Word , Y1 As Word , Color As Word)
Call Ili9320_set_cursor(x1 , Y1)
Call Ili9320_write_reg(write_data_to_gram , Color)
End Sub

‘——————————————————————————-
‘ ILI9320_select_reg  Select an index register
‘——————————————————————————-
Sub Ili9320_select_reg(byval Index As Byte )
Reset Cs_disp
Set Rd_disp
Reset Rs_disp
Data_low = Index
Data_hig = 0
Reset Wr_disp
Set Wr_disp
Set Cs_disp
End Sub

‘——————————————————————————-
‘ Ili9320_write_data  Write 16 Bit Data to Display
‘——————————————————————————-
Sub Ili9320_write_data(byval Daten As Word)
Reset Cs_disp
Set Rd_disp
Set Rs_disp
Data_low = Low(daten)
Data_hig = High(daten)
Reset Wr_disp : Waitus 1
Set Wr_disp
Set Cs_disp
End Sub

‘——————————————————————————-
‘ Ili9320_write_reg  Write 16 Bit Data to Index Register
‘——————————————————————————-
Sub Ili9320_write_reg(byval Index As Byte , Daten As Word)
Reset Cs_disp
Set Rd_disp

‘WRITE REGISTER
Reset Rs_disp
Data_low = Index
Data_hig = 0
Reset Wr_disp
Set Wr_disp

‘Write Data
Set Rs_disp
Data_low = Low(daten)
Data_hig = High(daten)
Reset Wr_disp : Waitus 1
Set Wr_disp
Set Cs_disp
End Sub

‘——————————————————————————-
‘ ILI9320_Set_Cursor(X, Y)
‘——————————————————————————-
Sub Ili9320_set_cursor(byval X As Word , Y As Word )
If Display_modus = 1 Then
Swap X , Y
‘X = 240 – X
End If
If Display_modus = 2 Then
X = 240 – X
‘      Y = 320 – Y

End If
Call Ili9320_write_reg(horizontal_gram_address , X)
Call Ili9320_write_reg(vertical_gram_address , Y)
End Sub

Semoga bermanfaat

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s