Naskah berikut ini adalah hasil terjemahan kasar dan belum sempet dirapihkan. Mudah-mudahan besok dah kelar, lagi kekurangan bandwidth hari ini, tolong-tolong!
Sekilas Tentang LCD
Umumnya, sebuah program microcontroller harus berinteraksi dengan dunia luar menggunakan perangkat input dan output yang menjadi antarmuka antara peralatan dengan manusia secara langsung. Salah satu perangkat yang paling umum yang melekat (terangkai) bersama rangkaian microcontroller adalah sebuah layar LCD. Beberapa LCD yang paling umum dihubungkan ke rangkaian microcontroller adalah display (layar LCD) 16x2 dan 20x2. Nilai-nilai ini masing-masing mempunyai arti sebagai berikut:
  • 16x2 adalah 16 karakter per baris dengan 2 baris dan,
  • 20x2 adalah 20 karakter per baris dengan 2 baris.
Kebetulan, dalam pemrograman LCD sudah ada standarisasi yang sangat populer digunakan dan memungkinkan kita untuk berkomunikasi dengan sebagian besar LCD terlepas dari datasheet pabrikan LCD. Standar tersebut mengacu kepada standar pemrograman HD44780U, chip controller yang menerima data dari sumber eksternal (dalam kasus ini adalah microcontroller) dan berkomunikasi langsung dengan LCD. Hampir semua pabrikan LCD mengacu pada standar ini.
Sekilas Tentang “44780”
Standar 44780 membutuhkan 3 baris/pin/kaki kontrol dan 4 atau 8 garis/pin I/O garis untuk data (bus). Pengguna dapat memilih menggunakan LCD dengan operasi 4-bit data bus atau 8-bit data bus. Jika LCD dengan 4-bit data bus yang digunakan maka dibutuhkan 7 baris kabel (3 baris kontrol ditambah 4 baris untuk data bus). Jika yang digunakan adalah LCD dengan 8-bit data bus maka diperlukan total 11 baris kabel (3 baris untuk kontrol ditambah 8 baris untuk data bus) untuk dapat mengirimkan data ke dalam LCD.
Tiga garis kontrol tersebut dikenal dengan istilah EN, RS, dan RW.
Garis EN disebut "Enable." Garis kontrol ini digunakan untuk memberitahu LCD bahwa Anda sedang mengirimkan data kepadanya. Untuk mengirim data ke LCD, pastikan pada program Anda, pada garis ini harus dalam kondisi low (0) dan kemudian set dua baris kontrol lainya dan atau kirimkan data pada bus data (8-bit atau 4-bit). Ketika data telah selesai dikirimkan, buat garis EN menjadi high (1) kembali dan tunggu dalam jangka waktu minimum yang diperlukan oleh LCD, lihat datasheet (karena nilai ini bervariasi dari LCD satu ke LCD lainya), dan akhiri program dengan membawa baris EN menjadi low (0) lagi.
---------------break line-----------------
The RS line is the "Register Select" line. Garis RS adalah "Daftar Pilih" baris. When RS is low (0), the data is to be treated as a command or special instruction (such as clear screen, position cursor, etc.). Ketika RS rendah (0), data harus diperlakukan sebagai perintah atau instruksi khusus (seperti yang jelas layar, posisi kursor, dll). When RS is high (1), the data being sent is text data which sould be displayed on the screen. Ketika RS tinggi (1), data yang dikirim adalah data teks yang dapat ditampilkan pada layar. For example, to display the letter "T" on the screen you would set RS high. Sebagai contoh, untuk menampilkan huruf "T" pada layar Anda akan menetapkan RS tinggi.
The RW line is the "Read/Write" control line. Garis RW adalah "Baca / Tulis" garis kontrol. When RW is low (0), the information on the data bus is being written to the LCD. Ketika RW rendah (0), informasi pada bus data sedang ditulis ke LCD. When RW is high (1), the program is effectively querying (or reading) the LCD. Ketika RW tinggi (1), program ini secara efektif query (atau membaca) LCD. Only one instruction ("Get LCD status") is a read command. Hanya satu instruksi ( "Get LCD status") adalah perintah membaca. All others are write commands--so RW will almost always be low. Semua yang lain akan menulis perintah - jadi RW akan hampir selalu rendah.
Finally, the data bus consists of 4 or 8 lines (depending on the mode of operation selected by the user). Akhirnya, bus data terdiri dari 4 atau 8 jalur (tergantung pada mode operasi yang dipilih oleh pengguna). In the case of an 8-bit data bus, the lines are referred to as DB0, DB1, DB2, DB3, DB4, DB5, DB6, and DB7. Dalam kasus 8-bit data bus, garis disebut sebagai DB0, DB1, DB2, DB3, DB4, DB5, DB6 dan DB7.
AN EXAMPLE HARDWARE CONFIGURATION CONTOH HARDWARE CONFIGURATION
As we've mentioned, the LCD requires either 8 or 11 I/O lines to communicate with. Seperti yang telah kami sebutkan, LCD membutuhkan baik 8 atau 11 I / O baris untuk berkomunikasi dengan. For the sake of this tutorial, we are going to use an 8-bit data bus--so we'll be using 11 of the 8051's I/O pins to interface with the LCD. Demi tutorial ini, kita akan menggunakan 8-bit data bus - jadi kita akan menggunakan 11 dari 8.051's I / O pin untuk interface dengan LCD.
Let's draw a sample psuedo-schematic of how the LCD will be connected to the 8051. Mari kita menggambar sampel psuedo-skema tentang bagaimana LCD akan terhubung ke 8.051.

