| 
 ; 说明:
 ;        开机LED移动速度为500MS,通过按键修改,时间范围在100MS~2500MS之间,
 ;        启动开关控制LED启停,低运行,高暂停
 ;        报警输出高电平有效
 ;        按键修改LED时间,在100MS~2500MS之间,按键按下低电平有效,每按下一次时间增加10MS
 
 
 $include (reg52.inc)
 
 gpio_led1        equ                p1.0
 gpio_led2        equ                p1.1
 gpio_led3        equ                p1.2
 gpio_led4        equ                p1.3
 gpio_led5        equ                p1.4
 gpio_led6        equ                p1.5
 gpio_led7        equ                p1.6
 
 gpio_start                equ        p3.4
 gpio_alarm_in        equ        p3.3
 gpio_alarm_out        equ        p3.7
 
 gpio_key1        equ                p1.7
 
 
 bseg        at        0
 flag_10ms:
 dbit                1
 flag_led:
 dbit                1
 
 dseg        at        030h
 led_peroid:
 ds                1
 const_led_peroid:
 ds                1
 
 key_number:
 ds                1
 key_delay:
 ds                1
 
 cseg        at        0
 jmp                start
 
 cseg        at        00bh
 jmp                isr_t0
 
 start:
 call        sys_init
 
 ;_______________
 ;主循环开始
 loop:
 jnb                flag_10ms,$
 
 call        sys_led
 
 call        sys_alarm
 
 call        sys_key
 
 clr                flag_10ms
 clr                flag_led
 jmp                loop
 
 
 ;__________________________
 ; 初始化
 ;__________________________
 sys_init:
 mov                sp,#07fh-32
 
 clr                gpio_led1
 setb        gpio_led2
 setb        gpio_led3
 setb        gpio_led4
 setb        gpio_led5
 setb        gpio_led6
 setb        gpio_led7
 
 clr                flag_10ms
 clr                flag_led
 clr                a
 mov                led_peroid,a
 mov                key_number,a
 mov                key_delay,a
 
 mov                a,#50                ; 修改数值,改变LED速度,50=500MS(*10MS)
 mov                const_led_peroid,a
 
 mov                tmod,#010h
 mov                tl0,#0f0h                ; 65536-10000,10MS
 mov                th0,#0d8h                ; 65536-10000,10MS
 setb        et0
 setb        tr0
 
 setb                ea
 
 ret
 
 
 ;__________________________
 ; 按键
 ;__________________________
 sys_key:
 clr                a
 mov                key_number
 jnb                gpio_key1,sys_key_00
 mov                key_delay,a
 ret
 
 sys_key_00:
 mov                a,key_delay
 clr                c
 subb        a,#100
 jnc                sys_key_01
 inc                key_delay
 sys_key_01:
 mov                a,key_delay
 xrl                a,#3
 jnz                sys_key_02
 orl                key_number,#1
 ;___________________
 ;处理按键
 inc                const_led_peroid
 mov                a,const_led_peroid
 xrl                a,#250
 jnz                sys_key_02
 mov                const_led_peroid,#10
 ret
 
 sys_key_02:
 ret
 
 ;__________________________
 ; 报警
 ;__________________________
 sys_alarm:
 ;______________________________________________________________
 3.3为外部故障输入模拟开关,低电平报警,P1.7为报警输出,
 mov                c,gpio_alarm_in
 cpl                c
 mov                gpio_alarm_out,c        ; 报警输出,高电平有效
 ret
 
 
 ;__________________________
 ; LED
 ;__________________________
 sys_led:
 ;___________________
 ;每500MS循环处理灯
 jnb                gpio_start,label_00                ; 低电平启动
 label_000:
 ret
 
 label_00:
 jnb                flag_led,label_000
 
 jb                gpio_led1,label_01
 setb        gpio_led1
 clr                gpio_led2
 ret
 
 label_01:
 jb                gpio_led2,label_02
 setb        gpio_led2
 clr                gpio_led3
 ret
 
 label_02:
 jb                gpio_led3,label_03
 setb        gpio_led3
 clr                gpio_led4
 ret
 
 label_03:
 jb                gpio_led4,label_04
 setb        gpio_led4
 clr                gpio_led5
 ret
 
 label_04:
 jb                gpio_led5,label_05
 setb        gpio_led5
 clr                gpio_led6
 ret
 
 label_05:
 jb                gpio_led6,label_06
 setb        gpio_led6
 clr                gpio_led7
 ret
 
 label_06:
 jb                gpio_led7,label_07
 setb        gpio_led7
 clr                gpio_led1
 ret
 
 label_07:
 clr                gpio_led1
 ret
 
 ;__________________________
 ; T0中断
 ;__________________________
 isr_t0:
 push        psw
 push        acc
 
 ;        clr                tr0
 mov                tl0,#0f0h
 mov                th0,#0d8h
 ;        setb        tr0
 
 setb        flag_10ms
 inc                led_peroid
 mov                a,led_peroid
 xrl                a,const_led_peroid
 jnz                reti_t0
 mov                led_peroid,a
 setb        flag_led
 
 reti_t0:
 pop                acc
 pop                psw
 reti
 
 
 
 
 
 end
 |