26 Februari 2013

Rooting hTC Desire VC (ICS+SenseUI 4)




1. Unlock Bootloader di htcdev.com (HTC Desire VC belum masuk list, pilih aja list terakhit: All Other Supported Models. Trus ikuti stepnya gan & abaikan warning)
2. Install CWM versi China (versi resmi/english belum keluar gan). Caranya:
- Download vc-recovery-cn.exe di sini (copy link, hapus tanda *)
- Instal HTC Sync (Gugling aja gan)
- Boot recovery (phone off, copot baterai & insert lagi, tekan vol.down + power).
- Pilih 'fastboot' & tekan tombol power
- Jalankan/run vc-recovery-cn.exe
- Done!
3. Root :
- Download CWM-SuperSU-v0.94.zip dihttp://download.chainfire.eu/204/SuperSU/CWM-SuperSU-v0.94.zip?retrieve_file=1
- Copy file tersebut ke SD Card
- Boot recovery (phone off, copot baterai & insert lagi, tekan vol.down + power).
- Pilih 'recovery' & tekan tombol power (maka agan langsung masuk Clockwordmod mode)
- Pilih & jalankan 'instal ZIP from SD Card' pada CWM-SuperSU-v0.94.zip tadi (cara & translatenya sperti biasanya gan, atau coba cari di forum)
- Reboot
- Update SU Binary
- Done! now you're rooted 

Catatan: Rooted berarti hilangnya garansi.
DWYOR (Do With Your Own Risk) !!!


View the original article here

Organisasi Memori

Semua divais 8051 mempunyai ruang alamat yang terpisah untuk memori program dan memori data, seperti yang ditunjukkan pada gambar1.1. dan gambar 1.2. Pemisahan secara logika dari memori program dan data, mengijinkan memori data untuk diakses dengan pengalamatan 8 bit, yang dengan cepat dapat disimpan dan dimanipulasi dengan CPU 8 bit. Selain itu, pengalamatan memori data 16 bit dapat juga dibangkitkan melalui register DPTR. Memori program ( ROM, EPROM dan FLASH ) hanya dapat dibaca, tidak ditulis. Memori program dapat mencapai sampai 64K byte. Pada 89S51, 4K byte memori program terdapat didalam chip. Untuk membaca memori program eksternal mikrokontroller mengirim sinyal PSEN ( program store enable )
Gambar 1.1. Diagram blok mikrokontroller 8051Memori data ( RAM ) menempati ruang alamat yang terpisah dari memori program. Pada keluarga 8051, 128 byte terendah dari memori data, berada didalam chip. RAM eksternal (maksimal 64K byte). Dalam pengaksesan RAM Eksternal, mikrokontroller mingirimkan sinyal RD ( baca ) dan WR ( tulis ).
Gambar 1.2. Arsitektur Memori Mikrokontroller 80511.1.1. Program Memory
Gambar 1.2. menunjukkan suatu peta bagian bawah dari memori program. Setelah reset CPU mulai melakukan eksekusi dari lokasi 0000H. Sebagaimana yang ditunjukkan pada gambar 1.3, setiap interupsi ditempatkan pada suatu lokasi tertentu pada memori program. Interupsi menyebabkan CPU untuk melompat ke lokasi dimana harus dilakukan suatu layanan tertentu.
Interupsi Eksternal 0, sebagi contoh, menempatai lokasi 0003H. Jika Interupsi Eksternal 0 akan digunakan, maka layanan rutin harus dimulai pada lokasi 0003H. Jika interupsi ini tidak digunakan, lokasi layanan ini dapat digunakan untuk berbagai keperluan sebagai Memori Program.Gambar 1.3. Peta Interupsi mikrokontroller 8051
1.1.2 Memory Data
Pada gambar 1.2. menunjukkan ruang memori data internal dan eksternal pada keluarga 8051. CPU membangkitkan sinyal RD dan WR yang diperlukan selama akses RAM eksternal. Memori data internal terpetakan seperti pada gambar 1.2. Ruang memori dibagi menjadi tiga blok, yang diacukan sebagai 128 byte lower, 128 byte upper dan ruang SFR.
Alamat memori data internal selalu mempunyai lebar data satu byte. Pengalamatan langsung diatas 7Fh akan mengakses satu alamat memori, dan pengalamatan tak langsung diatas 7Fh akan mengakses satu alamat yang berbeda. Demikianlah pada gambar 1.4 menunjukkan 128 byte bagian atas dan ruang SFR menempati blok alamat yang sama, yaitu 80h sampai dengan FFh, yang sebenarnya mereka terpisah secara fisik
128 byte RAM bagian bawah dikelompokkan lagi menjadi beberapa blok, seperti yang ditunjukkan pada gambar 1.5. 32 byte RAM paling bawah, dikelompokkan menjadi 4 bank yang masing-masing terdiri dari 8 register. Instruksi program untuk memanggil register-register ini dinamai sebagai R0 sampai dengan R7. Dua bit pada Program Status Word (PSW) dapat memilih register bank mana yang akan digunakan. Penggunaan register R0 sampai dengan R7 ini akan membuat pemrograman lebih efisien dan singkat, bila dibandingkan pengalamatan secara langsung.Gambar 1.4. Memori data internalGambar 1.5. RAM internal 128 byte paling bawahSemua pada lokasi RAM 128 byte paling bawah dapat diakses baik dengan menggunakan pengalamatan langsung dan tak langsung. 128 byte paling atas hanya dapat diakses dengan cara tak langsung, gambar 1.6.Gambar 1.6. RAM internal 128 byte paling atas1.1.3. Special Function Register
Sebuah peta memori yang disebut ruang special function register ( SFR ) ditunjukkan pada gambar berikut. Perhatikan bahwa tidak semua alamat-alamat tersebut ditempati, dan alamat-alamat yang tak ditempati tidak diperkenankan untuk diimplementasikan. Akses baca untuk alamat ini akan menghasilkan data random, dan akses tulis akan menghasilkan efek yang tak jelas.
Accumulator
ACC adalah register akumulator. Mnemonik untuk instruksi spesifik akumulator ini secara sederhana dapat disingkat sebagai A.
Register B
Register B digunakan pada saat opersi perkalian dan pembagian. Selain untuk keperluan tersebut diatas, register ini dapat digunakan untuk register bebas.
Program Status Word
Register PSW terdiri dari informasi status dari program yang secara detail ditunjukkan pada Tabel 1.1.
Stack Pointer
Register Pointer stack mempunyai lebar data 8 bit. Register ini akan bertambah sebelum data disimpan selama eksekusi push dan call. Sementara stack dapat berada disembarang tempat RAM. Pointer stack diawali di alamat 07h setelah reset. Hal ini menyebabkan stack untuk memulai pada lokasi 08h.
Data Pointer
Pointer Data (DPTR) terdiri dari byte atas (DPH) dan byte bawah (DPL). Fungsi ini ditujukan untuk menyimpan data 16 bit. Dapat dimanipulasi sebagai register 16 bit atau dua 8 bit register yang berdiri sendiri. P0, P1, P2 dan P3 adalah SFR yang ditempati oleh Port 0, 1, 2 dan 3. Menulis suatu logika 1 terhadap sebuah bit dari sebuah port SFR ( P0, P1, P2 atau P3) menyebabkan pin output port yang bersesesuaian akan berada dalam kondisi logika high ‘1’. Dan sebaliknyaBuffer Data Serial
Buffer serial sesungguhnya merupakan dua buah register yang terpisah, buffer pemancar dan buffer penerima. Ketika data diisikan ke SBUF, maka akan menuju ke buffer pemancar dan ditahan untuk proses transmisi. Ketika data diambil dari SBUF, maka akan berasal dari buffer penerima.Registers Timer
Pasangan register ( TH0, TL0) dan (TH1, TL1) adalah register pencacah 16 bit untuk Timer/ Counter 0 dan 1, masing-masing.Register Control
Registers IP, IE, TMOD, TCON, SCON, dan PCON terdiri dari bit control dan status. Program Status Word
PSW atau Program Status Word berisi bit-bit status yang berkaitan dengan kondisi atau keadaan CPU mikrokontroler pada saat tersebut. PSW berada dalam lokasi ruang SFR ( perhatikan pada gambar 1.9, dengan lokasi alamat D0h ). Pada PSW ini kita dapat memantau beberapa status yang meliputi: carry bit, auxiliary carry ( untuk operasi BCD ), dua bit pemilih bank register, flag overflow, sebuah bit paritas dan dua flag status yang bisa didifinisikan sendiri. Bit carry dapat juga anda guakan pada keperluan operasi aritmatika, juga bisa digunakan sebagai universal akumulator untuk beberapa operasi boolean.Table 1.2.1 Program Status WordAuxilliary Carry flag. (For BCD operations.)Flag 0. (Available to the user for general purposes.)Register bank select control bit 1.
Set/cleared by software to determine working register bank. (See Note.)Register bank select control bit 0.
Set/cleared by software todetermine working register bank. (See Note.)Parity flag.
Set/cleared by hardware each instruction cycle to indicate an odd/even number of “one” bits in the Accumulator, i.e., even parity.Bit RS0 dan RS1 dapat digunakan untuk memilih satu dari empat bank register sebagaimana ditunjukkan pada tabel 19.2. Bit paritas dapat digunakan untuk mengetahuai jumlah logika '1' pada akumulator: P=1 bila pada akumulator mempunyai logika '1' yang jumlahnya ganjil, dan P=0 jika akumulator mempunyai logika '1' yang jumlahnya genap. Dua bit yang lain PSW1 dan PSW5 dapat digunakan untuk berbagai macam tujuan
Tabel 1. 2. Alamat rekening bank