As you can see, we've established a 1-to-1 relation between a pin on the 8051 and a line on the 44780 LCD. Seperti yang Anda lihat, kami telah mendirikan sebuah 1-ke-1 hubungan antara pin di 8.051 dan garis di LCD 44.780. Thus as we write our assembly program to access the LCD, we are going to equate constants to the 8051 ports so that we can refer to the lines by their 44780 name as opposed to P0.1, P0.2, etc. Let's go ahead and write our initial equates: Jadi ketika kita menulis program assembly kami untuk mengakses LCD, kita akan menyamakan konstanta ke port 8.051 sehingga kita dapat merujuk pada garis-garis dengan nama 44.780 mereka sebagai lawan dari P0.1, P0.2, dll Ayo maju dan menulis awal kami menyamakan:
    DB0 EQU P1.0 DB0 EQU P1.0 DB1 EQU P1.1 DB1 EQU P1.1 DB2 EQU P1.2 DB2 EQU P1.2 DB3 EQU P1.3 DB3 EQU P1.3 DB4 EQU P1.4 DB4 EQU P1.4 DB5 EQU P1.5 DB5 EQU P1.5 DB6 EQU P1.6 DB6 EQU P1.6 DB7 EQU P1.7 DB7 EQU P1.7 EN EQU P3.7 EN EQU P3.7 RS EQU P3.6 RS EQU P3.6 RW EQU P3.5 RW EQU P3.5 DATA EQU P1 DATA EQU P1
Having established the above equates, we may now refer to our I/O lines by their 44780 name. Setelah menyamakan didirikan di atas, kita mungkin sekarang merujuk ke I / O garis oleh nama 44.780. For example, to set the RW line high (1), we can execute the following insutrction: Misalnya, untuk mengatur garis RW tinggi (1), kita dapat mengeksekusi insutrction berikut:
    SETB RW SETB RW
HANDLING THE EN CONTROL LINE PENANGANAN THE EN CONTROL LINE
As we mentioned above, the EN line is used to tell the LCD that you are ready for it to execute an instruction that you've prepared on the data bus and on the other control lines. Note that the EN line must be raised/lowered before/after each instruction sent to the LCD regardless of whether that instruction is read or write, text or instruction. Seperti yang telah disebutkan di atas, baris EN digunakan untuk memberitahu LCD bahwa Anda sudah siap untuk itu untuk mengeksekusi sebuah instruksi bahwa Anda telah menyiapkan data bus dan pada garis kontrol lainnya. Perhatikan bahwa garis EN harus dinaikkan / diturunkan sebelum / setelah setiap instruksi yang dikirim ke LCD terlepas dari apakah itu perintah membaca atau menulis, teks atau instruksi. In short, you must always manipulate EN when communicating with the LCD. Singkatnya, Anda harus selalu memanipulasi EN ketika berkomunikasi dengan LCD. EN is the LCD's way of knowing that you are talking to it. EN adalah LCD cara untuk mengetahui bahwa Anda berbicara kepadanya. If you don't raise/lower EN, the LCD doesn't know you're talking to it on the other lines. Jika anda tidak menaikkan / menurunkan EN, LCD tidak tahu kau bicara pada baris yang lain.
Thus, before we interact in any way with the LCD we will always bring the EN line low with the following instruction: Jadi, sebelum kita berinteraksi dengan cara apapun dengan LCD kita akan selalu membawa garis EN rendah dengan instruksi berikut:
    CLR EN CLR EN
