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

📄 cdc_fw_v13_asm.asm

📁 一个利用51单片机实现对的简易功能的控制cd-rom的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
jb    STATUS_REG_DRQ,din
din:
call act_cmd
ret

fb_msf_play:                      ;按 M S F数据播放指令
  mov start_m,current_m
  mov start_s,current_s
  mov start_f,#0h
  call play_entire_cd_cmd
  mov packet_6,#00h
  ret
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;红外码查询-功能执行
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ir_num_key_wait:                         
   clr ea
   mov a,ir_key
   cjne a,#0ffh,irk_num
   setb ea
   ret
  irk_num:
    mov a,ir_key
    cjne a,#0ah,irkrtt
    sjmp irty45
  irkrtt:
    jnc irktret                    ;>oah,非数字键退出
  irty45:
    mov ir_code,#0CEh              ;是数字键做个0CEh标记
 irktret:  
   mov ir_temp,ir_key
   mov ir_key,#0ffh
   setb ea
   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;具体功能执行
ir_key_wait:
   clr ea
   mov a,ir_key
   cjne a,#0ffh,irktw1
   setb ea
   ret
  irktw1:
   mov dptr,#irKm
   mov b,#2
   mov a,ir_key
   MUL ab
   jmp @A+dptr
irkm:                    ;这里定义了共24个按键功能
   ajmp irk00
   ajmp irk01
   ajmp irk02
   ajmp irk03
   ajmp irk04
   ajmp irk05
   ajmp irk06
   ajmp irk07
   ajmp irk08
   ajmp irk09
   ajmp irk10
   ajmp irk11
   ajmp irk12
   ajmp irk13
   ajmp irk14
   ajmp irk15
   ajmp irk16
   ajmp irk17
   ajmp irk18
   ajmp irk19
   ajmp irk20
   ajmp irk21
   ajmp irk22
   ajmp irk23
   ajmp irk24
   ajmp irk25
   ajmp irk26
 irk00:
   ljmp irk_ret
 
 irk01:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk02:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk03:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk04:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk05:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk06:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk07:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk08:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk09:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk10:
   mov ir_code,#0CEh
   mov ir_temp,ir_key
   ljmp irk_ret_abp
 irk11:                         ;paly/stop
   ;mov a,driver_status
   ;cjne a,#021h,irk11_0
   ;mov driver_status,#031h
   ;ljmp irk_ret
  ;irk11_0: 
   mov a,audio_status
   cjne a,#11h,irk11_1          ;如果正在播放--》stop
   call csto
   ljmp irk_ret
  irk11_1:
   cjne a,#12h,irk11_2         ;如果暂停--》play
   call cres
   ljmp irk_ret
  irk11_2:
   cjne a,#13h,irk11_3         ;如果停止--》play
   mov next_track,#01h
   call read_toc_cmd
   call play_entire_cd_cmd
   ljmp irk_ret
  irk11_3:
   ;cjne a,#14h,irk11_4
   mov next_track,#01h
   call read_toc_cmd
   call play_entire_cd_cmd
   ljmp irk_ret
  ;irk11_4:
   ;ljmp irk_ret   
 irk12:
   mov a,audio_status
   cjne a,#11h,irk12_1          ;如果正在播放--》pause
   call cpau
   ljmp irk_ret
  irk12_1:
   cjne a,#12h,ikr12_2          ;如果暂停--》play
   call cres
   ljmp irk_ret
  ikr12_2:
   ljmp irk_ret
 
 irk13:                         ;>>
    call forward
    ljmp irk_ret_abp
 irk14:                         ;<<
    call backward                       
    ljmp irk_ret_abp
 irk15:
   mov a,audio_status
   cjne a,#11h,irk15_1
   call cnex
  irk15_1:
   ljmp irk_ret_abp
 irk16:
   mov a,audio_status
   cjne a,#11h,irk16_1
   call cpre
  irk16_1:
   ljmp irk_ret_abp

 irk17:
  clr ex1
   mov r0,#090h
 irk17_2:  
    Mov DPTR,#NUM16
    mov a,dm_code
    cjne a,#4,irk17_3
    mov a,#0
  irk17_3:  
    MOVC A,@A+DPTR 
    SETB DISP_E
    mov LED_W,#11110111B
    MOV LED_D,#00111001B   ;c
    call delay_1000us
    mov LED_W,#11101111B
    Mov LED_D,a            ;笔划
    call delay_1000us
    clr disp_e
    djnz r0,irk17_2
    setb ex1
    mov r1,#0aah
    ljmp irk_ret_abp
 irk18:                      ;Enter
    ljmp irk_ret
  irk18_0:
   mov ir_temp,ir_key
   ljmp irk_ret

 irk19:
   mov ir_temp,ir_key
 
  ljmp irk_ret
 irk20:
  ljmp irk_ret
 irk21:
   ;mov a,driver_status
   ;cjne a,#021h,irk21_0
   mov driver_status,#0ffh
   ljmp irk_ret
 irk21_0:
   mov ir_temp,ir_key
   ljmp irk_ret
 irk22:
   ;mov a,ir_code
   mov a,play_mode
   cjne a,#0bah,irk22_0
   mov play_mode,#0ffh
   ljmp irk_ret_abp
  irk22_0:
   mov ir_code,#0abh
   ljmp irk_ret_abp
 irk23:                 ;Repeat
   mov a,ir_code
   cjne a,#0eah,irk23_0 ; ea--循环判断值,ircode=eah 表示循环中 
   mov ir_code,#0ffh    ;当第二次按下repeat 退出重复,ir_code=#0ffh
   ljmp irk_ret_abp
  irk23_0: 
   mov ir_code,#0eah
   mov track_a,current_track
   ljmp irk_ret_abp
 irk24:
   call ir_eject
   ljmp irk_ret
 irk25:
   clr ea
   call mode_sense_10
   mov 44h,#11h
   call v_change
   ;mov volume_1,#020h
   ;mov volume_2,#020h
   call set_v
   ;call delay_100000us
   call scmd
   setb ea
   call delay_100000us
   ljmp irk_ret_abp
 irk26:
   clr ea
   call mode_sense_10
   mov 44h,#99h
   call v_change
   ;call delay_100000us
   call scmd
   setb ea
   call delay_100000us
   ljmp irk_ret_abp
 irvolumejudge:              ;判断是否在改变音量
   mov a,44h
   cjne a,#11h,ivj1
   ret
 ivj1:
   cjne a,#99h,ivj2
   ret 
 ivj2:
   call mode_sense_cmd_0e
   ret
   
 irk_ret:                   ;完全返回
   mov ir_temp,ir_key
   mov ir_key,#0ffh
   mov ir_code,#0ffh
   setb ea
   ret  
 irk_ret_abp:                ;不改变ir_code 返回
   mov ir_temp,ir_key
   mov ir_key,#0ffh
   setb ea
   ret
 
 
 ir_a_b:
   mov driver_status,#56h
   mov track_a,#00h
   mov track_b,#00h
   mov ir_temp,#00h
   mov ir_key,#00h
   mov ir_num,#00h
  track_a_loop:
   setb ea
   call ir_num_key_wait
   acall ab_num_in
   mov track_a,ir_num
   acall disp_track_a
   
   mov a,ir_temp
   cjne a,#12h,abira1        ;ir enter
   
   mov a,ir_num             ;判断输入的track是否在范围内
   cjne a,#00h,tnoca2
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh 
   sjmp track_a_loop
 tnoca2:
   mov a,end_track
   cjne a,ir_num,tnoca3
  tnoca3:
   jc tnoca4                 ;超出
   mov track_a,ir_num
   mov ir_temp,#0ffh
   mov ir_num,#00h
   ajmp track_b_loop         ;跳到b track输入
  
  tnoca4:
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh 
   setb disp_e
   mov LED_W,#11100111B
   MOV LED_D,#00000001B     ;-- 
   call delay_100000us
   call delay_100000us
   call delay_100000us
   clr disp_e
   sjmp track_a_loop

  abira1:
   cjne a,#15h,abira2        ;clr
   mov track_a,#00h
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh
   sjmp track_a_loop
  abira2:
   cjne a,#11h,abira3        ;ir mode
   mov ir_code,#0ffh
   ret
  abira3:
   jb stop_key,track_a_loop
   call delay_100000us
   jb stop_key,track_a_loop
   jnb stop_key,$
   mov ir_code,#0ffh
   ret
  