View the original article here

Program Output Paralel AT89x52 menggunakan BASCOM

Mikrokontroler AT89S52 memiliki 4 buah port paralel, yaitu PO, P1, P2, dan P3. Kita menggunakan 8 buah LED yang dihubungkan secara paralel.Untuk lebih jelasnya lihat gambar di bawah! $regfile = "8052.dat"$crystal = 12000000Dim n As Byte, x as byte‘$simFor n = 1 to 4Pl = &h01 Waitms 10 Pl = &h02Waitms 10Pl = &h04Waitms 10Pl = &h08Waitms 10Pl = &h10Waitms 10Pl = &h20Waitms 10Pl = &h40Waitms 10Pl = &h80Waitms 10NextFor x=l to 4Pl=1Waitms 10For n =1 to 8SHIFT Pl, LEFT,1 Waitms 10NEXTNext Penjelasan program di atas sebagai berikut:$regfile = “8052.dat”$crystal = 12000000Pernyataan di atas disebut compiler directive (pengarah kompiler), yang berarti memberitahu ke kompiler bahwa mikrokontroler yang digunakan adalah AT89S52. Anda dapat menggantinya sesuai dengan yang Anda gunakan Frekuensi crystal yang Anda gunakan adalah 12MHz.Dim n As Byte , x As BytePernyataan ini merupakan pendeklarasian variabel n danPl = &h01 Waitms 10 Pl =&h02 Waitms 10Pernyataan yang digunakan untuk mengeluarkan data Port 1, kemudian ditunda selama 10 ms dan mengeluarkan data selanjutnya, sehingga kita akan mendapatkan efek LED yang bergeser dari kiri ke kanan.For n =1 to 8
SHIFT Pl, LEFT,1 Waitms 10
NEXTUntuk menggeser LED ke kiri atau ke kanan selain menggunakan perintah secara langsung, kita bisa pula menggunakan rutin yang telah disediakan oleh BASCOM yaitu SHIFT Pl, Left, 1.Perintah berarti menggeser data F ke arah kiri (dari LSB ke MSB) satu kali. Dalam prograrr agar LED terlihat bergeser, maka perintah diulasebanyak 8 kali menggunakan perintah For…Next. Untul-menggeser data ke arah kanan, kita cukup mengganti Left: menjadi Right.

View the original article here

Jam Digital dengan Alarm

Gamabar Rangkaian dengan simulator Proteus :