And once we've finished setting up our instruction with the other control lines and data bus lines, we'll always bring this line high: Dan begitu kami sudah selesai menyiapkan instruksi kami dengan garis kontrol lainnya dan data bus, kita akan selalu membawa baris ini tinggi:
    SETB EN SETB EN
The line must be left high for the amount of time required by the LCD as specified in its datasheet. Garis harus dibiarkan tinggi untuk jumlah waktu yang dibutuhkan oleh LCD sebagaimana ditentukan dalam datasheet. This is normally on the order of about 250 nanoseconds, but check the datasheet. In the case of a typical 8051 running at 12 MHz, an instruction requires 1.08 microseconds to execute so the EN line can be brought low the very next instruction. Hal ini biasanya atas perintah dari sekitar 250 nanodetik, tetapi periksa datasheet. Dalam kasus yang khas 8.051 berjalan pada 12 MHz, memerlukan sebuah instruksi untuk mengeksekusi 1,08 mikrodetik sehingga garis EN dapat dibawa sangat rendah instruksi berikutnya. However, faster microcontrollers (such as the DS89C420 which executes an instruction in 90 nanoseconds given an 11.0592 Mhz crystal) will require a number of NOPs to create a delay while EN is held high. The number of NOPs that must be inserted depends on the microcontroller you are using and the crystal you have selected. Namun, lebih cepat Microcontrollers (seperti DS89C420 yang menjalankan instruksi dalam 90 nanodetik diberi kristal 11,0592 Mhz) akan membutuhkan sejumlah nops untuk membuat sebuah penundaan sementara EN yang terangkat tinggi. Jumlah nops yang harus dimasukkan tergantung pada mikrokontroler Anda menggunakan dan kristal yang telah Anda pilih.
The instruction is executed by the LCD at the moment the EN line is brought low with a final CLR EN instruction. Instruksi dieksekusi oleh LCD pada saat garis EN dibawa rendah dengan EN CLR akhir instruksi.
    Programming Tip: The LCD interprets and executes our command at the instant the EN line is brought low. Programming Tip: LCD menafsirkan dan menjalankan perintah kami pada saat garis EN dibawa rendah. If you never bring EN low, your instruction will never be executed. Jika Anda tidak pernah membawa EN rendah, instruksi Anda tidak akan pernah dieksekusi. Additionally, when you bring EN low and the LCD executes your instruction, it requires a certain amount of time to execute the command. Selain itu, ketika Anda membawa EN LCD rendah dan mengeksekusi instruksi Anda, itu memerlukan waktu tertentu untuk menjalankan perintah. The time it requires to execute an instruction depends on the instruction and the speed of the crystal which is attached to the 44780's oscillator input. Waktu yang diperlukan untuk mengeksekusi instruksi tergantung pada instruksi dan kecepatan kristal yang melekat pada 44.780's osilator masukan.
