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

📄 cdc_fw_v13_asm.asm

📁 一个利用51单片机实现对的简易功能的控制cd-rom的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
  mov a,#0
  call set_v 
  ret
 v_dn10:
  mov a,volume_1
  subb a,#10 
  call set_v
  ret
 set_v: 
  mov volume_1,a
  mov volume_2,a 
  mov r0,#0c1h
  mov @r0,volume_1
  mov r0,#0c3h
  mov @r0,volume_2
  ret
     
scmd:             ;改变音量
  clr ea
  call mode_select_cmd
  call send_data
  ;call skip_rest_of_packet2
  setb ea
ret

send_data:
 mov r1,#0B0h
 mov r0,#12
set_head_data_loop: 
 mov a,@r1
 inc r1
 mov b,@r1 
 acall set_data
 inc r1
 call delay_1000us
djnz r0,set_head_data_loop 
ret
  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Key control 按键功能
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY_DEL:
  mov r6,#200
DEL1:  
  mov r7,#20
DEL2:
  djnz r6,DEL2
  djnz r7,DEL1
ret
key_wait_s:
   mov a,ir_key
   cjne a,#18h,kwsa0
   call ir_eject
   mov ir_key,#0ffh
   ret
   kwsa0:
   jnb stop_key,eject_s
   ret
eject_s:
  call delay_10ms
  jb stop_key,esret
  call e_cd
 esret:
  ret

key_wait:
   setb ea 
   call ir_key_wait         ;查询有无红外线码输入
   jnb play_key,play_cdd      
   jnb pause_key,pause_cdd 
   jnb pre_key,prevous_d
   jnb next_key,next_d
   jnb stop_key,Stop_cdd
   mov a,ir_code
   cjne a,#0ceh,kwtab
   call s_clr              ;清屏LCM
   call s_space
   call ir_track
   ret
  kwtab:
   cjne a,#0abh,kwtret
   call ir_a_b
   kwtret:
   ret
play_cdd:                         ;播放按键
 call play_cd
 ret
pause_cdd:                        ;停止按键
 call pause_cd
 ret
prevous_d:                        ;上一曲按键
 call delay_10ms
 caod:                                
 call delay_10ms
 jnb pre_key,bwd_cd
 call prevous
 ret
 bwd_cd:
  call delay_100000us
  jb pre_key,caod
  call delay_100000us
  jb pre_key,caod
  call delay_100000us
  jb pre_key,caod
  call delay_100000us
  jb pre_key,caod
  call backward
  call fb_msf_play
  ret


next_d:                      ;下一曲按键
 call delay_10ms
 jnb next_key,fwd_cd
 JHY:                        
 call next
 ret 
 fwd_cd:
  call delay_100000us
  jb next_key,JHY
  call delay_100000us
  jb next_key,JHY
  call delay_100000us
  jb next_key,JHY
  call delay_100000us
  jb next_key,JHY
  call forward
  call fb_msf_play
  ret


stop_cdd:                     ;停止
  call delay_10ms
  jb stop_key,stopret
  call stop_cd
  jb stop_key,stopret
  call eject_cd
 stopret:
  ret



play_cd_s:                       ;播放指定曲
  call delay_10ms
  jnb play_key,Cnex2
cnex1:
 ret
Cnex2:
  mov r3,#00h
  inc r3
  mov next_track,r3
  call read_toc_cmd
  call play_entire_cd_cmd
r_ne2:
  mov packet_6,#00h
sjmp  cnex1


play_cd:                         ;播放
  call delay_10ms
  jnb play_key,PR_D  
  sjmp PR_D3
 PR_D:  
  call read_subchan_cmd
  mov a,audio_status
  cjne a,#12h,PR_D1  
  call resume_cd
  sjmp PR_D3
 PR_D1:
  cjne a,#11h,PR_D2
  call delay_10ms
  call delay_10ms
  call delay_10ms
  jnb play_key,PR_D4
  sjmp PR_D3
 PR_D4:
  mov r1,#0aaH         ;显示模式转换标志
  sjmp pr_d3
 PR_D2:
  call play_cd_s
 PR_D3:
 ret


prevous:                            ;上一曲
  ;acall delay_10ms
  ;jnb pre_key,CPRE 
  ;ret
CPRE:
  mov a,current_track
  cjne a,#01,maop    
  mov a,end_track
  inc a
  ;sjmp r_pe
 maop:
  dec a
  mov next_track,a
  call read_toc_cmd
  call play_entire_cd_cmd
 r_pe:
  mov packet_6,#00h
ret

next:                                ;下一曲
  ;acall delay_10ms
  ;jnb next_key,Cnex
  ;ret
Cnex:
  mov a,current_track
  cjne a,end_track,xich      
  mov a,#00h
xich:
  inc a
  mov next_track,a
  call read_toc_cmd
  call play_entire_cd_cmd
r_ne:
  mov packet_6,#00h
ret