track_b_loop:
   setb ea
   call ir_num_key_wait
   acall ab_num_in
   mov track_b,ir_num
   acall disp_track_b
   
   mov a,ir_temp
   cjne a,#12h,baira1        ;ir enter
   mov a,ir_num              ;判断输入的track是否在范围内
   cjne a,#00h,tnocb2
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh 
   sjmp track_b_loop
 tnocb2:
   mov a,end_track
   cjne a,ir_num,tnocb3
  tnocb3:
   jc tnocb4                 ;超出
   mov track_b,ir_num
   call a_b_start
   mov ir_code,#0BAh         ;标记0bah
   mov ir_key,#0ffh
   ret
  
  tnocb4:
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh 
   setb disp_e
   mov LED_W,#00111111B
   MOV LED_D,#00000001B  ;-- 
   call delay_100000us
   call delay_100000us
   call delay_100000us
   clr disp_e
   sjmp track_b_loop
     
  baira1:
   cjne a,#15h,baira2        ;clr
   mov track_a,#00h
   mov ir_num,#00h
   mov driver_status,#055h
   mov ir_temp,#0ffh
   sjmp track_b_loop
  baira2:
   cjne a,#11h,baira3        ;ir mode
   mov ir_code,#0ffh
   ret
  baira3:
   jb stop_key,track_b_loop
   call delay_100000us
   jb stop_key,track_b_loop
   jnb stop_key,$
   mov ir_code,#0ffh
   ret
 
 
 ab_num_in:
   mov a,ir_code
   cjne a,#0ceh,ab_num_ret
   mov a,ir_temp
   cjne a,#0ah,irab0
   mov ir_temp,#0h
 irab0: 
   mov a,driver_status
   cjne a,#55h,ab_num_56
   mov ir_num,ir_temp
   mov driver_status,#56h
   sjmp ab_num_ret
  ab_num_56:
    mov b,#10
    mov a,ir_num
    mul ab
    add a,ir_temp
    mov ir_num,a 
    mov driver_status,#55h
  ab_num_ret:
    mov ir_code,#0ffh
    ret
 
 
 disp_track_a:
   call s_ab_fmt
   call s_a
   setb disp_e
   mov LED_W,#11111111B
   MOV LED_D,#00000000B     ; 
   call delay_1000us
   mov LED_W,#11111110B
   MOV LED_D,#01110111B     ;A 
   call delay_1000us
   clr disp_e
   acall disp_ab
   ret 
 
 disp_track_b:
   call s_ab_fmt
   call s_b
   setb disp_e
   mov LED_W,#11111110B
   MOV LED_D,#01111100B     ;b 
   call delay_1000us
   clr disp_e
   acall disp_ab
   ret
 disp_ab:
   Mov DPTR,#NUM
   mov a,track_a
   call HEXtodec
   call disp_m
   mov a,track_b
   call HEXtodec
   call disp_s
   setb disp_e
   mov LED_W,#11011111B
   MOV LED_D,#01000000B     ;- 
   call delay_1000us
   mov LED_W,#11111111B
   MOV LED_D,#00000000B     ; 
   call delay_1000us
   call delay_1000us
   call delay_1000us
   call delay_1000us
   clr disp_e
   ret