CHECKING THE BUSY STATUS OF THE LCD PEMERIKSAAN THE BUSY STATUS OF THE LCD
As previously mentioned, it takes a certain amount of time for each instruction to be executed by the LCD. Seperti yang disebutkan sebelumnya, dibutuhkan waktu tertentu untuk setiap instruksi yang akan dijalankan oleh LCD. The delay varies depending on the frequency of the crystal attached to the oscillator input of the 44780 as well as the instruction which is being executed. Keterlambatan bervariasi tergantung pada frekuensi kristal osilator melekat pada masukan dari 44.780 serta instruksi yang sedang dieksekusi.
While it is possible to write code that waits for a specific amount of time to allow the LCD to execute instructions, this method of "waiting" is not very flexible. Walaupun mungkin untuk menulis kode yang menunggu untuk jumlah waktu tertentu untuk memungkinkan LCD untuk mengeksekusi instruksi, metode ini "menunggu" tidak sangat fleksibel. If the crystal frequency is changed, the software will need to be modified. Jika frekuensi kristal berubah, perangkat lunak perlu diubah. Additionally, if the LCD itself is changed for another LCD which, although 44780 compatible, requires more time to perform its operations, the program will not work until it is properly modified. Sebagai tambahan, jika LCD itu sendiri akan berubah untuk LCD yang lain, meskipun 44.780 kompatibel, membutuhkan lebih banyak waktu untuk melakukan operasinya, program ini tidak akan bekerja sampai benar dimodifikasi.
A more robust method of programming is to use the "Get LCD Status" command to determine whether the LCD is still busy executing the last instruction received. Metode yang lebih kuat dari pemrograman adalah dengan menggunakan tombol "Dapatkan LCD Status" perintah untuk menentukan apakah LCD masih sibuk mengeksekusi instruksi terakhir diterima.
The "Get LCD Status" command will return to us two tidbits of information; the information that is useful to us right now is found in DB7. Tombol "Dapatkan LCD Status" perintah akan kembali kepada kita dua tidbits informasi; informasi yang berguna untuk kita sekarang ditemukan di DB7. In summary, when we issue the "Get LCD Status" command the LCD will immediately raise DB7 if it's still busy executing a command or lower DB7 to indicate that the LCD is no longer occupied. Singkatnya, ketika kita mengeluarkan "Get LCD Status" perintah LCD akan segera menaikkan DB7 kalau masih sibuk melaksanakan suatu perintah atau DB7 lebih rendah untuk menunjukkan bahwa LCD tidak lagi ditempati. Thus our program can query the LCD until DB7 goes low, indicating the LCD is no longer busy. Jadi program kami dapat query LCD sampai DB7 pergi rendah, menunjukkan LCD tidak lagi sibuk. At that point we are free to continue and send the next command. Pada saat itu kita bebas untuk melanjutkan dan mengirim perintah selanjutnya.
Since we will use this code every time we send an instruction to the LCD, it is useful to make it a subroutine. Karena kita akan menggunakan kode ini setiap kali kita mengirim instruksi ke LCD, akan bermanfaat untuk membuat sebuah sub rutin. Let's write the code: Mari kita menulis kode:
    WAIT_LCD: WAIT_LCD:
      CLR EN ;Start LCD command CLR EN; Mulai perintah LCD CLR RS ;It's a command CLR RS; It's a perintah SETB RW ;It's a read command SETB RW; Ini perintah membaca MOV DATA,#0FFh ;Set all pins to FF initially MOV DATA, # 0FFh; Set semua pin untuk FF awalnya SETB EN ;Clock out command to LCD SETB EN; Jam keluar perintah untuk LCD MOV A,DATA ;Read the return value MOV A, DATA; Baca nilai pengembalian JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy JB ACC.7, WAIT_LCD; Jika 7 bit tinggi, LCD masih sibuk CLR EN ;Finish the command CLR EN; Selesai perintah CLR RW ;Turn off RW for future commands CLR RW; Matikan RW untuk masa depan perintah RET RET