pause_cd:                    ;暂停
 call delay_10ms
 jnb pause_key,Cpau
 ret
 Cpau:
 mov   a,#0ffh               ;set byte counter register
 call set_cyl_low_register  ;(set it to full on.. it doesn't matter coz
 call set_cyl_high_register ;DRQ controls the feed)
 call do_packet_cmd
 mov   packet_cmd,#4Bh
 mov   packet_1,#00000000b   ;MSF=1
 mov   packet_4,#000h        ;allocation length
 mov   packet_8,#000h        ;(again, set it to full on)
 call send_packet
 jnb STATUS_REG_DRQ,PC1
 PC1:
ret

stop_cd:                      ;停止
  call delay_10ms
  jnb stop_key,Csto
 ret
csto: 
  mov a,#0ffh               
  call set_cyl_low_register  
  call set_cyl_high_register 
  call do_packet_cmd
  mov   packet_cmd,#4Eh
  mov   packet_1,#00000000b   
  call send_packet
  mov next_track,start_track
SC3:
  mov toc_times,#5
ret


forward:                                ;快进
   call s_forward
   mov pause_da,#07h      ;速度初始值
   call read_subchan_cmd
 fo_start:  
   call track_inc
   call s_msf_pn
   
   jnb play_key,fo_play_ret
   jnb stop_key,fo_cancel
   jnb next_key,cf_speed       ;改变速度
   ;sjmp cf_speed 
  csfor:
   mov a,ir_key
   cjne a,#0bh,ir_fora    ;判断遥控有无输入      
   sjmp ir_froward_p      ;再按下>>键,play
  ir_fora:
   cjne a,#12h,ir_forb       
   sjmp ir_froward_p      ;再按下enter键,play
  ir_forb:
   cjne a,#0dh,ir_forc       
   sjmp ir_f_spd          ;再按下>>键,改变速度
  ir_forc:
   cjne a,#11h,fo_start   ;mode 退出     
   sjmp ir_for_ret
 fo_play_ret:
   call delay_10ms
   jb play_key,fo_start
  ir_froward_p:
   call fb_msf_play
   ;call read_subchan_cmd
   mov next_track,current_track
   call read_toc_cmd
   ret
 fo_cancel:
   call delay_10ms
   jb stop_key,fo_start
   jnb stop_key,$
  ir_for_ret:
   call read_subchan_cmd
   mov ir_key,#0ffh
   ret
 
 cf_speed:
   call delay_10ms
   jb next_key,csfor
   jnb next_key,$
 ir_f_spd:
   mov a,pause_da
   cjne a,#1,cfsd1   
   mov pause_da,#07h ;速度最快为1,否则为7
   mov ir_key,#0ffh
   sjmp fo_start
  cfsd1: 
   dec pause_da
   dec pause_da      ;改变速度值
   mov ir_key,#0ffh
   sjmp fo_start
 
 
 
 track_inc:
   mov a,current_m
   cjne a,n_m,time_inc
   mov a,current_s
   cjne a,n_s,time_inc
   mov a,current_track
   cjne a,end_track,trackil
   setb disp_e
   mov LED_W,#11011111B
   MOV LED_D,#00001000B  ;_
   call delay_1000us
   call delay_1000us
   clr disp_e
   ret
   
trackil:   
   inc current_track
   mov next_track,current_track
   call read_toc_cmd
   sjmp track_inc
time_inc:  
   mov a,current_s
   cjne a,#60,c_s_ad            ;当前秒是60?
   mov current_s,#0h
   mov a,current_m
   cjne a,end_m,c_m_ad
   mov current_m,end_m
 c_m_ad:
   inc current_m
   ret
  c_s_ad:
   mov a,current_s
   cjne a,end_s,c_s_cd2
   mov a,current_m
   cjne a,end_m,c_s_cd2
   mov current_s,end_s
   ret
  c_s_cd2:
   inc current_s  
   ret
ret

S_msf_PN:
  push acc
  ;mov pause_da,#07h      ;快进速度
  mov pause_db,pause_da
  mov a,dm_code
  cjne a,#1,MSFPN_1
  PNM0:
  call disp_m0
  djnz pause_db,PNM0
  pop acc
  ret
 MSFPN_1:
  cjne a,#2,MSFPN_2
  PNM1:
  call disp_m1
  djnz pause_db,PNM1
  pop acc
  ret
 MSFPN_2:
  cjne a,#3,MSFPN_3
  PNM2:
  call disp_m2z
  djnz pause_db,PNM2
  pop acc
  ret
 MSFPN_3:
  cjne a,#4,MSFPN_4
  PNM3:
  call disp_m3
  djnz pause_db,PNM3
  pop acc
  ret
 MSFPN_4:
  pop acc
  ret    
  
