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

📄 cdc_fw_v13_asm.asm

📁 一个利用51单片机实现对的简易功能的控制cd-rom的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
   sjmp irtplay
 irtka1:
   cjne a,#15h,irtka2       ;ir clr
   setb disp_e
   mov LED_W,#11100111B
   MOV LED_D,#00001000B     ;-- 
   call delay_100000us
   call delay_100000us
   clr disp_e
   mov ir_num,#00h
   mov ir_temp,#00h
   ljmp ir_tloop2 
 irtka2:
   cjne a,#11h,irtka3       ;ir exit
   ljmp ir_t_ret
 irtka3:  
   jb play_key,irtsp        ;play
   call delay_10ms
   jb play_key,irtsp
   jnb play_key,$
   ljmp irtplay
 irtsp:
   jb stop_key,irtk1        ;stop
   call delay_10ms
   jb stop_key,irtk1
   jnb stop_key,$
   ljmp ir_t_ret 
 irtk1:
   mov a,driver_status
   cjne a,#56h,irtk22
   ljmp iloopre
  irtk22:
   ljmp iloop2re
   
 irtplay:
    mov a,ir_num
    cjne a,#00h,irpccc
    mov ir_temp,#00h
    ljmp ir_track
  irpccc: 
    mov a,end_track
    cjne a,ir_num,irol
    ljmp play_ir_track
  irol:
    
    jc irover
    
 play_ir_track:
    
    mov next_track,ir_num
    clr ea
   setb disp_e
   mov LED_W,#11111011B
   MOV LED_D,#10000000B  ;. 
   call delay_100000us
   clr disp_e
   call read_toc_cmd
   setb disp_e
   mov LED_W,#11110011B
   MOV LED_D,#10000000B  ;.. 
   ;call delay_100000us
   clr disp_e
   call play_entire_cd_cmd
   setb disp_e
   mov LED_W,#11100011B
   MOV LED_D,#10000000B  ;... 
   call delay_100000us
   mov LED_W,#11000011B
   MOV LED_D,#10000000B  ;....
   call delay_100000us
   clr disp_e
   setb ea
   ljmp ir_t_ret
 irover:
   setb disp_e
   mov LED_W,#11100111B
   MOV LED_D,#01000000B  ;-- 
   call delay_100000us
   call delay_100000us
   call delay_100000us
   clr disp_e
   mov ir_num,#00h
   mov ir_temp,#00h 
   ljmp ir_tloop2

 ir_t_ret:
    mov ir_temp,#00h
    mov ir_code,#0ffh
    mov driver_status,#0ffh
    ret



ir_track_disp:
  setb ea
  Mov DPTR,#NUM16
  mov a,ir_num
  call hextodec
  SETB DISP_E
  mov LED_W,#11101111B ;选择位
  mov a,a_bit
  MOVC A,@A+DPTR 
  Mov LED_D,a          ;笔划
  call delay_1000us
  Mov LED_w,#0FFH
  Mov LED_D,#0H
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;十位
  ;;;;;;;;;;;;;;;;;;;
  mov LED_W,#11110111B ;选择块
  mov a,b_bit
  MOVC A,@A+DPTR 
  Mov LED_D,a          ;笔划
  call delay_1000us
  Mov LED_w,#0FFH
  Mov LED_D,#0H
  mov LED_W,#11011011B
  MOV LED_D,#01000000B  ; - 
  call delay_1000us
  Mov LED_w,#0FFH
  Mov LED_D,#0H
  clr disp_e
  ret   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;改变显示模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
change_disp:
  setb ea
  mov r1,#0h
  mov a,DM_code
  cjne a,#0,DM_a
  ljmp dm_0a
 dm_a:
  cjne a,#1,DM_b
  ljmp dm_1a
 dm_b:
  cjne a,#2,DM_c
  ljmp dm_2za
 dm_c:
  cjne a,#3,DM_d
  ljmp dm_3a
 dm_d:
  mov DM_code,#0
 sjmp change_disp
 



;;;;;;;;;;;;;;;;;;;;;;;;;;;
DM_0:                              
   ;call delay_10ms
   jb play_key,DMRET0  ;
   sjmp dm_0a
  DMRET0:
   ljmp change_disp
  DM_0a:
   setb DISP_E
   mov LED_W,#11110111B
   MOV LED_D,#00111001B   ;c
   call delay_1000us
   mov LED_W,#11101111B
   MOV LED_D,#10111111B  ;0.
   call delay_1000us
   CLR DISP_E
   jnb play_key,DM_0a
   inc DM_code
 DM0_loop:               ;正计数模式  
              
   call key_wait
   call disc_wait
   mov a,show_all
   cjne a,#0a0h,dm01
   jmp  DM0_loop
  dm01: 
   call disp_m0
   call s_c0
   cjne r1,#0aah,dm0a    ;r1=0aah 表示显示模式要改变
   sjmp change_disp
  dm0a:
   sjmp  DM0_loop
 
 disp_m0:
   mov e_t,current_track
   mov e_m,current_m
   mov e_s,current_s
   mov d_m,current_m
   mov d_s,current_s
   call disp_info
   call lcm_disp
   ret
   
   
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DM_1:
   ;call delay_10ms
   jb play_key,dm1bc 
   sjmp dm_1a
  dm1bc:
   ljmp change_disp
  DM_1a:
   setb DISP_E
   mov LED_W,#11110111B
   MOV LED_D,#00111001B  ;c
   call delay_1000us
   mov LED_W,#11101111B
   MOV LED_D,#10000110B  ;1.
   call delay_1000us
   CLR DISP_E
   jnb play_key,DM_1a
   ;call read_toc_cmd
   ;call read_subchan_cmd
   ;mov d_track,current_track
   mov dm_code,#2