Thus, our standard practice will be to send an instruction to the LCD and then call our WAIT_LCD routine to wait until the instruction is completely executed by the LCD. Jadi, praktik standar kami akan mengirim instruksi ke LCD dan kemudian memanggil rutin WAIT_LCD kami menunggu sampai instruksi benar-benar dilaksanakan oleh LCD. This will assure that our program gives the LCD the time it needs to execute instructions and also makes our program compatible with any LCD, regardless of how fast or slow it is. Ini akan memastikan bahwa program kami memberikan LCD waktu yang dibutuhkan untuk melaksanakan instruksi dan juga membuat program kami kompatibel dengan LCD, terlepas dari seberapa cepat atau lambat itu.
Programming Tip: The above routine does the job of waiting for the LCD, but were it to be used in a real application a very definite improvement would need to be made: as written, if the LCD never becomes "not busy" the program will effectively "hang," waiting for DB7 to go low. Programming Tip: di atas melakukan pekerjaan rutin menunggu LCD, tetapi itu untuk digunakan dalam aplikasi nyata yang sangat pasti perbaikan perlu dilakukan: seperti yang tertulis, jika LCD tidak pernah menjadi "tidak sibuk" program akan efektif "menggantung," menunggu DB7 pergi rendah. If this never happens, the program will freeze. Jika hal ini tidak pernah terjadi, program akan membeku. Of course, this should never happen and won't happen when the hardware is working properly. Tentu saja, hal ini pernah terjadi dan tidak akan terjadi bila perangkat keras bekerja dengan benar. But in a real application it would be wise to put some kind of time limit on the delay--for example, a maximum of 256 attempts to wait for the busy signal to go low. Namun dalam aplikasi nyata akan bijaksana untuk menaruh beberapa jenis batas waktu penundaan itu - misalnya, dari 256 usaha maksimum untuk menunggu sinyal sibuk untuk pergi rendah. This would guarantee that even if the LCD hardware fails, the program would not lock up. Hal ini akan menjamin bahwa bahkan jika hardware LCD gagal, program tidak akan lock up.
INITIALIZING THE LCD Menginisialisasi LCD
Before you may really use the LCD, you must initialize and configure it. Sebelum Anda dapat benar-benar menggunakan LCD, Anda harus menginisialisasi dan mengkonfigurasinya. This is accomplished by sending a number of initialization instructions to the LCD. Hal ini dilakukan dengan mengirimkan sejumlah instruksi untuk inisialisasi LCD.
The first instruction we send must tell the LCD whether we'll be communicating with it with an 8-bit or 4-bit data bus. Instruksi pertama harus memberitahu kami mengirim LCD apakah kita akan berkomunikasi dengan dengan sebuah 8-bit atau 4-bit data bus. We also select a 5x8 dot character font. Kami juga memilih font karakter 5x8 titik. These two options are selected by sending the command 38h to the LCD as a command. Dua opsi ini dipilih dengan mengirimkan perintah 38h ke LCD sebagai perintah. As you will recall from the last section, we mentioned that the RS line must be low if we are sending a command to the LCD. Seperti yang Anda ingat dari bagian terakhir, kita menyebutkan bahwa garis RS harus rendah jika kita mengirimkan perintah ke LCD. Thus, to send this 38h command to the LCD we must execute the following 8051 instructions: Jadi, untuk mengirimkan perintah ke 38h ini LCD kita harus mengeksekusi instruksi 8.051 berikut:
    CLR RS CLR RS MOV DATA,#38h MOV DATA, # 38h SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD
Programming Tip: The LCD command 38h is really the sum of a number of option bits. Programming Tip: 38h perintah LCD sebenarnya adalah jumlah dari sejumlah pilihan bit. The instruction itself is the instruction 20h ("Function set"). Instruksi itu sendiri adalah instruksi 20h ( "Fungsi set"). However, to this we add the values 10h to indicate an 8-bit data bus plus 08h to indicate that the display is a two-line display. Namun, untuk ini kita menambahkan nilai-nilai 10h untuk menunjukkan 8-bit data bus ditambah 08h untuk menunjukkan bahwa tampilan adalah dua baris layar.
We've now sent the first byte of the initialization sequence. Sekarang kami telah mengirimkan byte pertama dari urutan inisialisasi. The second byte of the initialization sequence is the instruction 0Eh. Byte kedua dari urutan inisialisasi instruksi 0Eh. Thus we must repeat the initialization code from above, but now with the instruction. Jadi kita harus mengulangi kode inisialisasi dari atas, tapi sekarang dengan instruksi. Thus the the next code segment is: Dengan demikian, segmen kode berikutnya adalah:
    CLR RS CLR RS MOV DATA,#0Eh MOV DATA, # 0Eh SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD
Programming Tip: The command 0Eh is really the instruction 08h plus 04h to turn the LCD on. To that an additional 02h is added in order to turn the cursor on. Programming Tip: 0Eh perintah sebenarnya adalah 04h ditambah 08h instruksi untuk mengaktifkan LCD di atas. Untuk itu 02h tambahan yang ditambahkan dalam rangka untuk mengubah kursor di atas.
The last byte we need to send is used to configure additional operational parameters of the LCD. Byte terakhir kita perlu mengirim digunakan untuk mengkonfigurasi parameter operasional tambahan dari LCD. We must send the value 06h. Kita harus mengirimkan nilai 06h.
    CLR RS CLR RS MOV DATA,#06h MOV DATA, # 06h SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD
