📄 key_display.src
字号:
;key scan and led display
;*****************************
.include "define.mac"
.public key_scan
.public led_scan
.extern WR_24C02
.extern RD_24C02
.extern restore
;scan_key subroutine
;**************************************************************
key_scan:
ld serial_clk_0,#0f7H ;74ls164 clk=P2.3 clk=0
ld serial_clk_1,#08H ;clk=1
key_first_scan:
ld serial_data,#00H
call serial_out ;serial out 00
tm p0,#01H ;test P0.0=0 ?
jr z, key_operation ;if P0.0=0 to key_operation
ld key_first_flag,#00H ;no key clear key_first_flag
ld key_press_time,#00H ;no key clear key_press_time
ld key_press_down,#00H ;no key press down
ld key_hold_down,#00H ;first press or already press
ld key_delay_time1,#00H
ld key_delay_time2,#00H
ld key_release,#00H ;key realease
jp key_scan_end
key_operation:
cp key_first_flag,#01H ;if already press
jr eq,key_delay_time ;yes,to test delay time
ld key_first_flag,#01H ;no,to dalay time
ld key_press_time,#00H ;clear key_press_time,again scan
jp key_scan_end
key_delay_time:
cp key_press_time,#200 ;delay 200*120us=24ms 120us use T0 count
jr uge,key_already_press
jp key_scan_end
key_already_press:
tm led_display_flag,#01H
jr eq,key_relea
ld led_display_flag,#01H
call key_validate
tm key_value,#01H ;if key_value=fire+ not set key_release
jp eq,key_scan_end
tm key_value,#02H ;if key_value=fire- not set key_release
jp eq,key_scan_end
tm key_value,#06H ;if key_value=temp+ not set key_release
jp eq,key_scan_end
tm key_value,#07H ;if key_value=temp- not set key_release
jp eq,key_scan_end
ld key_release,#01H ;other key set key_release
jp key_scan_end
key_relea:
tm key_realease_flag,#00H
jr eq,key_value_judge
jp key_scan_end
;************************************************************
key_validate:
ld serial_data,#0feH
ld r0,#01
key_scan_loop:
call serial_out ;serial out 1111 1110B
ld r3,p0
tm r3,#01H ;test P0.0=0 ?
jr z, key_validate_end ;if P0.0=0 to key_operation
inc r0 ;key_value add 1
rl serial_data ;1<-serial_data scan again
cp r0,#08 ;key value<8 jump loop
jr uge,key_scan_loop
jp key_scan_end ;can not test key ,exit
key_validate_end:
ld key_value,r0 ;save key_value
ret
;***************************************************************
key_value_judge:
call key_validate
key_hold_done:
cp key_hold_down,#01H ;if key hold press down
jr eq,key_value_cp ;yes ,to cp key_value
ld key_hold_down,#01H ;no ,set key_hold_down flag
ld key_value_store,key_value ;backup key_value
ld key_delay_time1,#00H ;hold_time start
ld key_delay_time2,#00H
jr key_deal
key_value_cp:
cp key_value_store,key_value ;key_value eq previous key_value
jr eq,key_hold_sub ;eq ,to key_hold_sub judge delay time
jp key_scan_end ;ne,it is other key ,exit
key_hold_sub:
cp key_delay_time2,#15 ;delay time =102*200*15=0.36s ?
jr ugt,key_deal ;time up ,to key_deal
jp key_scan_end ;no,exit
key_deal:
cp key_value,#01H
jp eq,key_1_sub ;temp+
cp key_value,#02H
jp eq,key_2_sub ;temp-
cp key_value,#03H
jp eq,key_3_sub ;temp on-off
cp key_value,#04H
jp eq,key_4_sub ;lamp on-off
cp key_value,#05H
jp eq,key_5_sub ;fire+
cp key_value,#06H
jp eq,key_6_sub ;fire-
cp key_value,#07H
jp eq,key_7_sub ;fire on-off
cp key_value,#08H
jp eq,key_8_sub ;sound
key_scan_end:
ret
;***************************************************************
;***************************************************************
key_1_sub:
tm temp_status,#01H
jr ne,key_1_sub_end ;temp off ,exit
inc temp_value ;temp+
cp temp_value,#01H
jr ult,temp_min
cp temp_value,#0AH
jr ugt,temp_max
jr key_1_sub_end
temp_min:
ld temp_value,#01H
jr key_1_sub_end
temp_max:
ld temp_value,#0AH
jr key_1_sub_end
key_1_sub_end:
; ld I2C_data,temp_value
; ld I2C_dress,#temp_value_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_2_sub:
tm temp_status,#01H
jr ne,key_2_sub_end ;temp off ,exit
dec temp_value ;temp-
cp temp_value,#01H
jr ult,temp_min_1
cp temp_value,#0AH
jr ugt,temp_max_2
jr key_2_sub_end
temp_min_1:
ld temp_value,#01H
jr key_2_sub_end
temp_max_2:
ld temp_value,#0AH
jr key_2_sub_end
key_2_sub_end:
; ld I2C_data,temp_value
; ld I2C_dress,#temp_value_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_3_sub:
cp temp_status,#00H
jr eq,temp_on ;if temp_status=0=off jump to temp on
temp_off: ;if temp_status=1=on to temp off
ld temp_status,#00H
jr key_3_sub_end
temp_on:
ld temp_status,#01H
key_3_sub_end:
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_4_sub:
tm fire_status,#01H
jr ne,key_4_sub_end
cp lamp_status,#00H
jr eq,temp_on ;if lamp_status=0=off jump to lamp on
lamp_off: ;if lamp_status=1=on to lamp off
ld lamp_status,#00H
call lamp_close
jr key_4_sub_end
lamp_on:
ld lamp_status,#01H
call lamp_open
key_4_sub_end:
; ld I2C_data,lamp_status
; ld I2C_dress,#lamp_status_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_5_sub:
tm fire_status,#01H
jr ne,key_5_sub_end ;fire off ,exit
inc fire_value ;fire+
cp fire_value,#01H
jr ult,fire_min
cp fire_value,#0AH
jr ugt,fire_max
jr key_5_sub_end
fire_min:
ld fire_value,#01H
jr key_5_sub_end
fire_max:
ld fire_value,#0AH
jr key_5_sub_end
key_5_sub_end:
; ld I2C_data,fire_value
; ld I2C_dress,#fire_value_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_6_sub:
tm fire_status,#01H
jr ne,key_6_sub_end ;fire off ,exit
dec fire_value ;fire-
cp fire_value,#01H
jr ult,fire_min_1
cp fire_value,#0AH
jr ugt,fire_max_2
jr key_6_sub_end
fire_min_1:
ld fire_value,#01H
jr key_6_sub_end
fire_max_2:
ld fire_value,#0AH
jr key_6_sub_end
key_6_sub_end:
; ld I2C_data,fire_value
; ld I2C_dress,#fire_value_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;***************************************************************
key_7_sub:
cp fire_status,#00H
jr eq,fire_on ;if fire_status=0=off jump to fire on
fire_off: ;if fire_status=1=on to fire off
ld fire_status,#00H
and p0,#11011111B ;clear p0.5 disenble LIGHTS
jr key_7_sub_end
fire_on:
ld fire_status,#01H
or p0,#00100000B ;set p0.5 enble LIGHTS
sound_judge:
cp sound_status,#01H
jr eq,sound_judge_1
call sound_close
jr lamp_judge
sound_judge_1:
call sound_open
lamp_judge:
cp lamp_status,#01H
jr eq,lamp_judge_1
call lamp_close
jr key_7_sub_end
lamp_judge_1:
call lamp_open
key_7_sub_end:
; ld beep_flag,#01h
ret
;**************************************************************
sound_open:
and p0,#11110111B ;clear p0.3 enble spker
ret
sound_close:
or p0,#00001000B ;set p0.3 disenble spker
ret
lamp_open:
and p0,#11101111B ;clear p0.4 enble lamp
ret
lamp_close:
or p0,#00001000B ;set p0.4 disenble lamp
ret
;***************************************************************
;***************************************************************
key_8_sub:
tm fire_status,#01H
jr ne,key_8_sub_end
cp sound_status,#00H
jr eq,sound_on ;if sound_status=0=off jump to sound on
sound_off: ;if sound_status=1=on to sound off
ld sound_status,#00H
call sound_close
jr key_8_sub_end
sound_on:
ld sound_status,#01H
call sound_open
key_8_sub_end:
; ld I2C_data,sound_status
; ld I2C_dress,#sound_status_dress
; call WR_24C02
; ld beep_flag,#01h
ret
;***************************************************************
;*************************************************************************
;led_display subroutine
;*************************************************************************
led_scan:
cp led_display_flag,#01H ;if time=15s led off, else led on
jr ne,led_scan_end
led_temp:
ld r2,#0bh
ld r3,temp_value
ldc r0,@rr2 ;of00h
or p1,#02H
or p2,#03H ;Q1 Q2 Q3 off
ld serial_data,r0 ;temp on
call serial_out
and p2,#11111101B ;Q1 on p2.1
ld r2,#0bh
ld r3,temp_value
ldc r0,#10h[rr2] ;0f10h
or p1,#02H
or p2,#03H ;Q1 Q2 Q3 off
ld serial_data,r0 ;temp on
call serial_out
and p2,#11111110B ;Q3 on p2.0
led_fire:
ld r2,#0bh
ld r3,fire_value
ldc r0,@rr2 ;of00h
or p1,#02H
or p2,#03H ;Q1 Q2 Q3 off
ld serial_data,r0 ;temp on
call serial_out
and p1,#11111101B ;Q2 on p1.1
ld r2,#0bh
ld r3,fire_value
ldc r0,#20h[rr2] ;0f20h
or p1,#02H
or p2,#03H ;Q1 Q2 Q3 off
ld serial_data,r0 ;temp on
call serial_out
and p2,#11111110B ;Q3 on p2.0
led_scan_end:
ret
;************************************************************************
; serial out subroutine
serial_out:
rl serial_data ;p2.2=data 2<-data
rl serial_data
ld r0,#08 ;n=8
serial_out_loop:
ld r1,serial_data
and p2,serial_clk_0 ;clk=0
and r1,#04H ;bit 2 (P2.2) Keep on
or p2,r1 ;bit 2 (P2.2) serial out
or p2,serial_clk_1 ;clk=1
rr serial_data ;bit 0 first, bit 7 end
dec r0 ;serial_number-1=0?
jr nz,serial_out_loop ;if serial_number=0 end, else again
ret
;***************************************************************************
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -