Ví dụ đây là một "khung chương trình" của 89C52
Code:
;********************************************************
;* Clock 24 MHz, 1 chu ky 0.5 us
;********************************************************
; Khai bao cac hang so khoi dong ban dau o day
; Khai bao bien o day
;-----------------------------
Start:
mov a,#0Ch
da a
djnz r0,$
clr EA
clr ET0
clr ET1
clr EX0
clr EX1
jmp Clear_RAM
;----------------------------------------------------------------------------
; Clear RAM internal 20h - 0FFh for 89C52
;----------------------------------------------------------------------------
Clear_RAM:
mov r0,#20h
CLR_loop:
mov @r0,#0
inc r0
cjne r0,#0ffh,CLR_loop
mov sp,#Stack
;----------------------------------------------------------------------------
; Setup cac tham so khac o day
;--------------------------------------------------------
; Vong quet chuong trinh chinh
;--------------------------------------------------------
Main:
jbc flg_time.0,prg10us
n100us:
jbc flg_time.1,prg100us
n1ms:
jbc flg_time.2,prg1ms
n10ms:
jbc flg_time.3,prg10ms
n100ms:
jbc flg_time.4,prg100ms
n1sec:
jbc flg_time.5,prg1sec
n1minute:
jmp Main
;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg10us:
;cac lenh cua vong quet 10us
jmp n100us
;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg100us:
;cac lenh cua vong quet 100us
jmp n1ms
;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg1ms:
;cac lenh cua vong quet 1ms
jmp n10ms
;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg10ms:
;cac lenh cua vong quet 10ms
jmp n100ms
;~~~~~~~~~~~~~~~~~~~~~~~~~~
prg100ms:
;cac lenh cua vong quet 100ms
jmp n1sec
;----------------------------------------------------------
; Thu tuc xu ly cac ngat
;----------------------------------------------------------
IntTimer0:
push 0
clr TR0 ; cam timer 0
;cac lenh trong ngat Timer0
endtimer0:
setb TR0 ; Cho phep timer 0
pop 0
reti
;----------------------------
;Tao chu ky vong quet khac nhau
IntTimer1:
push 0
clr TR1 ; cam timer 1
setb flg_time.0 ;bit 0 : da thay doi 10us
mov r0,#cn_10us
inc @r0
cjne @r0,#10,endtimer1
setb flg_time.1 ;bit 1: da thay doi 100us
mov @r0,#0
mov r0,#cn_100us
inc @r0
cjne @r0,#10,endtimer1
setb flg_time.2 ;bit 2: da thay doi 1ms=1000us
mov @r0,#0
mov r0,#cn_1ms
inc @r0
cjne @r0,#10,endtimer1
setb flg_time.3 ;bit 3: da thay doi 10ms
mov @r0,#0
mov r0,#cn_10ms
inc @r0
cjne @r0,#10,endtimer1
setb flg_time.4 ;bit 4: da thay doi 100ms
mov @r0,#0
mov r0,#cn_100ms
inc @r0
cjne @r0,#10,endtimer1
setb flg_time.5 ;bit 5: da thay doi 1sec=1000ms
mov @r0,#0
mov r0,#cn_1sec
inc @r0
cjne @r0,#60,endtimer1
setb flg_time.6 ;bit 6: da thay doi 1minute=60s
mov @r0,#0
mov r0,#cn_1minute
inc @r0
cjne @r0,#60,endtimer1
setb flg_time.7 ;bit 7: da thay doi 1hour=60minutes
mov @r0,#0
mov r0,#cn_1hour
inc @r0
endtimer1:
mov TL1,#Low(MotorPulse)
mov TH1,#High(MotorPulse)
setb TR1
pop 0
reti
;----------------------------
IntEx0:
reti
;----------------------------
IntRS232:
reti
;----------------------------
IntEx1:
reti
;----------------------------
endprog: db ' End of program at here, bye!'
END