Programming Tip: The command 06h is really the instruction 04h plus 02h to configure the LCD such that every time we send it a character, the cursor position automatically moves to the right. Programming Tip: 06h Perintah instruksi yang benar-benar 04h ditambah 02h untuk mengkonfigurasi LCD sedemikian rupa sehingga setiap kali kita kirimkan karakter, posisi kursor secara otomatis bergerak ke kanan.
So, in all, our initialization code is as follows: Jadi, dalam semua, kami kode inisialisasi adalah sebagai berikut:
    INIT_LCD: INIT_LCD:
      CLR RS CLR RS MOV DATA,#38h MOV DATA, # 38h SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD CLR RS CLR RS MOV DATA,#0Eh MOV DATA, # 0Eh SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD CLR RS CLR RS MOV DATA,#06h MOV DATA, # 06h SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD RET RET
Having executed this code the LCD will be fully initialized and ready for us to send display data to it. Setelah kode ini dieksekusi LCD akan sepenuhnya diinisialisasi dan siap untuk kita untuk mengirim data menampilkan itu.
CLEARING THE DISPLAY KLIRING THE DISPLAY
When the LCD is first initialized, the screen should automatically be cleared by the 44780 controller. Ketika pertama diinisialisasi LCD, layar akan secara otomatis dihapus oleh 44.780 controller. However, it's always a good idea to do things yourself so that you can be completely sure that the display is the way you want it. Namun, selalu ide yang baik untuk melakukan hal-hal diri Anda sehingga Anda bisa benar-benar yakin bahwa layar adalah cara Anda inginkan. Thus, it's not a bad idea to clear the screen as the very first opreation after the LCD has been initialiezd. Jadi, ini bukan ide buruk untuk membersihkan layar sebagai opreation pertama setelah LCD telah initialiezd.
An LCD command exists to accomplish this function. Perintah LCD ada untuk mencapai fungsi ini. Not suprisingly, it is the command 01h. Tidak mengherankan, itu adalah perintah 01h. Since clearing the screen is a function we very likely will wish to call more than once, it's a good idea to make it a subroutine: Sejak membersihkan layar adalah fungsi kita sangat mungkin akan ingin untuk menghubungi lebih dari sekali, itu ide yang baik untuk menjadikannya sebuah subroutine:
    CLEAR_LCD: CLEAR_LCD:
      CLR RS CLR RS MOV DATA,#01h MOV DATA, # 01h SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD RET RET
How that we've written a "Clear Screen" routine, we may clear the LCD at any time by simply executing an LCALL CLEAR_LCD . Bagaimana bahwa kami telah menulis sebuah "Clear Screen" rutin, kita dapat menghapus LCD setiap saat dengan hanya menjalankan sebuah LCALL CLEAR_LCD.
Programming Tip: Executing the "Clear Screen" instruction on the LCD also positions the cursor in the upper left-hand corner as we would expect. Programming Tip: Pelaksana tombol "Clear Screen" instruksi pada LCD juga posisi kursor di atas pojok kiri sebagaimana yang kita harapkan.
WRITING TEXT TO THE LCD MENULIS TEKS DENGAN LCD
Now we get to the real meat of what we're trying to do: All this effort is really so we can display text on the LCD. Sekarang kita sampai daging yang sebenarnya dari apa yang kita coba lakukan: Semua upaya ini benar-benar sehingga kami dapat menampilkan teks pada LCD. Really, we're pretty much done. Sungguh, kita cukup banyak dilakukan.
Once again, writing text to the LCD is something we'll almost certainly want to do over and over--so let's make it a subroutine. Sekali lagi, menulis teks ke LCD adalah sesuatu yang kita akan hampir pasti ingin melakukannya berulang - jadi mari kita membuat sebuah sub rutin.
    WRITE_TEXT: WRITE_TEXT:
      SETB RS SETB RS MOV DATA,A MOV DATA, A SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD RET RET