DM1_loop:                      ;;;倒计时模式
   call key_wait
   call disc_wait
   mov a,show_all
   cjne a,#0a0h,dm11
   jmp  DM1_loop
  dm11: 
   ;call read_subchan_cmd
   ;mov   a,audio_status
   call toc_rn
   call disp_m1
   call s_c1
   cjne r1,#0aah,dm1a
   ljmp change_disp
 dm1a:
   sjmp  DM1_loop
 dm1b:
   ret

  
disp_m1:                    
  call m1_ms
  mov e_t,current_track
  mov e_m,d_m
  mov e_s,d_s
  call disp_info
  call lcm_disp
  ret
 
 m1_ms:                              ;;;;;倒计时算法
   mov a,end_m
   cjne a,current_m,M1_subb
   mov a,end_s                    
   subb a,current_s
   mov d_s,a
   mov d_m,#0
   sjmp m1_ret
 dm1_2:
   mov a,end_s
   mov psw,#0h
   cjne a,current_s,dm1_subb
   mov d_s,#0h
   sjmp m1_ret
  dm1_subb:
    jc s_subb_m1  ; end_s<current_s
    jnc s_subb_m2  ; end_s>currnet_s
 s_subb_m1: 
   mov a,#61
   subb a,current_s
   add a,end_s
   mov d_s,a
   dec d_m
  sjmp m1_ret
 s_subb_m2:
   mov a,end_s
   subb a,current_s
   mov d_s,a
   sjmp m1_ret
 M1_subb:
   mov a,end_m
   subb a,current_m
   mov d_m,a
   sjmp dM1_2
 m1_ret:
   ret

toc_rn:
  mov a,current_track
  cjne a,d_track,toc_read
  ret
 toc_read:
  mov next_track,current_track 
  call read_toc_cmd
  mov d_track,current_track
  ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
DM_2z:
   ;call delay_10ms
   jb play_key,dm2zz
   sjmp dm_2za
  dm2zz:
   ljmp change_disp  
  DM_2za:
   setb DISP_E
   mov LED_W,#11110111B
   MOV LED_D,#00111001B  ;c
   call delay_1000us
   mov LED_W,#11101111B
   MOV LED_D,#11011011B  ;2.
   call delay_1000us
   CLR DISP_E
   jnb play_key,DM_2za
   ;call read_toc_cmd
   ;call read_subchan_cmd
   mov d_track,current_track
   mov dm_code,#3
DM2_loop:                      ;;;单曲正计时模式
   call key_wait
   call disc_wait
   mov a,show_all
   cjne a,#0a0h,dm21
   jmp  DM2_loop
  dm21: 
   ;call read_subchan_cmd
   
   ;mov   a,audio_status
   call toc_rn
   
   call disp_m2z
   call s_c2
   cjne r1,#0aah,dm2a
   ljmp change_disp
 dm2a:
   sjmp  DM2_loop
 dm2b:
   ret

disp_m2Z:
  call info_mode_2
  call disp_info_2
  call lcm_disp
ret
debug0:
   setb DISP_E
   mov LED_W,#11110111B
   MOV LED_D,#10111110B  ;c
   call delay_1000us
   clr disp_e
   ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DM_3:
   ;call delay_10ms
   jb play_key,dm3bc 
   sjmp dm_3a
  dm3bc:
   ljmp change_disp
  DM_3a:
   setb DISP_E
   mov LED_W,#11110111B
   MOV LED_D,#00111001B  ;c
   call delay_1000us
   mov LED_W,#11101111B
   MOV LED_D,#11001111B  ;3.
   call delay_1000us
   CLR DISP_E
   jnb play_key,DM_3a
   ;call read_toc_cmd
   ;call read_subchan_cmd
   mov d_track,current_track
   mov dm_code,#4
DM3_loop:                      ;;;单曲倒计时模式
   call key_wait
   call disc_wait
   mov a,show_all
   cjne a,#0a0h,dm31
   jmp  DM3_loop
  dm31: 
   call toc_rn
   call disp_m3
   call s_c3
   cjne r1,#0aah,dm3a
   ljmp change_disp
 dm3a:
   sjmp  DM3_loop
 dm3b:
   ret

