;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,
;//当第一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,
;//第二次按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,
;//第三次按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,
;//第四次按下开关SP1的时候,又轮到L1在闪烁了,
#include <REGX51.H>
;_______________________________
; GPIO定义
led0 bit 090h.0
led1 bit 090h.1
led2 bit 090h.2
led3 bit 090h.3
key bit 090h.7
;_______________________________
; 变量定义
dseg at 030h
counter_500ms: ds 1
stage: ds 1
bseg at 00h
bkp_key: dbit 1
flash: dbit 1
;_______________________________
; 程序开始
cseg at 0
ljmp reset_init
cseg at 0bh
ljmp isr_t0
reset_init:
mov sp,#07fh-32
clr a
mov counter_500ms,a
mov stage,a
setb key
setb bkp_key
clr flash
mov tmod,#01h
mov th0,#high(65536-1000)
mov tl0,#high(65536-1000)
clr tf0
setb et0
setb ea
setb tr0
main_loop:
jmp $
ret
;_______________________________
; T0中断程序
isr_t0:
push psw
push acc
push b
clr tr0
mov th0,#high(65536-1000)
mov tl0,#high(65536-1000)
setb tr0
;_______________________________
; led0
inc counter_500ms
mov a,counter_500ms
xrl a,#50
jnz label_10
cpl led0
cpl flash
;_______________________________
; key
label_10:
setb key
mov c,key
mov f0,c
jb f0,label_11
jnb bkp_key,label_11
inc stage
mov a,stage
setb c
subb a,#2
jc label_11
mov stage,#0h
label_11:
mov c,f0
mov bkp_key,c
;_______________________________
; led1,led2,led3
label_00:
mov a,stage
cjne a,#0,label_01
mov c,flash
mov led1,c
jmp label_xx
label_01:
cjne a,#1,label_02
mov c,flash
mov led2,c
jmp label_02
label_02:
cjne a,#2,label_xx
mov c,flash
mov led3,c
jmp label_xx
label_xx:
pop b
pop acc
pop psw
reti
end |