The WRITE_TEXT routine that we just wrote will send the character in the accumulator to the LCD which will, in turn, display it. Yang WRITE_TEXT rutin bahwa kita baru saja menulis akan mengirimkan karakter di akumulator ke LCD yang akan, pada gilirannya, tampilan itu. Thus to display text on the LCD all we need to do is load the accumulator with the byte to display and make a call to this routine. Jadi untuk menampilkan teks pada LCD semua yang perlu kita lakukan adalah beban akumulator dengan byte untuk menampilkan dan membuat panggilan ke rutinitas ini. Pretty easy, huh? Cukup mudah, ya?
A "HELLO WORLD" PROGRAM Sebuah "HALO WORLD" PROGRAM
Now that we have all the component subroutines written, writing the classic "Hello World" program--which displays the text "Hello World" on the LCD is a relatively trivial matter. Sekarang bahwa kita memiliki semua komponen subrutin ditulis, menulis klasik "Hello World" program - yang menampilkan teks "Hello World" pada LCD adalah relatif sepele. Consider: Pertimbangkan:
    LCALL INIT_LCD LCALL INIT_LCD LCALL CLEAR_LCD LCALL CLEAR_LCD MOV A,#'H' MOV A, # 'H' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'E' MOV A, # 'E' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'O' MOV A, # 'O' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#' ' MOV A, # '' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'W' MOV A, # 'W' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'O' MOV A, # 'O' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'R' MOV A, # 'R' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'D' MOV A, # 'D' LCALL WRITE_TEXT LCALL WRITE_TEXT
The above "Hello World" program should, when executed, initialize the LCD, clear the LCD screen, and display "Hello World" in the upper left-hand corner of the display. Di atas "Hello World" program harus, jika dilaksanakan, menginisialisasi LCD, layar LCD yang jelas, dan menampilkan "Hello World" di bagian pojok kiri atas layar.
CURSOR POSITIONING CURSOR POSITIONING
The above "Hello World" program is simplistic in the sense that it prints its text in the upper left-hand corner of the screen. Di atas "Hello World" program sederhana dalam arti bahwa di cetak dengan teks pada bagian atas pojok kiri layar. However, what if we wanted to display the word "Hello" in the upper left-hand corner but wanted to display the word "World" on the second line at the tenth character? Namun, bagaimana jika kita ingin menampilkan kata "Halo" di bagian pojok kiri tetapi ingin menampilkan kata "World" pada baris kedua di sepuluh karakter? This sounds simple--and actually, it is simple. Ini kedengarannya sederhana - dan benar-benar, adalah sederhana. However, it requires a little more understanding of the design of the LCD. Namun, hal itu memerlukan sedikit lebih banyak pemahaman tentang desain LCD.
The 44780 contains a certain amount of memory which is assigned to the display. All the text we write to the 44780 is stored in this memory, and the 44780 subsequently reads this memory to display the text on the LCD itself. Para 44.780 berisi sejumlah memori yang diberikan ke layar. Semua teks kita menulis surat kepada 44.780 tersimpan dalam memori ini, dan kemudian membaca 44.780 memori ini untuk menampilkan teks pada LCD itu sendiri. This memory can be represented with the following "memory map": Memori ini dapat diwakili dengan mengikuti "peta memori":

