⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_display.src

📁 使用三星芯片的控制程序,可供三星8位MCU初学者参考!
💻 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 + -