Source Code *asm; *** File Name: CLOCK.ASM; *** Project: Programmable Digital Clock with Alarm; *** Author: Suparno, M.Pd; *** Date: 26/03/2011; *** Processor: Atmel AT89C51 Microcontroller (Compatible With MCS-51); *** Timekeeper: DS1307 I2C Serial Timekeeper IC; *** Display: 16 characters x 2 lines LCD;**************************************************************; LCD ConnectionsLCD DATA P2 ; define LCD data port on port 1Busy BIT LCD.7 ; define LCD busy flagEN BIT P3.5 ; define LCD enable pin on port 2.2RW BIT P3.6 ; define LCD register select pin on port 2.0RS BIT P3.7 ; define LCD read/write pin on port 2.1;**************************************************************; KEYSUP BIT P1.3DN BIT P1.2Rel_Set BIT P3.4T_Set BIT P3.2A_Set BIT P3.3;**************************************************************Rel_Out BIT P1.4;**************************************************************; I2C ConnectionsSCL BIT P1.0 ; I2C serial clock lineSDA BIT P1.1 ; I2C serial data line;**************************************************************; Slave AddressSAW EQU 0D0H ; Slave address for write (DS1307)SAR EQU 0D1H ; Slave address for read (DS1307);**************************************************************BitCnt DATA 20H ; BIT COUNTER FOR I2C ROUTINESSec DATA 21H ; SECONDS STORAGE RAMMin DATA 22H ; MINUTES STORAGE RAMHour DATA 23H ; HOURS STORAGE RAMDay DATA 24H ; DAY STORAGE RAMDate DATA 25H ; DATE STORAGE RAMMonth DATA 26H ; MONTH STORAGE RAMYear DATA 27H ; YEAR STORAGE RAMSQW DATA 28H ; SQUARE-WAVE CONTROLAL_Hour DATA 29H ; ALARM HOURS STORAGE RAM SPACEAL_Min DATA 2AH ; ALARM MINUTES STORAGE RAM SPACERel_H DATA 2BH ; RELAY HOURS STORAGE RAM SPACE (FOR ON)Rel_M DATA 2CH ; RELAY MINUTES STORAGE RAM SPACE (FOR ON)RH_Off DATA 2DH ; RELAY HOURS STORAGE RAM SPACE (FOR OFF)RM_Off DATA 2EH ; RELAY MINUTES STORAGE RAM SPACE (FOR OFF)Flags DATA 2FH ; FLAGSAL_Flag BIT Flags.0 ; ALARM FLAGRL_Flag BIT Flags.1 ; RELAY TIMER FLAGRL_On BIT FlagS.2;**************************************************************; ***MACRO'S***I2C_Delay MACRO NOP ENDM;--------------------------------------------------------------SCLHigh MACRO SETB SCL JNB SCL,$ ENDM;--------------------------------------------------------------D_Str MACRO ACALL Command LCALL Disp_Char ENDM;--------------------------------------------------------------CLR_LCD MACRO MOV A,#01H ACALL Command ENDM;**************************************************************ORG 0000H;-------------------------------------------------------------- CLR AL_Flag CLR RL_Flag CLR RL_On MOV SP,#2FH MOV SQW,#80H ACALL SQW_W ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#3FH ACALL I2C_Write ACALL I2C_Start MOV A,#SAR ACALL I2C_Write ACALL I2C_Read_Last ACALL I2C_Stop CJNE A,#'~',INIT LJMP LCD_I;--------------------------------------------------------------INIT: ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#3FH ACALL I2C_Write MOV A,#'~' ACALL I2C_Write MOV A,#00H ACALL I2C_Write ACALL I2C_Stop SJMP LCD_I;--------------------------------------------------------------RTC_Reset: MOV R0,#21H MOV R6,#07H ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#00H ACALL I2C_WriteLoop1: MOV A,@R0 ACALL I2C_Write INC R0 DJNZ R6,Loop1 ACALL I2C_Stop RET;--------------------------------------------------------------AL_Off: CLR AL_Flag MOV SQW,#80H ACALL SQW_W CLR_LCD MOV A,#84H D_Str DB 'Alarm Off!',0 MOV A,#82H ACALL Command MOV A,#01H ACALL Data_Disp ACALL Delay ACALL RL_Logo SJMP Main;--------------------------------------------------------------Alarm_Set: JB AL_Flag,AL_Off CLR_LCD MOV A,#84H D_Str DB 'Set Alarm',0 MOV A,#82H ACALL Command MOV A,#01H ACALL Data_Disp ACALL Delay AJMP AH;--------------------------------------------------------------LCD_I: ACALL LCD_Initial ACALL CGR;--------------------------------------------------------------Main: ACALL Disp_CStart: ACALL Key_ScanBack1: MOV R0,#21H MOV R1,#0DH ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#00H ACALL I2C_Write ACALL I2C_Start MOV A,#SAR ACALL I2C_WriteLoop: ACALL I2C_Read DJNZ R1,Loop ACALL I2C_Read_Last ACALL I2C_Stop ACALL Display ACALL Alarm_Check ACALL Relay_Check SJMP Start;--------------------------------------------------------------Key_Scan: JNB T_Set,Jump1 JNB A_Set,Alarm_Set JNB Rel_Set,Jump2 RET;--------------------------------------------------------------Jump1: LJMP Time_SetJump2: SJMP Relay_Set;--------------------------------------------------------------Alarm_Check: JNB AL_Flag,CH MOV A,AL_Min CJNE A,Min,Alarm_Off MOV A,AL_Hour CJNE A,Hour,Alarm_Off ACALL Alarm_OnCH: RET;--------------------------------------------------------------Alarm_Off: MOV SQW,#80H ACALL SQW_W RET;--------------------------------------------------------------RL_Off: CLR RL_Flag SETB Rel_Out CLR RL_On CLR_LCD MOV A,#84H D_Str DB 'Relay Off!',0 MOV A,#82H ACALL Command MOV A,#00H ACALL Data_Disp ACALL Delay ACALL AL_Logo SJMP Main;--------------------------------------------------------------SQW_W: ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#07H ACALL I2C_Write MOV A,SQW ACALL I2C_Write ACALL I2C_Stop RET;--------------------------------------------------------------Alarm_On: MOV SQW,#10H ACALL SQW_W RET;--------------------------------------------------------------Relay_Check: JNB RL_Flag,CH1 JB RL_On,Rel_Off MOV A,Rel_M CJNE A,Min,Relay_Off MOV A,Rel_H CJNE A,Hour,Relay_Off SETB RL_On ACALL Relay_OnCH1: RET;--------------------------------------------------------------Relay_Off: SETB Rel_Out RET;--------------------------------------------------------------Relay_On: CLR Rel_Out RET;--------------------------------------------------------------Relay_Set: JB RL_Flag,RL_Off LJMP R_Set;--------------------------------------------------------------Rel_Off:MOV A,RM_Off CJNE A,Min,Relay_On MOV A,RH_Off CJNE A,Hour,Relay_On CLR RL_On ACALL Relay_OffCH2: RET;--------------------------------------------------------------Time_Set: CLR_LCD MOV A,#83H D_Str DB 'Set Hours:',0 MOV A,#0C7H ACALL Command MOV A,Hour MOV R7,A ACALL Disp_BCD JNB T_Set,$I24: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKS24: JNB UP,Inc_Hour JNB DN,Dec_Hour JNB T_Set,Done_H SJMP KS24Inc_Hour: NOP ACALL BCD_2_Hex INC A CJNE A,#18H,SH MOV A,#00HSH: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP I24Dec_Hour: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,SH MOV A,#17H SJMP SHDone_H: JNB T_Set,$ MOV Hour,R7;--------------------------------------------------------------Mint: CLR_LCD MOV A,#82H D_Str DB 'Set Minutes:',0 MOV A,#0C7H ACALL Command MOV A,Min MOV R7,A ACALL Disp_BCD JNB T_Set,$M1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKSMIN: JNB UP,Inc_Min JNB DN,Dec_Min JNB T_Set,DoneMin SJMP KSMINInc_Min:NOP ACALL BCD_2_Hex INC A CJNE A,#3CH,SMin MOV A,#00HSMin: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP M1Dec_Min:NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,SMin MOV A,#3BH SJMP SMinDoneMin:JNB T_Set,$ MOV Min,R7;-------------------------------------------------------------- CLR_LCD MOV A,#83H D_Str DB 'Set Days:',0 MOV A,#0C5H D_Str DB '* *',0 MOV A,#0C6H ACALL Command MOV A,Day PUSH ACC LCALL W_Day POP ACC JNB T_Set,$D1: PUSH ACC MOV A,#0C6H ACALL Command POP ACCKSDAY: JNB UP,Inc_Day JNB DN,Dec_Day JNB T_Set,DoneDay SJMP KSDAYInc_Day:NOP INC A CJNE A,#08H,SDay MOV A,#01HSDay: PUSH ACC LCALL W_Day POP ACC JNB UP,$ JNB DN,$ SJMP D1Dec_Day:NOP DEC A CJNE A,#00H,SDay MOV A,#07H SJMP SDayDoneDay:JNB T_Set,$ MOV Day,A;-------------------------------------------------------------- CLR_LCD MOV A,#83H D_Str DB 'Set Date:',0 MOV A,#0C7H ACALL Command MOV A,Date MOV R7,A ACALL Disp_BCD JNB T_Set,$DA1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKSDAT: JNB UP,Inc_DAT JNB DN,Dec_DAT JNB T_Set,DoneDAT SJMP KSDATInc_DAT:NOP ACALL BCD_2_Hex INC A CJNE A,#20H,SDAT MOV A,#01HSDAT: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP DA1Dec_DAT:NOP ACALL BCD_2_Hex DEC A CJNE A,#00H,SDAT MOV A,#1FH SJMP SDATDoneDAT:JNB T_Set,$ MOV Date,R7;-------------------------------------------------------------- CLR_LCD MOV A,#83H D_Str DB 'Set Month:',0 MOV A,#0C7H ACALL Command MOV A,Month MOV R7,A ACALL Disp_BCD JNB T_Set,$MM1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKSMON: JNB UP,Inc_MON JNB DN,Dec_MON JNB T_Set,DoneMON SJMP KSMONInc_MON:NOP ACALL BCD_2_Hex INC A CJNE A,#0DH,SMON MOV A,#01HSMON: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP MM1Dec_MON:NOP ACALL BCD_2_Hex DEC A CJNE A,#00H,SMON MOV A,#0CH SJMP SMONDoneMON:JNB T_Set,$ MOV Month,R7;-------------------------------------------------------------- CLR_LCD MOV A,#83H D_Str DB 'Set Year:',0 MOV A,#0C6H D_Str DB '20',0 MOV A,#0C8H ACALL Command MOV A,Year MOV R7,A ACALL Disp_BCD JNB T_Set,$YY1: PUSH ACC MOV A,#0C8H ACALL Command POP ACCKSYY: JNB UP,Inc_YY JNB DN,Dec_YY JNB T_Set,DoneYY SJMP KSYYInc_YY: NOP ACALL BCD_2_Hex INC A CJNE A,#64H,SYY MOV A,#00HSYY: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP YY1Dec_YY: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,SYY MOV A,#63H SJMP SYYDoneYY: JNB T_Set,$ MOV Year,R7 MOV Sec,#00H ACALL RTC_Reset ACALL Done ACALL Disp_C ACALL RL_Logo ACALL AL_Logo LJMP Main;--------------------------------------------------------------Done: CLR_LCD MOV A,#86H D_Str DB 'Done!',0 ACALL Delay RET;--------------------------------------------------------------Delay: MOV R2,#0FFH MOV R3,#14HLP3: MOV R2,#0FFHLP2: MOV R5,#0FFHLP1: DJNZ R5,LP1 DJNZ R2,LP2 DJNZ R3,LP3 RET;--------------------------------------------------------------AH: CLR_LCD MOV A,#83H D_Str DB 'Set Hours:',0 MOV A,#0C7H ACALL Command MOV A,AL_Hour MOV R7,A ACALL Disp_BCDALH1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCALH2: JNB UP,Inc_AL_Hour JNB DN,Dec_AL_Hour JNB A_Set,DoneALH SJMP ALH2Inc_AL_Hour: NOP ACALL BCD_2_Hex INC A CJNE A,#18H,Z_AL_H MOV A,#00HZ_AL_H: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP ALH1Dec_AL_Hour: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,Z_AL_H MOV A,#17H SJMP Z_AL_HDoneALH:JNB A_Set,$ MOV AL_Hour,R7 CLR_LCD MOV A,#82H D_Str DB 'Set Minutes:',0 MOV A,#0C7H ACALL Command MOV A,AL_Min MOV R7,A ACALL Disp_BCD JNB A_Set,$ALM1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCALM2: JNB UP,Inc_AL_Min JNB DN,Dec_AL_Min JNB A_Set,DoneAL_Min SJMP ALM2Inc_AL_Min: NOP ACALL BCD_2_Hex INC A CJNE A,#3CH,SAL_Min MOV A,#00HSAL_Min:ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP ALM1Dec_AL_Min: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,SAL_Min MOV A,#3BH SJMP SAL_MinDoneAL_Min: JNB A_Set,$ MOV AL_Min,R7 SETB AL_Flag ACALL ALT_Done ACALL Done ACALL RL_Logo ACALL AL_Logo LJMP Main;--------------------------------------------------------------R_Set: CLR_LCD MOV A,#81H D_Str DB ' Set Timer(ON)',0 MOV A,#80H ACALL Command MOV A,#00H ACALL Data_Disp ACALL Delay CLR_LCD MOV A,#83H D_Str DB 'Set Hours:',0 MOV A,#0C7H ACALL Command MOV A,Rel_H MOV R7,A ACALL Disp_BCD JNB Rel_Set,$RTH1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKHREL: JNB UP,Inc_Rel_H JNB DN,Dec_Rel_H JNB Rel_Set,DoneRel_H SJMP KHRELInc_Rel_H: NOP ACALL BCD_2_Hex INC A CJNE A,#18H,HRel MOV A,#00HHRel: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP RTH1Dec_Rel_H: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,HRel MOV A,#17H SJMP HRelDoneRel_H: JNB Rel_Set,$ MOV Rel_H,R7 CLR_LCD MOV A,#82H D_Str DB 'Set Minutes:',0 MOV A,#0C7H ACALL Command MOV A,Rel_M MOV R7,A ACALL Disp_BCD JNB Rel_Set,$RTM1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKMREL: JNB UP,Inc_Rel_M JNB DN,Dec_Rel_M JNB Rel_Set,DoneRel_M SJMP KMRELInc_Rel_M: NOP ACALL BCD_2_Hex INC A CJNE A,#3CH,MRel MOV A,#00HMRel: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP RTM1Dec_Rel_M: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,MRel MOV A,#3BH SJMP MRelDoneRel_M: JNB Rel_Set,$ MOV Rel_M,R7Off: CLR_LCD MOV A,#81H D_Str DB ' Set Timer(OFF)',0 MOV A,#80H ACALL Command MOV A,#00H ACALL Data_Disp ACALL Delay CLR_LCD MOV A,#83H D_Str DB 'Set Hours:',0 MOV A,#0C7H ACALL Command MOV A,RH_Off MOV R7,A ACALL Disp_BCD JNB Rel_Set,$RTHF1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKHFREL: JNB UP,Inc_Rel_HF JNB DN,Dec_Rel_HF JNB Rel_Set,DoneRel_HF SJMP KHFRELInc_Rel_HF: NOP ACALL BCD_2_Hex INC A CJNE A,#18H,HFRel MOV A,#00HHFRel: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP RTHF1Dec_Rel_HF: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,HFRel MOV A,#17H SJMP HFRelDoneRel_HF: JNB Rel_Set,$ MOV RH_Off,R7 CLR_LCD MOV A,#82H D_Str DB 'Set Minutes:',0 MOV A,#0C7H ACALL Command MOV A,RM_Off MOV R7,A ACALL Disp_BCD JNB Rel_Set,$RFTM1: PUSH ACC MOV A,#0C7H ACALL Command POP ACCKFMREL: JNB UP,Inc_Rel_MF JNB DN,Dec_Rel_MF JNB Rel_Set,DoneRel_MF SJMP KFMRELInc_Rel_MF: NOP ACALL BCD_2_Hex INC A CJNE A,#3CH,MFRel MOV A,#00HMFRel: ACALL Hex_2_BCD ACALL Disp_BCD JNB UP,$ JNB DN,$ SJMP RFTM1Dec_Rel_MF: NOP ACALL BCD_2_Hex DEC A CJNE A,#00H-1,MFRel MOV A,#3BH SJMP MFRelDoneRel_MF: JNB Rel_Set,$ MOV RM_Off,R7 SETB RL_Flag ACALL ALT_Done ACALL Done ACALL RL_Logo ACALL AL_Logo LJMP Main;--------------------------------------------------------------RL_Logo:JNB RL_Flag,WE1 MOV A,#0CDH ACALL Command MOV A,#00H ACALL Data_DispWE1: RET;--------------------------------------------------------------AL_Logo:JNB AL_Flag,WE2 MOV A,#0C2H ACALL Command MOV A,#01H ACALL Data_DispWE2: RET;--------------------------------------------------------------ALT_Done: MOV R1,#29H MOV R3,#07H ACALL I2C_Start MOV A,#SAW ACALL I2C_Write MOV A,#08H ACALL I2C_WriteLOOP4: MOV A,@R1 ACALL I2C_Write INC R1 DJNZ R3,LOOP4 ACALL I2C_Stop RET;--------------------------------------------------------------LCD_Initial: MOV A,#38H ACALL Command MOV A,#0CH ACALL Command CLR_LCD MOV A,#06H ACALL Command RET;--------------------------------------------------------------Display:MOV R1,#21H MOV A,#0CAH ACALL Command MOV A,@R1 ACALL Disp_BCD; INC R1 MOV A,#0C7H ACALL Command MOV A,@R1 ACALL Disp_BCD; INC R1 MOV A,#0C4H ACALL Command MOV A,@R1 ACALL Disp_BCD; INC R1 MOV A,#80H ACALL Command MOV A,@R1 LCALL W_Day; INC R1 MOV A,#86H ACALL Command MOV A,@R1 ACALL Disp_BCD; INC R1 MOV A,#89H ACALL Command MOV A,@R1 ACALL Disp_BCD; INC R1 MOV A,#8EH ACALL Command MOV A,@R1 ACALL Disp_BCD RET;--------------------------------------------------------------Hex_2_BCD: MOV B,#00001010B DIV AB MOV R3,B MOV B,#00010000B MUL AB ADD A,R3 MOV R7,A RET;--------------------------------------------------------------BCD_2_Hex: MOV B,#00010000B DIV AB MOV R3,B MOV B,#00001010B MUL AB ADD A,R3 RET;--------------------------------------------------------------Disp_BCD: PUSH ACC MOV R5,A ANL A,#11110000B SWAP A MOV DPTR,#Ascii_Code MOVC A,@A+DPTR ACALL Data_Disp MOV A,R5 ANL A,#00001111B MOVC A,@A+DPTR ACALL Data_Disp POP ACC RET;--------------------------------------------------------------Disp_C: MOV A,#80H D_Str DB ' / /20 ',0 MOV A,#0C0H ACALL Command MOV A,#'*' ACALL Data_Disp MOV A,#0C6H ACALL Command MOV A,#':' ACALL Data_Disp MOV A,#0C9H ACALL Command MOV A,#':' ACALL Data_Disp MOV A,#0CFH ACALL Command MOV A,#'*' ACALL Data_Disp RET;--------------------------------------------------------------CGR: MOV R4,#08H MOV R5,#40H MOV DPTR,#Clock ACALL WRI MOV R4,#08H MOV R5,#48H MOV DPTR,#Bell ACALL WRI RET;--------------------------------------------------------------WRI: CLR A ACALL Get_Ready MOV LCD,R5 CLR RS CLR RW SETB EN CLR EN INC R5 MOVC A,@A+DPTR ACALL Data_Disp INC DPTR DJNZ R4,WRI RET;---------------------------------------;; ************I2C Commands************* ;;---------------------------------------;I2C_Start: SETB SCL SETB SDA I2C_Delay CLR SDA I2C_Delay CLR SCL RET;--------------------------------------------------------------I2C_Stop: CLR SDA SETB SCL I2C_Delay SETB SDA RET;--------------------------------------------------------------I2C_Write: MOV BitCnt,#08HI2C_Write_Loop: RLC A MOV SDA,C NOP SCLHigh CLR SCL DJNZ BitCnt,I2C_Write_Loop NOP SETB SDA NOP SETB SCL I2C_Delay MOV C,SDA CLR SCL NOP JNC Label ACALL I2C_Stop ACALL I2C_Start SJMP I2C_WriteLabel: RET;--------------------------------------------------------------I2C_Read_Dummy: SETB SDA CLR A MOV BitCnt,#08HI2C_Read_Loop: CLR SCL I2C_Delay SCLHigh MOV C,SDA RLC A DJNZ BitCnt,I2C_Read_Loop CLR SCL MOV @R0,A INC R0 RET;--------------------------------------------------------------I2C_Ack_Write: CLR SDA NOP SETB SCL I2C_Delay CLR SCL SETB SDA I2C_Delay RET;--------------------------------------------------------------I2C_Nack_Write: SETB SDA NOP SETB SCL I2C_Delay CLR SCL I2C_Delay RET;--------------------------------------------------------------I2C_Read: ACALL I2C_Read_Dummy ACALL I2C_Ack_Write RET;--------------------------------------------------------------I2C_Read_Last: ACALL I2C_Read_Dummy ACALL I2C_Nack_Write RET;--------------------------------------;; ************LCD CommandS*************;;--------------------------------------;Command:ACALL Get_Ready MOV LCD,A CLR RS CLR RW SETB EN CLR EN RET;--------------------------------------------------------------Data_Disp: ACALL Get_Ready MOV LCD,A SETB RS CLR RW SETB EN CLR EN RET;--------------------------------------------------------------Get_Ready: SETB Busy CLR RS SETB RWBack: CLR EN SETB EN JB Busy,BACK RET;--------------------------------------------------------------Disp_Char: POP DPH POP DPLPrint_Text: CLR A MOVC A,@A+DPTR CJNE A,#00H,Loop2 SJMP ReturnLoop2: MOV R4, A LCALL Data_Disp INC DPTR LJMP Print_TextReturn: MOV A,#01H JMP @A+DPTR;--------------------------------------------------------------W_Day: CJNE A,#01H,MON LCALL Disp_Char DB 'Sun',0 RETMON: CJNE A,#02H,TUE LCALL Disp_Char DB 'Mon',0 RETTUE: CJNE A,#03H,WED LCALL Disp_Char DB 'Tue',0 RETWED: CJNE A,#04H,THU LCALL Disp_Char DB 'Wed',0 RETTHU: CJNE A,#05H,FRI LCALL Disp_Char DB 'Thu',0 RETFRI: CJNE A,#06H,SAT LCALL Disp_Char DB 'Fri',0 RETSAT: CJNE A,#07H,WHAT LCALL Disp_Char DB 'Sat',0 RETWHAT: RET;--------------------------------------------------------------Ascii_Code: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;--------------------------------------------------------------;IconsClock: DB 00H,0EH,15H,17H,11H,0EH,00H,00HBell: DB 04H,0EH,0EH,0EH,1FH,00H,04H,00H;-------------------------------------------------------------- END

View the original article here

Timer Counter

Timer dan Counter merupakan sarana input yang kurang dapat perhatian pemakai mikrokontroler, dengan sarana input ini mikrokontroler dengan mudah bisa dipakai untuk mengukur lebar pulsa, membangkitkan pulsa dengan lebar yang pasti, dipakai dalam pengendalian tegangan secara PWM (Pulse Width Modulation) dan sangat diperlukan untuk aplikasi remote control dengan infra merah.
Pada dasarnya sarana input yang satu ini merupakan seperangkat pencacah biner (binary counter) yang terhubung langsung ke saluran-data mikrokontroler, sehingga mikrokontroler bisa membaca kedudukan pancacah, bila diperlukan mikrokontroler dapat pula merubah kedudukan pencacah tersebut.
Seperti layaknya pencacah biner, bilamana sinyal denyut (clock) yang diumpankan sudah melebihi kapasitas pencacah, maka pada bagian akhir untaian pencacah akan timbul sinyal limpahan, sinyal ini merupakan suatu hal yang penting sekali dalam pemakaian pencacah. Terjadinya limpahan pencacah ini dicatat dalam sebuah flip-flop tersendiri.
Di samping itu, sinyal denyut yang diumpankan ke pencacah harus pula bisa dikendalikan dengan mudah. Hal-hal yang dibicarakan di atas diringkas dalam Gambar 1.
MCS-51 mempunyai dua buah register timer/ counter 16 bit, yaitu Timer 0 dan Timer 1. Keduanya dapat dikonfigurasikan untuk beroperasi sebagai timer atau counter, seperti yang terlihat pada gambar di bawah. Gambar 1.9. Konsep dasar Timer/Counter sebagai sarana inputSinyal denyut yang diumpankan ke pencacah bisa dibedakan menjadi 2 macam, yang pertama yalah sinyal denyut dengan frekuensi tetap yang sudah diketahui besarnya dan yang kedua adalah sinyal denyut dengan frekuensi tidak tetap.
Jika sebuah pencacah bekerja dengan frekuensi tetap yang sudah diketahui besarnya, dikatakan pencacah tersebut bekerja sebagai timer, karena kedudukan pencacah tersebut setara dengan waktu yang bisa ditentukan dengan pasti.
Jika sebuah pencacah bekerja dengan frekuensi yang tidak tetap, dikatakan pencacah tersebut bekerja sebagai counter, kedudukan pencacah tersebut hanyalah menyatakan banyaknya pulsa yang sudah diterima pencacah.
Untaian pencacah biner yang dipakai, bisa merupakan pencacah biner menaik (count up binary counter) atau pencacah biner menurun (count down binary counter). 
1.5.1 Fasilitas Timer/Counter
Keluarga mikrokontroler MCS51, misalnya AT89C51 dan AT89Cx051, dilengkapi dengan dua perangkat Timer/Counter, masing-masing dinamakan sebagai Timer 0 dan Timer 1. Sedangkan untuk jenis yang lebih besar, misalnya AT89C52, mempunyai tambahan satu perangkat Timer/Counter lagi yang dinamakan sebagai Timer 2.
Perangkat Timer/Counter tersebut merupakan perangkat keras yang menjadi satu dalam chip mikrokontroler MCS51, bagi pemakai mikrokontroler MCS51 perangkat tersebut dikenal sebagai SFR (Special Function Register) yang berkedudukan sebagai memori-data internal.
Pencacah biner untuk Timer 0 dibentuk dengan register TL0 (Timer 0 Low Byte, memori-data internal nomor $6A) dan register TH0 (Timer 0 High Byte, memori-data internal nomor $6C).
Pencacah biner untuk Timer 1 dibentuk dengan register TL1 (Timer 1 Low Byte, memori-data internal nomor $6B) dan register TH1 (Timer 1 High Byte, memori-data internal nomor $6D).
Pencacah biner pembentuk Timer/Counter MCS51 merupakan pencacah biner menaik (count up binary counter) yang mencacah dari $0000 sampai $FFFF, saat kedudukan pencacah berubah dari $FFFF kembali ke $0000 akan timbul sinyal limpahan.
Untuk mengatur kerja Timer/Counter dipakai 2 register tambahan yang dipakai bersama oleh Timer 0 dan Timer 1. Register tambahan tersebut adalah register TCON (Timer Control Register, memori-data internal nomor $88, bisa dialamat secara bit) dan register TMOD (Timer Mode Register, memori-data internal nomor $89).
Pencacah biner Timer 0 dan 1
TL0, TH0, TL1 dan TH1 merupakan SFR (Special Function Register) yang dipakai untuk membentuk pencacah biner perangkat Timer 0 dan Timer 1. Kapasitas keempat register tersebut masing-masing 8 bit, bisa disusun menjadi 4 macam Mode pencacah biner seperti terlihat dalam Gambar 2a sampai Gambar 2d.
Pada Mode 0, Mode 1 dan Mode 2 Timer 0 dan Timer 1 masing-masing bekerja sendiri, artinya bisa dibuat Timer 0 bekerja pada Mode 1 dan Timer 1 bekerja pada Mode 2, atau kombinasi mode lainnya sesuai dengan keperluan.
Pada Mode 3 TL0, TH0, TL1 dan TH1 dipakai bersama-sama untuk menyusun sistem timer yang tidak bisa di-kombinasi lain.
Susunan TL0, TH0, TL1 dan TH1 pada masing-masing mode adalah sebagai berikut:Mode 0 – Pencacah Biner 13 bit Gambar 1.10 Mode 0 - Pencacah Biner 13 BitPencacah biner dibentuk dengan TLx (maksudnya bisa TL0 atau TL1) sebagai pencacah biner 5 bit (meskipun kapasitas sesungguhnya 8 bit), limpahan dari pencacah biner 5 bit ini dihubungkan ke THx (maksudnya bisa TH0 atau TH1) membentuk sebuah untaian pencacah biner 13 bit, limpahan dari pencacah 13 bit ini ditampung di flip-flop TFx (maksudnya bisa TF0 atau TF1) yang berada di dalam register TCON.
Mode ini meneruskan sarana Timer yang ada pada mikrokontroler MCS48 (mikrokontroler pendahulu MCS51), dengan maksud rancangan alat yang dibuat dengan MCS48 bisa dengan mudah diadaptasikan ke MCS51. Mode ini tidak banyak dipakai lagi.Mode 1 – Pencacah Biner 16 bit
Gambar 1.11 Mode 1 - Pencacah Biner 16 BitMode ini sama dengan Mode 0, hanya saja register TLx dipakai sepenuhnya sebagai pencacah biner 8 bit, sehingga kapasitas pencacah biner yang tersbentuk adalah 16 bit. Seiring dengan sinyal denyut, kedudukan pencacah biner 16 bit ini akan bergerak dari $0000 (biner 0000 0000 0000 0000), $0001, $0002 … sampai $FFFF (biner 1111 1111 1111 1111), kemudian melimpah kembali menjadi $0000.Mode 2 – Pencacah Biner 8 bit dengan Isi Ulang
Gambar 1.12 Mode 2 - Pencacah Biner 8 Bit dengan Isi UlangTLx dipakai sebagai pencacah biner 8 bit, sedangkan THx dipakai untuk menyimpan nilai yang diisikan ulang ke TLx, setiap kali kedudukan TLx melimpah (berubah dari $FF menjadi $00). Dengan cara ini bisa didapatkan sinyal limpahan yang frekuensinya ditentukan oleh nilai yang disimpan dalam TH0. Mode 3 – Gabungan Pencacah Biner 16 bit dan 8 Bit
Gambar 1.13 Mode 3 – Gabungan Pencacah Biner 16 Bit dan 8 BitPada Mode 3 TL0, TH0, TL1 dan TH1 dipakai untuk membentuk 3 untaian pencacah, yang pertama adalah untaian pencacah biner 16 bit tanpa fasiltas pemantau sinyal limpahan yang dibentuk dengan TL1 dan TH1. Yang kedua adalah TL0 yang dipakai sebagai pencacah biner 8 bit dengan TF0 sebagai sarana pemantau limpahan. Pencacah biner ketiga adalah TH0 yang dipakai sebagai pencacah biner 8 bit dengan TF1 sebagai sarana pemantau limpahan.
Register Pengatur Timer
Register TMOD dan register TCON merupakan register pembantu untuk mengatur kerja Timer 0 dan Timer 1, kedua register ini dipakai bersama oleh Timer 0 dan Timer 1.Gambar 1.14 Denah susunan bit dalam register TMODRegister TMOD dibagi menjadi 2 bagian secara simitris, bit 0 sampai 3 register TMOD (TMOD bit 0 .. TMOD bit 3) dipakai untuk mengatur Timer 0, bit 4 sampai 7 register TMODE (TMOD bit 4 .. TMOD bit 7) dipakai untuk mengatur Timer 1, pemakaiannya sebagai berikut :
1. Bit M0/M1 dipakai untuk menentukan Mode Timer seperti yang terlihat dalam Tabel di Gambar 3a.
2. Bit C/T* dipakai untuk mengatur sumber sinyal denyut yang diumpankan ke pencacah biner. Jika C/T*=0 sinyal denyut diperoleh dari osilator kristal yang frekuensinya sudah dibagi 12, sedangkan jika C/T*=1 maka sinyal denyut diperoleh dari kaki T0 (untuk Timer 0) atau kaki T1 (untuk Timer 1).
3. Bit GATE merupakan bit pengatur saluran sinyal denyut. Bila bit GATE=0 saluran sinyal denyut hanya diatur oleh bit TRx (maksudnya adalah TR0 atau TR1 pada register TCON). Bila bit GATE=1 kaki INT0 (untuk Timer 0) atau kaki INT1 (untuk Timer 1) dipakai juga untuk mengatur saluran sinyal denyut (lihat Gambar 4).
Gambar 1.15 Denah susunan bit dalam register TCONRegister TCON dibagi menjadi 2 bagian, 4 bit pertama (bit 0 .. bit 3, bagian yang diarsir dalam Gambar 3b) dipakai untuk keperluan mengatur kaki INT0 dan INT1, ke-empat bit ini dibahas dibagian lain.Timer 1 overflow flag. Set by hardware on Timer/Counter overflow. Cleared by hardware when processor vector to interrupt routine, or clearing the bit in software.Timer 1 Run control bit . Set/ cleared by software to turn Timer/ Counter on/offTimer 0 overflow flag. Set by hardware on Timer/Counter overflow. Cleared by hardware when processor vector to interrupt routine, or clearing the bit in software.Timer 1 Run control bit . Set/ cleared by software to turn Timer/ Counter on/offInterrupt 1 Edge flag. Set by hardware when external interrupt edge detected. Cleared when interrupt processed.Interrupt 1 type control bit. Set/ cleared by software to specefy falling edge/ low level trigerred external interuptsInterrupt 0 Edge flag. Set by hardware when external interrupt edge detected. Cleared when interrupt processed.Interrupt 0 type control bit. Set/ cleared by software to specefy falling edge/ low level trigerred external interuptsSisa 4 bit dari register TCON (bit 4..bit 7) dibagi menjadi 2 bagian secara simitris yang dipakai untuk mengatur Timer0/Timer 1, sebagai berikut:
1. Bit TFx (maksudnya adalah TF0 atau TF1) merupakan bit penampung limpahan (lihat Gambar 2), TFx akan menjadi ‘1’ setiap kali pencacah biner yang terhubung padanya melimpah (kedudukan pencacah berubah dari $FFFF kembali menjadi $0000). Bit TFx di-nol-kan dengan istruksi CLR TF0 atau CLR TF1. Jika sarana interupsi dari Timer 0/Timer 1 dipakai, TRx di-nol-kan saat MCS51 menjalankan rutin layanan interupsi (ISR – Interupt Service Routine).
2. Bit TRx (maksudnya adalah TR0 atau TR1) merupakan bit pengatur saluran sinyal denyut, bila bit ini =0 sinyal denyut tidak disalurkan ke pencacah biner sehingga pencacah berhenti mencacah. Bila bit GATE pada register TMOD =1, maka saluran sinyal denyut ini diatur bersama oleh TRx dan sinyal pada kaki INT0/INT1 (lihat Gambar 4).
Gambar 4 merupakan bagan susunan rangkaian yang bisa terjadi pada Timer 1 secara lengkap, digambarkan pula hubungan-hubungan semua register pembentuk dan pengatur Timer 1. Gambar ini berlaku pula untuk Timer 0.
Dalam pemakaian sesungguhnya, rangkaian yang dipakai hanya sebagian dari rangkaian lengkap tersebut, sesuai dengan keperluan sistem yang dibangun. Rangkaian yang dikehendaki dibentuk dengan mengatur register TMODE, sedangkan kerja dari Timer dikendalikan lewat register TCON.Gambar 1.16. Diagram blok timer/ counter 
Setelah MCS51 di-reset register TMOD bernilai $00, hal ini berarti :1. bit C/T* =’0’, menurut Gambar 4 keadaan ini membuat saklar S1 ke posisi atas, sumber sinyal denyut berasal dari osilator kristal yang frekuensinya sudah dibagi 12, pencacah biner yang dibentuk dengan TL1 dan TH1 berfungsi sebagai timer. Jika sistem yang dirancang memang menghendaki Timer 1 bekerja sebagai timer maka bit C/T* tidak perlu diatur lagi.
Tapi jika sistem yang dirancang menghendaki agar Timer 1 bekerja sebagai counter untuk menghitung pulsa yang masuk lewat kakai T1 (P3.5), maka posisi saklar S1 harus dikebawahkan dengan membuat bit C/T* menjadi ‘1’.
2. bit GATE=’0’, hal ini membuat output gerbang OR selalu ‘1’ tidak dipengaruhi keadaan ‘0’ atau ‘1’ pada kaki INT1 (P3.3). Dalam keadaan semacam ini, saklar S2 hanya dikendalikan lewat bit TR1 dalam register TCON. Jika TR1=’1’ saklar S2 tertutup sehingga sinyal denyut dari S1 disalurkan ke sistem pencacah biner, aliran sinyal denyut akan dihentikan jika TR=’0’.
Sebaliknya jika bit GATE=’1’, output gerbang OR akan mengikuti keadaan kaki INT1, saat INT1=’0’ apa pun keadaan bit TR1 output gerbang AND selalu =’0’ dan saklar S1 selalu terbuka, agar saklar S1 bisa tertutup kaki INT1 dan bit TR1 harus =’1’ secara bersamaan.Jika sistem yang dirancang menghendaki kerja dari timer/counter dikendalikan dari sinyal yang berasal dari luar chip, maka bit GATE harus dibuat menjadi ‘1’
3. bit M1 dan M0=’0’, berarti TL1 dan TH1 disusun menjadi pencacah biner 13 bit (Mode 0), jika dikehendaki Timer 1 bekerja pada mode 1 seperti terlihat dalam Gambar 4, maka bit M1 harus dibuat menjadi ‘0’ dan bit M0 menjadi ‘1’.
Pengetahuan di atas dipakai sebagai dasar untuk mengatur dan mengendalikan Timer seperti terlihat dalam contoh-contoh berikut :
Setelah reset TMOD bernilai $00, berarti Timer 1 bekerja sebagai pencacah biner 13 bit, sumber sinyal denyut dari osilator kristal atau Timer 1 bekerja sebagai ‘timer’, bit GATE =’0’ berarti kaki INT1 tidak berpengaruh pada rangkaian sehingga Timer 1 hanya dikendalikan dari bit TR1.
Dalam pemakaian biasanya dipakai pencacah biner 16 bit, untuk keperluan itu instruksi yang diperlukan untuk mengatur TMOD adalah :Catatan dalam instruksi di atas tanda ‘#’ menyatakan bagian di belakangnya adalah bilangan konstan yang akan diisikan ke TMOD, ‘%’ merupakan awalan yang menandakan bahwa bilangan di belakangnya adalah bilangan biner. Penulisan dengan bilangan biner semacam ini, memudahkan untuk mengenali dengan cepat bit-bit apa saja yang diisikan ke TMOD.
Bilangan biner 010000 diisikan ke TMOD, berakibat bit 7 TMOD (bit GATE) bernilai ‘0’, bit 6 (bit C/T*) bernilai ‘0’, bit 5 dan 4 (bit M1 dan M0) bernilai ‘01’, ke-empat bit ini dipakai untuk mengatur Timer 1, sehingga Timer 1 bekerja sebagai timer dengan pencacah biner 16 bit yang dikendalikan hanya dengan TR1.
Jika dikehendaki pencacah biner dipakai sebagai counter untuk mencacah jumlah pulsa yang masuk lewat kaki T1 (P3.5), instruksinya menjadi :Perbedaannya dengan instruksi di atas adalah dalam instruksi ini bit 6 (bit C/T*) bernilai ‘1’. Selanjutnya jika diinginkan sinyal dari perangkat keras di luar chip MCS51 bisa ikut mengendalikan Timer 1, instruksi pengatur Timer 1 akan menjadi :Dalam hal ini bit 7 (bit GATE) bernilai ‘1’.
Setelah mengatur konfigurasi Timer 0 seperti di atas, pencacah biner belum mulai mencacah sebelum diperintah dengan instruksi :
SETB TR1
Perlu diingatkan jika bit GATE = ‘1’, selama kaki INT1 bernilai ‘0’ pencacah biner belum akan mencacah. Untuk menghentikan proses pencacahan, dipakai instruksi
CLR TR1
Di atas hanya dibahas Timer 1 saja, tata canya untuk Timer 0 persis sama. Yang perlu diperhatikan adalah register TMOD dipakai untuk mengatur Timer 0 dan juga Timer 1, sedangkan TMOD tidak bisa dialamati secara bit (non bit addressable) sehingga jika jika kedua Timer dipakai, pengisian bit-bit dalam register TMOD harus dipikirkan sekali gus untuk Timer 0 dan Timer 1.
Bit TR1 dan TR0 yang dipakai untuk mengendalikan proses pencacahan, terletak di dalam register TCON (memori-data internal nomor $88) yang bisa dialamati secara bit (bit addressable). Sehingga TR0 dan TR1 bisa diatur secara terpisah (dengan perintah SETB atau CLR), tidak seperti mengatur TMOD yang harus dilakukan secara bersamaan.
Demikian pula bit penampung limpahan pencacah biner TF0 dan TF1, juga terletak dalam register TCON yang masing-masing bisa di-monitor sendiri.Sebagimana ditunjukkan pada gambar 1.11 mikrokontroller dapat beraksi sebagai timer atau counter, sesuai dengan kebutuhan. Perhatikan pada saklar sebelah kiri dan kanan pada diagram blok tersebut. Mikrokontroller akan berfungsi sebagai timer ketika saklar diposisikan ke atas dan sebaliknya akan berfungsi sebagai counter bila saklar diposisikan ke bawah, dengan mengontrol bit C/T pada register TMOD. Posisi saklar sebelah kanan, bergantung pada bit GATE (register TMOD), TR1 ( register TCON0 dan INT1.

View the original article here

25 Februari 2013

Pengendali 7 Segment dengan ATMEGA8535

Seperti LED yang disusun paralel, 7 Segmen juga memiliki konfigurasi common, yakni Common Anode (CA) dan Common Cathode (CC). Kalau kita beli komponen ini di toko elektronik, pasti ditanyain “mau yang CA apa CC?”. Nah, sedikit cerita, dulu pernah saya ditanyain kaya gitu ta jawab aja asal, “yang CC mbak…”. Padahal saya ga ngerti CC tu apaan..cara nyalainnya gimana aja ga ngerti.hehe..Semoga setelah membaca artikel ini, bagi yang belum tahu apa itu CA dan CC, jadi tahu dan ngga bingung kalo ditanyain di toko elektronik.
Informasi umum konfigurasi pin:Seperti namanya, 7 segment memiliki segmen-segmen yang berjumlah 7 buah (+1 buah tapi bentuknya bulat – dp / dot point) yang diberi nama a,b,c,d,e,f,g dan dp. Jadi kalau kita ingin menyalakan angka “8?, maka kita harus menyalakan a-g. Pin “com” merupakan common dari 7 segmen. Apabila CA, berarti untuk menyalakan 7 segment, pin “com” harus diberi logika 1 (high) dan data a-dp di beri logika 0 (low). Sebaliknya, apabila CC, berarti untuk menyalakan 7 segment, pin “com” harus diberi logika 0 (low) dan data a-dp di beri logika 1 (high).
OK, mari kita coba saja simulasinya. Pertama-tama kita buat rangkaiannya di proteus.Disini saya gunakan microcontroler ATMEGA8535 atau bisa juga AT90S8535 dan 7 segment CC.
Seperti rangkaian LED, bila digunakan rangkaian sebenarnya, harap Sebelum 7 segmen di beri Resistor minimal 330 Ohm ditiap tiap segmen untuk membatasi arus yang masuk ke 7 segmen agar tidak rusak.Buka BASCOM AVR, ketik, compile, dan download program “menampilkan angka 5 pada 7 segment” dibawah ini 1 $regfile = "8535def.dat" 2 $crystal = 8000000 3 4 Config Portc = Output 5 6 Segment Alias Portc 7 8 Do 9 Segment = &B01101101 10 Loop

View the original article here

Digital Volt meter with LCD display

This project is the digital Volt meter with LCD display. The range capability 0 to 30Vdc.

Specification:
--------------------------------------------
Upper range = 30Vdc
lower range = 0Vdc
ADC = 10 bit (Feature ATMEGA 8535)

Here I used ADC0 port.  Before we must to decide the maximum voltage to ADC0. Don't give the voltage over than 5V due to can make the microcontroller damage.

Formula for maximum voltage to ADC0
--------------------------------------------
Vs = Vin * R2 (R1+R2)
VS = 30v * 1K (1K+10k)
VS = 2.727 Volt

Voltage ADC0 = Vs

It means With maximum voltage 30 Volt that the voltage give to ADC0 is 2.727 V. So we must adjust the Aref to 2.727 V. Aref is External voltage reference. Without Aref it means the voltage reference = 5V. Adjust the potensio RV1  till the voltage = 2.727 V.

Codenya :

$crystal = 8000000
$sim
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
Cursor Off
Cls

Config Adc = Single , Prescaler = Auto
Start Adc
Dim read_adc As Word
Dim Volt As Single

Do
Read_adc = Getadc(0)
Volt = Read_adc / 1023
Volt = Volt * 30

Locate 1 , 1
Lcd "measured"
Locate 2 , 1
Lcd Fusing(volt , "##.##") ; " Volt" ; "  "
Loop


View the original article here

DAFTAR UPDATE CYANMOBILE EXPERIENCE ROM TERBARU (OKTOBER)


Note: Cukup flashing via CWM Recovery, jangan lupa wipe data & cache partition sebelum dan sesudah flashing ROM (Contoh Tutorial)1. update-CyanMobile-eXperience-Blade-20121010-Release.zip2. update-CyanMobile-eXperience-GalaxyFit-20121010-Release.zip 3. update-CyanMobile-eXperience-GalaxyMini-20121010-Release.zip 4. update-CyanMobile-eXperience-GalaxyAce-20121010-Release.zip 5. update-CyanMobile-eXperience-GalaxyGio-20121010-Release.zip 6. update-CyanMobile-eXperience-HuaweiX3-20121010-Release.zip 7. CMXgapps-gb-03102012-signed.zip 8. CyanMobile eXperience GalaxyMini 20121019


View the original article here

Interupsi

8051 mempunyai 5 buah sumber interupsi. Dua buah interupsi eksternal, dua buah interupsi timer dan sebuah interupsi port serial.
Meskipun memerlukan pengertian yang lebih mendalam, pengetahuan mengenai interupsi sangat membantu mengatasi masalah pemrograman mikroprosesor/mikrokontroler dalam hal menangani banyak peralatan input/output. Pengetahuan mengenai interupsi tidak cukup hanya dibahas secara teori saja, diperlukan contoh program yang konkrit untuk memahami.
Saat kaki RESET pada IC mikroprosesor/mikrokontroler menerima sinyal reset (pada MCS51 sinyal tersebut berupa sinyal ‘1’ sesaat, pada prosesor lain umumnya merupakan sinyal ‘0’ sesaat), Program Counter diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor reset (reset vector), merupakan nomor awal memori-program yang menampung program yang harus dijalankan.
Pembahasan di atas memberi gambaran bahwa proses reset merupakan peristiwa perangkat keras (sinyal reset diumpankan ke kaki Reset) yang dipakai untuk mengatur kerja dari perangkat lunak, yakni menentukan aliran program prosesor (mengisi Program Counter dengan vektor reset).
Program yang dijalankan dengan cara reset, merupakan program utama bagi prosesor.Peristiwa perangkat keras yang dipakai untuk mengatur kerja dari perangkat lunak, tidak hanya terjadi pada proses reset, tapi terjadi pula dalam proses interupsi.
Dalam proses interupsi, terjadinya sesuatu pada perangkat keras tertentu dicatat dalam flip-flop khusus, flip-flop tersebut sering disebut sebagai ‘petanda’ (flag), catatan dalam petanda tersebut diatur sedemikian rupa sehingga bisa merupakan sinyal permintaan interupsi pada prosesor. Jika permintaan interupsi ini dilayani prosesor, Program Counter akan diisi dengan sebuah nilai. Nilai tersebut dinamakan sebagai vektor interupsi (interrupt vector), yang merupakan nomor awal memori-program yang menampung program yang dipakai untuk melayani permintaan interupsi tersebut.
Program yang dijalankan dengan cara interupsi, dinamakan sebagai program layanan interupsi (ISR - Interrupt Service Routine). Saat prosesor menjalankan ISR, pekerjaan yang sedang dikerjakan pada program utama sementara ditinggalkan, selesai menjalankan ISR prosesor kembali menjalankan program utama, seperti yang digambarkan dalam Gambar 1. Gambar 1.8 Bagan kerja prosesor melayani interupsiSebuah prosesor bisa mempunyai beberapa perangkat keras yang merupakan sumber sinyal permintaan interupsi, masing-masing sumber interupsi dilayani dengan ISR berlainan, dengan demikian prosesor mempunyai beberapa vektor interupsi untuk memilih ISR mana yang dipakai melayani permintaan interupsi dari berbagai sumber. Kadang kala sebuah vektor interupsi dipakai oleh lebih dari satu sumber interupsi yang sejenis, dalam hal semacam ini ISR bersangkutan harus menentukan sendiri sumber interupsi mana yang harus dilayani saat itu.
Jika pada saat yang sama terjadi lebih dari satu permintaan interupsi, prosesor akan melayani permintaan interupsi tersebut menurut perioritas yang sudah ditentukan, selesai melayani permintaan interupsi perioritas yang lebih tinggi, prosesor melayani permintaan interupsi berikutnya, baru setelah itu kembali mengerjakan program utama.
Saat prosesor sedang mengerjakan ISR, bisa jadi terjadi permintaan interupsi lain, jika permintaan interupsi yang datang belakangan ini mempunyai perioritas lebih tinggi, ISR yang sedang dikerjakan ditinggal dulu, prosesor melayani permintaan yang perioritas lebih tinggi, selesai melayani interupsi perioritas tinggi prosesor meneruskan ISR semula, baru setelah itu kembali mengerjakan program utama. Hal ini dikatakan sebagai interupsi bertingkat (nested interrupt), tapi tidak semua prosesor mempunyai kemampuan melayani interupsi secara ini.1.4.1. Sumber interupsi MCS51
Seperti terlihat dalam Gambar 2, AT89C51 mempunyai 6 sumber interupsi, yakni Interupsi External (External Interrupt) yang berasal dari kaki INT0 dan INT1, Interupsi Timer (Timer Interrupt) yang berasal dari Timer 0 maupun Timer 1, Interupsi Port Seri (Serial Port Interrupt) yang berasal dari bagian penerima dan bagian pengirim Port Seri.
Di samping itu AT89C52 mempunyai 2 sumber interupsi lain, yakni Interupsi Timer 2 bersumber dari Timer 2 yang memang tidak ada pada AT89C51.Bit IE0 (atau bit IE1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Eksternal. Ada 2 keadaan yang bisa meng-aktip-kan petanda ini, yang pertama karena level tegangan ‘0’ pada kaki INT0 (atau INT1), yang kedua karena terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0 (atau INT1). Pilihan bentuk sinyal ini ditentukan lewat bit IT0 (atau bit IT1) yang terdapat dalam register TCON.
1. Kalau bit IT0 (atau IT1) =’0’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat kaki INT0=’0’.
2. Kalau bit IT0 (atau IT1) =’1’ maka bit IE0 (atau IE1) dalam TCON menjadi ‘1’ saat terjadi transisi sinyal ‘1’ menjadi ‘0’ pada kaki INT0.
Menjelang prosesor menjalankan ISR dari Interupsi Eksternal, bit IE0 (atau bit IE1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Eksternal sudah dilayani. Namun jika permintaan Interupsi Ekternal terjadi karena level tegangan ‘0’ pada kaki IT0 (atau IT1), dan level tegangan pada kaki tersebut saat itu masih =’0’ maka bit IE0 (atau bit IE1) akan segera menjadi ‘1’ lagi! Bit TF0 (atau bit TF1) dalam TCON merupakan petanda (flag) yang menandakan adanya permintaan Interupsi Timer, bit TF0 (atau bit TF1) menjadi ‘1’ pada saat terjadi limpahan pada pencacah biner Timer 0 (atau Timer 1).
Menjelang prosesor menjalankan ISR dari Interupsi Timer, bit TF0 (atau bit TF1) dikembalikan menjadi ‘0’, menandakan permintaan Interupsi Timer sudah dilayani.Interupsi port seri terjadi karena dua hal, yang pertama terjadi setelah port seri selesai mengirim data 1 byte, permintaan interupsi semacam ini ditandai dengan petanda (flag) TI=’1’. Yang kedua terjadi saat port seri telah menerima data 1 byte secara lengkap, permintaan interupsi semacam ini ditandai dengan petanda (flag) RI=’1’.
Petanda di atas tidak dikembalikan menjadi ‘0’ menjelang prosesor menjalankan ISR dari Interupsi port seri, karena petanda tersebut masih diperlukan ISR untuk menentukan sumber interupsi berasal dari TI atau RI. Agar port seri bisa dipakai kembali setelah mengirim atau menerima data, petanda-petanda tadi harus di-nol-kan lewat program.Petanda permintaan interupsi (IE0, TF0, IE1, TF1, RI dan TI) semuanya bisa di-nol-kan atau di-satu-kan lewat instruksi, pengaruhnya sama persis kalau perubahan itu dilakukan oleh perangkat keras. Artinya permintaan interupsi bisa diajukan lewat pemrograman, misalnya permintaan interupsi eksternal IT0 bisa diajukan dengan instruksi SETB IE0.1.4.2 Mengaktifkan Interupsi
Semua sumber permintaan interupsi yang di bahas di atas, masing-masing bisa di-aktip-kan atau di-nonaktip-kan secara tersendiri lewat bit-bit yang ada dalam register IE (Interrupt Enable Register).
Bit EX0 dan EX1 untuk mengatur interupsi eksternal INT0 dan INT1, bit ET0 dan ET1 untuk mengatur interupsi timer 0 dan timer 1, bit ES untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2. Di samping itu ada pula bit EA yang bisa dipakai untuk mengatur semua sumber interupsi sekali gus.
Setelah reset, semua bit dalam register IE bernilai ‘0’, artinya sistem interupsi dalam keadaan non-aktip. Untuk mengaktipkan salah satu sistem interupsi, bit pengatur interupsi bersangkutan diaktipkan dan juga EA yang mengatur semua sumber interupsi. Misalnya instruksi yang dipakai untuk mengaktipkan interupsi ekternal INT0 adalah SETB EX0 disusul dengan SETB EA.
Disables all interrupts. If EA=0, no interrupt will be acknowledged. If EA=1, each interrupt source is individually enabled or disabled by setting or clearing its enable bit.Enables or disables the Serial Port interrupt. If ES=0, the Serial Port interrupt is disabled.Enables or disables the Timer 1 Overflow interrupt. If ET1=0, the Timer 1 interrupt is disabled.Enables or disables External Interrupt 1. If EX1=0, External interrupt 1 is disabled.Enables or disables the Timer 0 Overflow interrupt. If ET0=0, the Timer 0 interrupt is disabled.Enables or disables External interrupt 0. If EX0=0, External interrupt 0 is disabled.1.4.3 Vektor Interupsi
Saat MCS51 menanggapi permintaan interupsi, Program Counter diisi dengan sebuah nilai yang dinamakan sebagai vektor interupsi, yang merupakan nomor awal dari memori-program yang menampung ISR untuk melayani permintaan interupsi tersebut. Vektor interupsi itu dipakai untuk melaksanakan inststuksi LCALL yang diaktipkan secara perangkat keras.
Vektor interupsi untuk interupsi eksternal INT0 adalah $0003, untuk interupsi timer 0 adalah $000B, untuk interupsi ekternal INT1 adalah $0013, untuk interupsi timer 1 adalah $001B dan untuk interupsi port seri adalah $0023.
Jarak vektor interupsi satu dengan lainnya sebesar 8, atau hanya tersedia 8 byte untuk setiap ISR. Jika sebuah ISR memang hanya pendek saja, tidak lebih dari 8 byte, maka ISR tersebut bisa langsung ditulis pada memori-program yang disediakan untuknya. ISR yang lebih panjang dari 8 byte ditulis ditempat lain, tapi pada memori-program yang ditunjuk oleh vektor interupsi diisikan instruksi JUMP ke arah ISR bersangkutanMasing-masing sumber interupsi bisa ditempatkan pada dua tingkatan perioritas yang berbeda. Pengaturan tingkatan perioritas isi dilakukan dengan bit-bit yang ada dalam register IP (Interrupt Priority).
Bit PX0 dan PX1 untuk mengatur tingkatan perioritas interupsi eksternal INT0 dan INT1, bit PT0 dan PT1 untuk mengatur interupsi timer 0 dan timer 1, bit PS untuk mengatur interupsi port seri, seperti yang digambarkan dalam Gambar 2.
Setelah reset, semua bit dalam register IP bernilai ‘0’, artinya semua sumber interupsi ditempatkan pada tingkatan tanpa perioritas. Masing-masing sumber interupsi bisa ditempatkan pada tingkatan perioritas utama dengan cara men-‘satu’-kan bit pengaturnya. Misalnya interupsi timer 0 bisa ditempatkan pada tingkatan perioritas utama dengan instruksi SETB PT1.
Sebuah ISR untuk interupsi tanpa perioritas bisa diinterupsi oleh sumber interupsi yang berada dalam tingkatan perioritas utama. Tapi interupsi yang berada pada tingkatan perioritas yang sama, tidak dapat saling meng-interupsi.
Jika 2 permintaan interupsi terjadi pada saat yang bersamaan, sedangkan kedua interupsi tersebut terletak pada tingkatan perioritas yang berlainan, maka interupsi yang berada pada tingkatan perioritas utama akan dilayani terlebih dulu, setelah itu baru melayani interupsi pada tingkatan tanpa perioritas.
Jika kedua permintaan tersebut bertempat pada tingkatan perioritas yang sama, perioritas akan ditentukan dengan urutan sebagai berikut : interupsi eksternal INT0, interupsi timer 0, interupsi ekternal INT1, interupsi timer 1 dan terakhir adalah interupsi port seri.
Bagan Lengkap Sistem Interupsi MCS51
Meskipun sistem interupsi MCS51 termasuk sederhana dibandingkan dengan sistem interupsi MC68HC11 buatan Motorola, tapi karena menyangkut 5 sumber interupsi yang masing-masing harus diatur secara tersendiri, tidak mudah untuk mengingat semua masalah tersebut, terutama pada saat membuat program sering dirasakan sangat merepotkan membolak-balik buku untuk mengatur masing-masing sumber interupsi tersebut.
Gambar 2 menggambarkan sistem interupsi MCS51 selangkapnya, berikut dengan masing-masing bit dalam register-register SFR (Special Function Register) yang dipakai untuk mengatur masing-masing sumber interupsi.
Saklar yang digambarkan dalam Gambar 2 mewakili bit dalam register yang harus diatur untuk mengendalikan sumber interupsi, kotak bergambar bendera kecil merupakan flag (petanda) dalam register yang mencatat adanya permintaan interupsi dari masing-masing sumber interupsi. Kedudukan saklar dalam gambar tersebut menggambarkan kedudukan awal setelah MCS51 di-reset.
Gambar ini sangat membantu saat penulisan program menyangkut interupsi MCS51.Interrupt Priority Register ( IP )
Note:
Defines the Serial Port interrupt priority level. PS=1 programs it to the higher priority level.Defines the Timer 1 interrupt priority level. PT1=1 programs it to the higher priority level.Defines the External Interrupt 1 priority level. PX1=1 programs it to the higher priority level.Enables or disables the Timer 0 interrupt priority level. PT0=1 programs it to the higher priority level.Defines the External Interrupt 0 priority level. PX0=1 programs it to the higher priority level.

View the original article here

Jam Digital dengan Mode 12/24

Rangkaian :

Source Code : Bascom AVR$regfile = "m8def.dat"$crystal = 1000000'------------------------ lcd -----------------------------------------------Config Lcd = 16 * 2Config Lcdpin = Pin , Rs = Pind.0 , E = Pind.1 , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5Cls'--------------------------- ds 1307 -----------------------------------------$lib "ds1307clock.lib"'configure the scl and sda pinsConfig Sda = Portd.7Config Scl = Portd.6'address of ds1307Const Ds1307w = &HD0 ' Addresses of Ds1307 clockConst Ds1307r = &HD1'------------------------------ key --------------------------------------------Config Pinc.1 = InputConfig Pinc.2 = InputConfig Pinc.3 = InputConfig Pinc.4 = Input'------------------------------------------------------------------------------Config Debounce = 30Dim A As Byte , B As Byte , Data1 As Byte , C As ByteDim Seco As Byte , Mine As Byte , Hour As Byte'----------------------------------------------------------------------------Cursor Off'-----------------------------ClsLocate 1 , 6Lcd "Hello"Locate 2 , 1Lcd "WWW.elec4u.ir"Wait 2For A = 1 To 15 Shiftlcd LeftWaitms 300NextCls'-------------------------------------------------------------------------------Main:Do Gosub Ds1307 Gosub 24_12 Gosub ChekkeyLoop'-------------------------------------------------------------------------------Ds1307: I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 0 ' start address in 1307 I2cstart ' Generate start code I2cwbyte Ds1307r ' send address I2crbyte Seco , Ack 'sec I2crbyte Mine , Ack ' MINUTES I2crbyte Hour , Nack ' Hours I2cstop Seco = Makedec(seco) : Mine = Makedec(mine) : Hour = Makedec(hour) If Seco > 59 Then Seco = 0 If Mine > 59 Then Mine = 0 If Hour > 23 Then Hour = 0 Gosub Seco End IfReturn'------------------------------------------------------------------------------- 24_12: If Pinc.4 = 1 Then Gosub Disply_24 If Pinc.4 = 0 Then Gosub Disply_12 Return'-------------------------------------------------------------------------------Disply_24: Locate 1 , 1 Lcd "Time = " ; Hour ; ":" ; Mine ; ":" ; Seco ; " " Locate 2 , 6 Lcd "(24)"Return'-------------------------------------------------------------------------------Disply_12: If Hour = 0 Then Hour = 12 If Hour > 12 Then Hour = Hour - 12 Locate 1 , 1 Lcd "Time = " ; Hour ; ":" ; Mine ; ":" ; Seco ; " " Locate 2 , 6 Lcd "(12)"Return'-------------------------------------------------------------------------------Chekkey: Debounce Pinc.1 , 0 , Seco , Sub Debounce Pinc.2 , 0 , Mine , Sub Debounce Pinc.3 , 0 , Hour , SubReturn'---------------------------------------------Seco: Incr Seco If Seco > 59 Then Seco = 0 Seco = Makebcd(seco) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 0 ' starting address in 1307 I2cwbyte Seco I2cstopReturn'-------------------------------------Mine: Incr Mine If Mine > 59 Then Mine = 0 Mine = Makebcd(mine) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 1 ' starting address in 1307 I2cwbyte Mine I2cstopReturn'-------------------------------------Hour: Incr Hour If Hour > 23 Then Hour = 0 Hour = Makebcd(hour) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 2 ' starting address in 1307 I2cwbyte Hour I2cstopReturn'-------------------------------------End

View the original article here

Ikuti Blog ini

Langganan

Mau dapet Update-an Blog ini lewat e-mail? Masukkin aja alamat Email kamu disini:

Dikirim Oleh FeedBurner