In the above memory map, the area shaded in blue is the visible display. Memori di atas peta, wilayah yang diarsir dengan warna biru adalah layar terlihat. As you can see, it measures 16 characters per line by 2 lines. Seperti yang anda lihat, ukuran 16 karakter per baris dengan 2 baris. The numbers in each box is the memory address that corresponds to that screen position. Angka dalam setiap kotak adalah alamat memori yang sesuai dengan posisi layar.
Thus, the first character in the upper left-hanad corner is at address 00h. The following character position (character #2 on the first line) is address 01h, etc. Dengan demikian, karakter pertama di sudut kiri-sudut hanad di alamat 00h. Berikut posisi karakter (karakter # 2 pada baris pertama) adalah alamat 01h, dll This continues until we reach the 16th character of the first line which is at address 0Fh. Ini terus berlanjut sampai kita mencapai 16 karakter baris pertama yang merupakan alamat 0Fh.
However, the first character of line 2, as shown in the memory map, is at address 40h. Namun, karakter pertama dari baris 2, seperti ditunjukkan pada peta memori adalah pada alamat 40h. This means if we write a character to the last position of the first line and then write a second character, the second character will not appear on the second line. Ini berarti jika kita menulis karakter ke posisi terakhir baris pertama dan kemudian menulis karakter kedua, karakter kedua tidak akan muncul pada baris kedua. That is because the second character will effectively be written to address 10h--but the second line begins at address 40h. Itu karena karakter kedua akan efektif ditulis ke alamat 10h - tetapi baris kedua dimulai pada alamat 40h.
Thus we need to send a command to the LCD that tells it to position the cursor on the second line. Jadi kita perlu untuk mengirim perintah ke LCD yang memberitahu ke posisi kursor pada baris kedua. The "Set Cursor Position" instruction is 80h. The "Set Cursor Position" instruksi adalah 80h. To this we must add the address of the location where we wish to position the cursor. In our example, we said we wanted to display "World" on the second line on the tenth character position. Untuk ini kita harus menambahkan alamat lokasi dimana kita ingin posisi kursor. Pada contoh kita, kami berkata kami ingin menampilkan "World" pada baris kedua di posisi kesepuluh karakter.
Referring again to the memory map, we see that the tenth character position of the second line is address 4Ah. Merujuk lagi ke peta memori, kita melihat bahwa karakter kesepuluh posisi baris kedua adalah alamat 4Ah. Thus, before writing the word "World" to the LCD, we must send a "Set Cursor Position" instruction--the value of this command will be 80h (the instruction code to position the cursor) plus the address 4Ah. Jadi, sebelum menulis kata "World" pada LCD, kita harus mengirim "Set Cursor Position" instruksi - nilai dari perintah ini akan 80h (kode instruksi untuk posisi kursor) plus alamat 4Ah. 80h + 4Ah = CAh. 80h + 4Ah = Cah. Thus sending the command CAh to the LCD will position the cursor on the second line at the tenth character position: Dengan demikian mengirimkan perintah Cah ke LCD akan posisi kursor pada baris kedua di posisi ke sepuluh karakter:
    CLR RS CLR RS MOV DATA,#0CAh MOV DATA, # 0CAh SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD
The above code will position the cursor on line 2, character 10. Kode diatas akan posisi kursor pada baris 2, karakter 10. To display "Hello" in the upper left-hand corner with the word "World" on the second line at character position 10 just requires us to insert the above code into our existing "Hello World" program. Untuk menampilkan "Halo" di bagian pojok kiri dengan kata "World" pada baris kedua di posisi 10 karakter hanya mengharuskan kita untuk memasukkan kode diatas ke kami yang ada "Hello World" program. This results in the following: Ini hasil sebagai berikut:
    LCALL INIT_LCD LCALL INIT_LCD LCALL CLEAR_LCD LCALL CLEAR_LCD MOV A,#'H' MOV A, # 'H' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'E' MOV A, # 'E' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'O' MOV A, # 'O' LCALL WRITE_TEXT LCALL WRITE_TEXT CLR RS CLR RS MOV DATA,#0CAh MOV DATA, # 0CAh SETB EN SETB EN CLR EN CLR EN LCALL WAIT_LCD LCALL WAIT_LCD MOV A,#'W' MOV A, # 'W' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'O' MOV A, # 'O' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'R' MOV A, # 'R' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'L' MOV A, # 'L' LCALL WRITE_TEXT LCALL WRITE_TEXT MOV A,#'D' MOV A, # 'D' LCALL WRITE_TEXT LCALL WRITE_TEXT
SUMMARY RINGKASAN
This tutorial has presented the underlying concepts of programming an LCD display. Tutorial ini disajikan konsep-konsep yang mendasari pemrograman layar LCD. Obviously it has not addresses all issues. Jelas itu tidak alamat semua masalah. The 44780 LCD controller offers many other functions which are accessed using other commands, and some of the commands already presented include other options that were not discussed here. 44.780 LCD controller yang menawarkan banyak fungsi lainnya yang diakses menggunakan perintah lain, dan beberapa perintah telah disajikan mencakup pilihan lain yang tidak dibahas di sini. However, this tutorial should get you going in the right direction. Namun, tutorial ini harus segera Anda akan arah yang benar.

Creative Commons License You may share this document under Creative Commons License – Terima kasih telah membaca tulisan ini. © 2011 Ari Sulistiono, Indonesian Electrical Engineer.