disp_m3:                    
  call m3_ms
  mov e_t,current_track
  mov e_m,d_m
  mov e_s,d_s
  call disp_info
  call lcm_disp
  ret
 
 m3_ms:                              ;;;;;倒计时算法
   mov a,n_m
   cjne a,current_m,dm3_2
   mov a,n_s                    
   subb a,current_s
   mov d_s,a
   mov d_m,#0
   sjmp m3_ret
 dm3_2:
   mov a,n_s
   mov psw,#0h
   cjne a,current_s,dm3_subb
   mov d_s,#0h
   sjmp M3_subb
  dm3_subb:
    jc m3_subb_1  ; n_s<current_s
    jnc m3_subb_2 ; n_s>current_s
 m3_subb_1: 
   mov a,#61
   subb a,current_s
   add a,n_s
   mov d_s,a
   mov a,n_m
   subb a,current_m
   mov d_m,a
   dec d_m
   sjmp m3_ret
 m3_subb_2:
   mov a,n_s
   subb a,current_s
   mov d_s,a
   sjmp M3_subb
 M3_subb:
   mov a,n_m
   subb a,current_m
   mov d_m,a
   ;sjmp dM3_2
 m3_ret:
   ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp_info_2:
 mov e_t,current_track
 mov e_s,d_s
 mov e_m,d_m
 call disp_info
 ret 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;播放显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;
;LCM显示
;;;;;;;;;;;;;
S_start:
        clr ea
        setb disp_e
        mov r5,#16
        mov a,#00h         ;设置DDRAM地址
        ORL     A,#80H         
        CALL    LCDWC
        mov dptr,#M_start
        mov a,#0
        mov r6,#0h
        call lcm_string         
        CLR disp_e
        setb ea       
        ret
m_start:
DB 'Starting...        '
LCM_string:
        movc a,@a+dptr
        CALL    LCDWD       
        dec r5
        cjne r5,#0,tc2
        sjmp rrt
        tc2:
        inc r6
        mov a,r6
        sjmp LCM_string
        rrt:
        ret 


LCM_disp:
       CLR EA              ;关中断
       setb disp_e         ;开显示控制
       call disp_mh       ;显示 : 号
       call LCM_Track     ;显示曲目
       call s_clr_tt      ;空格
       call LCM_M         ;显示分
       call LCM_S         ;显示妙
       clr disp_e          ;关显示控制
       setb ea             ;开中断
       ret



s_clr_tt:
        mov r5,#1
        mov a,#0Ah         ;设置DDRAM地址
        ORL     A,#80H         
        CALL    LCDWC
        mov dptr,#M_tt
        mov a,#0
        mov r6,#0h
        call lcm_string         
        ret
M_tt:
DB '   '   
disp_MH:
        mov a,#0Dh         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,#':'
        CALL    LCDWD  
        ret
    
    LCM_S:
      mov dptr,#lcm_num
      mov a,e_s
      call hextodec
      acall LCM_Sb
      acall LCM_Sa
      ret
    LCM_M:
      mov dptr,#lcm_num
      mov a,e_m
      call hextodec
      acall LCM_Mb
      acall LCM_Ma
      ret  
    LCM_Track:
      mov dptr,#lcm_num
      mov a,e_t
      call hextodec
      acall LCM_Tb
      acall LCM_Ta
      ret  
    LCM_Sb:
        mov a,#0Eh         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,b_bit
        acall tc
        ret
    LCM_Sa:  
        mov a,#0Fh         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,a_bit
        acall tc
        ret
    LCM_Mb:
        mov a,#0Bh         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,b_bit
        acall tc
        ret
    LCM_Ma:
        mov a,#0Ch         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,a_bit
        acall tc
        ret
    LCM_Tb:
        mov a,#07h         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,b_bit
        acall tc
        ret
    LCM_Ta:
        mov a,#08h         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,a_bit
        acall tc
        ret
tc:
 movc a,@a+dptr
 call lcdwd
 ret
 
lcm_num:
db '0123456789' 
S_repeat_ab:
      call s_rpt
      mov a,track_a
      call hextodec
      mov a,#48h         ;设置DDRAM地址
      acall s_atb
      mov a,#49h         ;设置DDRAM地址
      acall s_ata
        CLR EA
        setb disp_e
        mov a,#4ah         ;设置DDRAM地址
        ORL     A,#80H     ;LCM上的物理地址    
        CALL    LCDWC      ;写地址
        mov a,#'-'
        CALL    LCDWD  
        clr disp_e
        setb ea
      mov a,track_b
      call hextodec
      mov a,#4bh         ;设置DDRAM地址
      acall s_atb
      mov a,#4ch         ;设置DDRAM地址
      acall s_

⌨️ 快捷键说明

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