a_b_start:
   mov a,track_a
   cjne a,track_b,abdiff
  ;;a=b
   cjne a,end_track,abdiffe
   ;a=end_track
   mov abb_m,end_m
   mov abb_s,end_s
   mov aba_t,track_a
   mov next_track,track_a
   sjmp play_aba
 abdiffe:                  
  mov next_track,track_a
  inc next_track
  call read_toc_cmd
  mov abb_m,start_m
  mov abb_s,start_s
  mov next_track,track_a
  mov aba_t,track_a
  sjmp play_aba
 
 abdiff:                     ;a<>b  
  jc bmorea

  mov a,track_a              ;a>b
  cjne a,end_track,abddera
  mov abb_m,end_m
  mov abb_s,end_s
  mov aba_t,track_b
  sjmp play_aba
 
 abddera:
  mov next_track,track_a
  inc next_track
  call read_toc_cmd
  mov abb_m,start_m
  mov abb_s,start_s
  mov aba_t,track_b
  sjmp play_aba
 
 bmorea:                  ;a<b
  mov a,track_b
  cjne a,end_track,abdderb
  mov abb_m,end_m
  mov abb_s,end_s
  mov aba_t,track_a
  sjmp play_aba
  
abdderb:
  mov next_track,track_b
  inc next_track
  call read_toc_cmd
  mov abb_m,start_m
  mov abb_s,start_s
  mov aba_t,track_a
  sjmp play_aba
 
 play_aba:
  mov next_track,aba_t
  call read_toc_cmd
  call play_entire_cd_cmd
  call read_subchan_cmd
  ;ret
  b_msfdec:                ;最终-1,解决显示问题
   mov a,abb_s
   cjne a,#00h,bmsfd1
   mov abb_s,#59
   dec abb_m
  bmsfd1:
   dec abb_s
   call disp_x
   
   mov ir_code,#0bah
   mov play_mode,#0bah
  ret

ir_track:
   mov driver_status,#55h
 ir_loop_t:
   mov a,ir_temp
   cjne a,#0ah,irttv
   mov ir_temp,#0h
 irttv:
   mov ir_num,ir_temp
 ir_tloop1:                      
   mov ir_code,#0ffh
   call ir_track_disp           ;;;;;;;;;;;;
   call s_ir_track
   mov driver_status,#56h
   call ir_num_key_wait         ;红外数字键有效
   ljmp ir_t_key
 iloopre:
   mov a,ir_code
   cjne a,#0ceh,ir_tloop1
   mov a,ir_temp                 ;;;;;;;;;;;;;;;
   cjne a,#0ah,irttv2
   mov ir_temp,#0h
 irttv2:
    mov b,#10
    mov a,ir_num
    mul ab
    add a,ir_temp
    mov ir_num,a 
 
 ir_tloop2: 
    mov ir_code,#0ffh
    call ir_track_disp           ;;;;;;;;;;;;
    call s_ir_track
    mov driver_status,#55h
    call ir_num_key_wait
    ljmp ir_t_key
   iloop2re:
     mov a,ir_code
     cjne a,#0ceh,ir_tloop2
     mov ir_code,#0ffh
     sjmp ir_loop_t

 
 ir_t_key:                  ;功能键等待
   mov a,ir_temp
   cjne a,#12h,irtka0       ;ir enter
   sjmp irtplay
 irtka0:  
   cjne a,#0bh,irtka1       ;ir play

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -