Professional Documents
Culture Documents
For e.g.
to display 'AB' microcontroller has to send two hex bytes 41h and 42h respectively.LCD display used here is
having 16x2 size. It means 2 lines each with 16 character.
Circuit Diagram
line1 80H 81H 82H 83H 84H 85H 86H 87H 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
line2 C0H C1H C2H C3H C4H C5H C6H C7H C8H C9H CAH CBH CCH CDH CEH CFH
Gambar 1
Rangkaian Digital Clock
Program C berikut merupakan saduran langsung dari program CLOCK.ASM yang ditulis dalam bahasa
Assembler MCS51, dipakai untuk mengendalikan Digital Clock dengan rangkaian seperti terlihat dalam
Gambar 1, cara kerjanya dibahas dalam artikel di atas.
Program tersebut ditulis dengan program editor biasa, bisa pakai EDITOR.COM dalam DOS atau
NotePad.EXE dalam Windows, kemudian disimpan dalam file dengan nama CLOCK.C.
Selanjutnya pada DOS prompt diberikan perintah SDCC CLOCK.C, perintah ini akan menghasilkan banyak
file, semua dengan nama yang dimulai dengan CLOCK. Dari sekian banyak file tersebut terdapat CLOCK.IHX,
file ini merupakan file berisikan kode mesin MCS51 (object file) dengan format Intel Hex yang siap diisikan
ke dalam PEROM dari AT89C2051.
Program 1 – Digital Clock sederhana dengan C
01:/*************************************** 37:* Bagian Utama *
*********************\ 38:* Tugas Utama AT89C2051 menangani Sistem
02: Digital Clock Tampilan 7 ruas, dan *
03:\*************************************** 39:* menjalankan rutin ScanDisplay tanpa berhenti.
*********************/ *
04:#include <AT89X51.h> 40:* *
05:char Pencacah20; 41:* Interupsi Timer terjadi setiap 50 mili detik
06:char Detik; sekali, saat itu *
07:char Menit; 42:* AT89C2051 meninggalkan sebentar Bagian
08:char Jam; Utama ini, untuk mengu *
09:char Ruas[4]; 43:* rus untaian pencacah Menit dan pencacah
10:sbit at 0xB2 TombolJam; // P3.2 Jam. *
11:sbit at 0xB3 TombolMenit; // P3.3 44:\***************************************
12: ************************/
13:// ****** Membentuk ruas-ruas angka untuk 45:void main (void){
ditampilkan ****** 46: Pencacah20=20; //Nilai awal Pencacah20
14:void Ruas2Digit (unsigned char c, unsigned char 47: Jam=Menit=Detik=0; //Mulai dari Jam/Menit 0
pos){ 48: PerbaruiTampilan();
15: code char KombinasiRuas[] = 49:
{0xC0,0xF9,0xA4,0xB0,0×99, 50: //th0:tl0 diisi dengan -50000,
16: 0×92,0×82,0xF8,0×80,0×90}; 51: //sebagai pencacah count-up 50000 pulsa
17: Ruas[pos++] = KombinasiRuas[c/10]; kemudian
18: Ruas[pos] = KombinasiRuas[c%10]; 52: //(=50000 mikro-detik) pencacah melimpah
19: } menjadi 0 (TF0=1)
20:void PerbaruiTampilan (void){ 53: TH0 = (-50000/256)-1;
21: Ruas2Digit(Jam,0); 54: TL0 = (-50000%256);
22: Ruas2Digit(Menit,2); 55:
23: } 56: TMOD = 0×11; //Timer 0 & 1 sebagai 16 bit
24:// ****** Waktu tunda penyalaan 1 digit angka counter
****** 57: ET0 = 1; //Aktipkan interupsi Timer 0
25:void TungguSebentar() { // tunggu selama 1,5 58: EA = 1; //Aktipkan Sistem interupsi MCS51
mili-detik 59: TR0 = 1; //Jalankan Timer 0
26: //th0:tl0 diisi dengan -1500, 60:
27: //sebagai pencacah count-up 1500 pulsa 61: while(1) //4 baris berikut ini diulang tanpa henti
kemudian 62: {
28: //(=1500 mikro-detik) pencacah melimpah 63: P1 = Ruas[0]; //mengatur Ruas puluhan jam
menjadi 0 (TF1=1) 64: P3 = 0xF7; //menghidupkan angka puluhan jam
29: TH1 = (-1500/256)-1; 65: TungguSebentar();
30: TL1 = (-1500%256); 66: P1 = Ruas[1]; //mengatur Ruas satuan jam
31: 67: P3 = 0xFB; //menghidupkan angka satuan jam
32: TF1 = 0; //Timer Flag 1 di-nol-kan 68: TungguSebentar();
33: TR1 = 1; //Timer 1 mulai men-cacah 69: P1 = Ruas[2]; //mengatur Ruas puluhan menit
34: while (!TF1); //Tunggu sampai TF1 menjadi 1 70: P3 = 0xFD; //menghidupkan angka puluhan
35: } menit
36:/*************************************** 71: TungguSebentar();
************************\ 72: P1 = Ruas[3]; //mengatur Ruas satuan menit
73: P3 = 0xFE; //menghidupkan angka satuan menit 101: if (!TombolJam) GantiJam(); //ditekan, rubah
74: TungguSebentar(); angka Jam
75: } 102: else
76: } 103: if (!TombolMenit) GantiMenit(); //ditekan,
77:// ****** Melakukan perubahan angka Jam rubah angka Menit
****** 104: }
78:void GantiJam (void){ 105:
79: Jam += 1; //Jam sebagai ‘count-up counter’ /*****************************************
80: if (Jam==24) Jam=0; //Kembalikan ke 00 jika *******************\
sampai jam 24 106: Rutin Layanan Interupsi (ISR) untuk Timer 0
81: PerbaruiTampilan(); 107: Terjadi sekali setiap 50 mili detik (20 kali/detik)
82: } 108:
83:// ****** Melakukan perubahan angka Menit \*****************************************
****** *******************/
84:void GantiMenit(void){ 109: void TimerInterrupt(void) interrupt 1 using 1 {
85: Menit += 1; //Menit sebagai ‘count-up counter’ 110: //Perbaharui dulu nilai awal Timer 0
86: if (Menit==60) { //jika sudah sampai menit 60 … 111: //th0:tl0 diisi dengan -50000,
87: Menit = 0; //kembalikan menjadi menit 00 112: //sebagai pencacah count-up 50000 pulsa
88: GantiJam(); } //saatnya merubah angka Jam kemudian
89: PerbaruiTampilan(); 113: //(=50000 mikro-detik) pencacah melimpah
90: } menjadi 0 (TF0=1)
91:// ****** Melakukan perubahan angka Detik 114: TH0 = (-50000/256)-1;
****** 115: TL0 = (-50000%256);
92:void GantiDetik(void){ 116:
93: Detik += 1; //Detik sebagai ‘count-up counter’ 117: Pencacah20 -= 1; //Pencacah20 sebagai ‘count-
94: if (Detik==60) { //jika Detik menjadi 60 .. down counter’
95: Detik = 0; //Kembalikan menjadi detik 00 118: if (!Pencacah20) { //jika Pencacah20 menjadi 0
96: GantiMenit(); } …
97: PerbaruiTampilan(); 119: Pencacah20 = 20; //nilai awal Pencacah20
98: } 120: PeriksaTombol();
99:// ****** Melakukan pemeriksaan tombol 121: GantiDetik(); }
****** 122: }
100: void PeriksaTombol (void){
Materi Penunjang
Sandeep Dutta SDCC 2.3.0 (Small Device C Compiler) – for 8051/Z80 based MCUs
Budhy Sutanto