backward:                      ;快退
   call s_backward
   mov pause_da,#07h           ;速度值
   call read_subchan_cmd
 ba_start:  
   call track_dec
   call s_msf_pn
   jnb play_key,ba_play_ret
   jnb stop_key,ba_cancel
   jnb pre_key,cb_speed
   csbak:
   mov a,ir_key
   cjne a,#0bh,ir_baka    ;判断遥控有无输入      
   sjmp ir_bakward_p      ;按下>键,play
  ir_baka:
   cjne a,#12h,ir_bakb       
   sjmp ir_bakward_p      ;再按下enter键,play
  ir_bakb:
   cjne a,#0eh,ir_bakc       
   sjmp ir_b_spd          ;再按下<<键,改变速度
  ir_bakc:
   cjne a,#11h,ba_start   ;mode 退出     
   sjmp ir_bak_ret
   
   sjmp ba_start
  ba_play_ret:
   call delay_10ms
   jb play_key,ba_start
   jnb play_key,$
  ir_bakward_p: 
   call fb_msf_play
   ;call read_subchan_cmd
   mov next_track,current_track
   call read_toc_cmd
   ret
  ba_cancel:
   call delay_10ms
   jb stop_key,ba_start
   jnb stop_key,$

  ir_bak_ret:
   call read_subchan_cmd
   mov ir_key,#0ffh
   ret
  
  cb_speed:
   call delay_10ms
   jb pre_key,csbak
   jnb pre_key,$
 ir_b_spd:
   mov a,pause_da
   cjne a,#1,cbsd1   
   mov pause_da,#07h ;速度最快为1,否则为7
   mov ir_key,#0ffh
   sjmp ba_start
  cbsd1: 
   dec pause_da
   dec pause_da      ;改变速度值
   mov ir_key,#0ffh
   sjmp ba_start 
   
 track_dec:
   mov a,current_s
   cjne a,start_s,time_dec
   mov a,current_m
   cjne a,start_m,time_dec
   mov a,current_track
   cjne a,#1,Trac_d1
   setb disp_e
   mov LED_W,#11111011B
   MOV LED_D,#00001000B  ;_ 
   call delay_1000us
   call delay_1000us
   clr disp_e
   ret
  trac_d1:
   dec current_track
   mov next_track,current_track
   call read_toc_cmd
   sjmp time_dec
time_dec:  
   mov a,current_s
   cjne a,#0,c_s_dec
   mov a,current_m
   cjne a,#0,c_m_dec
   mov current_s,#0
   mov current_m,#0
   ret
  c_s_dec:
   dec current_s
   ret
  c_m_dec:
   dec current_m
   mov current_s,#59
   ret
   
   


eject_cd:                     ;出盘
  call delay_100000us
  call delay_100000us
  call delay_100000us
  jnb stop_key,e_cd
  ret

 e_cd:
  call mode_sense_cmd
  mov a,media_type
  cjne a,#71H,e_cd_out 
  ljmp e_cd_in
 e_cd_out:
  
  call tray_out
  mov current_s,#0
  mov d_s,#0
  mov current_m,#0
  mov d_m,#0
  ljmp ee_end
 e_cd_in:
  
  call tray_in
  call eje_disp
 ee_end: 
   ret

ir_eject:                     ;红外线出盘指令具体
  call mode_sense_cmd
  mov a,media_type
  cjne a,#71H,ir_e_cd_out 
  sjmp ir_e_cd_in
 ir_e_cd_out:

  call t_out
  mov current_s,#0
  mov d_s,#0
  mov current_m,#0
  mov d_m,#0
  sjmp ir_ee_end
 ir_e_cd_in:
  call t_in
  call eje_disp
 ir_ee_end: 
  mov toc_times,#5
  ret

resume_cd:                    ;恢复播放
call delay_10ms
jnb play_key,Cres
ret
Cres:
   mov a,#0ffh               ;set byte counter register
   call set_cyl_low_register  ;(set it to full on.. it doesn't matter coz
   call set_cyl_high_register ;DRQ controls the feed)
   call do_packet_cmd
   mov   packet_cmd,#4Bh
   mov   packet_1,#00000000b   ;MSF=1
   mov   packet_4,#000h        ;allocation length
   mov   packet_8,#001h        ;(again, set it to full on)
   call send_packet
   jnb STATUS_REG_DRQ,d3
   d3:
   ret

Tray_out:                   ;出盘指令

call delay_10ms
jnb stop_key,t_out
ret
t_out:
    call s_tray_out
    SETB DISP_E
    mov LED_W,#11111110B
    MOV LED_D,#00111111B   ;O
    clr disp_e
mov   a,#0ffh               ;set byte counter register
call set_cyl_low_register  ;(set it to full on.. it doesn't matter coz
call set_cyl_high_register ;DRQ controls the feed)
call do_packet_cmd
mov   packet_cmd,#1bh
mov   packet_1,#00000000b   ;
mov   packet_4,#002h        ;
mov   packet_8,#000h        ;
call send_packet
jb    STATUS_REG_DRQ,dout
dout:
ret

Tray_in:                         ;进盘指令

call delay_10ms
jnb stop_key,t_in
ret
t_in:
    call s_tray_in
    SETB DISP_E
    mov LED_W,#11111110B
    MOV LED_D,#00111001B   ;c
    clr disp_e
mov   a,#0ffh               ;set byte counter register
call set_cyl_low_register  ;(set it to full on.. it doesn't matter coz
call set_cyl_high_register ;DRQ controls the feed)
call do_packet_cmd
mov   packet_cmd,#1bh
mov   packet_1,#00000000b   ;
mov   packet_4,#003h        ;
mov   packet_8,#000h        ;
call send_packet

⌨️ 快捷键说明

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