dy/dx 计算i dxsiny 2dy 看看哪里错了

DX帮看看错在哪了(已上图) - 耳机知识网
DX帮看看错在哪了(已上图)
DX帮看看错在哪了(已上图)
赞助商广告
赞助商广告
用遥控控制下一曲键不能用;*& CD-ROM控制器& Firmware& (单LCD显示版本)&
For NEC 4disc changer& & & & *;***************************************************************************;*& 标题:CD-ROM控制器& firmware& & & &
版本:V3.5ND for 0mini遥控器-18& &
*;*& 更新日期: -06.10& & & & & & & & & & & & & & & & & & & & & &
*;*& 程序编写: 吴巍(创梦电子工作室)& & & & & & & & & & & & & & & & & & & &
*;*& E-mail:& & & & & & & & & & & & & & & & & & & & & & *;*& 网址:& & & & & & & & & & & & & & & & & & & & &
*;*& 说明:用89S52控制光驱读音频CD(光驱改成CD机)& & & & & & & & & & & & & &
*;***************************************************************************;*注:单片机89C52/S52&
晶振12Mhz& & & & & & & & & & & & & & & & & & & & &
*;*本程序搭配CDROM控制器 V3.0版本PCB& & & & & & & & & & & & & & & & & & & & *;***************************************************************************;在CDROM控制器V3.5版本的基础上修改;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE_BASE EQU 0031hSTACK_START EQU 85h&;ctrl busDA0 bit p2.5DA1 bit p2.6DA2 bit P2.7;ctrlATA_nDIOR& & &
p3.7 ;read strobeATA_nDIOW& & &
p3.6 ;write strobeATA_nRESET& & & bit&
p3.2ATA_INTRQ& & &
p3.5 ;irq;data busATA_DATA_LS& &
data& p0ATA_DATA_MS& &
data& p1;ir_control_codeir_code data 5bH;display ctrl& 显示控制DISP_E& bit p3.4& & & & &显示控制;---------------------新版本更改的三根引脚定义,分号后为老版本的引脚定义-------------RSPIN&
P1.6;P2.7RWPIN&
P1.7;P3.0EPIN& & EQU& &
P3.4;P3.1;display data busLCM_D& data P0& ;& LCM BUS;Keyplay_key&
bit p2.0pause_key& bit p2.1pre_key& & bit p2.2next_key&
bit p2.3stop_key&
bit p2.4packet_size& &
data& 08hstart_track& &
data& 09hend_track& & &
data& 69htmp0& & & & & & data& 0ahtmp1& & & & & & data& 0bhtmp2& & & & & & data& 0chtmp3& & & & & & data& 0dhstart_M& & & &
data& 0ehstart_S& & & &
data& 0fhstart_F& & & &
data& 10hend_M& & & & &
data& 11hend_S& & & & &
data& 12hend_F& & & & &
data& 13haudio_status& & data& 14hcurrent_track&
data& 60hcurrent_M& & &
data& 61hcurrent_S& & &
data& 62hcurrent_F& & &
data& 63hnext_track& & & data& 64hmedia_type& & & data& 67hvolume_1& & & & data& 42hvolume_2& & & & data& 43hsense_code& & & data& 45hshow_all& & & & data& 46hmech_S_0& & & & data& 44h& & & &mechanism status header 0 bytemech_s_1& & & & data& 47h& & & &mechanism status header 1 byteslot_N& & & & & data& 48h& & & &slot numberSlot_DI& & & &
data& 49h& & & &slot disc information ,4bit&
0000x x x x,x=1 disc in slot,slot_Q& & & & & data& 4ah& & & &changer slot q'tyslot_SN& & & &
data& 2ehND_M& & &
bit 77no disc mark ,slot select usePlay_mk&
bit 78h;play_mk=1& play cd command& Delay_REQ bit 77h;延迟请求,当=1,程序运行时候会执行延迟指令,用在遥控多重按键功能处理上IR_RPS& data 17hir_tmp data 33hVFD_LGH data 34haba_t& & & & &
data& 16habb_m& & & & &
data& 18habb_s& & & & &
data& 19hErr_cd_code& &
data& 15htoc_times& & &
data& 54h& & & &pause_da& & & & data& 53hpause_db& & & & data& 52hir_temp data 50hir_key data 58hir_num data 51hdriver_status data 59h& & & & & & & & & & & & &play_mode& data 4chtrack_a data 4fh& & & & & & & ;循环开始结束曲track_b data 4dh& & & & & &a_bit data 65hb_bit data 66hDM_code data 68hd_track data 6ahd_s& data 6chd_m& data 6dhn_s& data 6ehn_m& data 6fhE_M& data 57h& & & & & &要显示用得M S TE_s& data 56hE_t& data 55h& & &packet_tab& & & idata 70hpacket_cmd& & & data& 70hpacket_1& & & & data& 71hpacket_2& & & & data& 72hpacket_3& & & & data& 73hpacket_4& & & & data& 74hpacket_5& & & & data& 75hpacket_6& & & & data& 76hpacket_7& & & & data& 77hpacket_8& & & & data& 78hpacket_9& & & & data& 79hpacket_10& & &
data& 7ahpacket_11& & &
data& 7bhpacket_12& & &
data& 7chpacket_13& & &
data& 7dhpacket_14& & &
data& 7ehpacket_15& & &
data& 7fhORG 0000HAJMP bootORG 00013H ;外部中断P3.3脚INT1入口地址AJMP INTORG 030Hboot:org CODE_BASEclr EA;SETB EA ;打开CPU总中断请求clr ex0 ;关掉其他中断clr et1clr esclr et0SETB IT1 ;设定INT1的触发方式为脉冲负边沿触发SETB EX1 ;打开INT1中断请求 (红外线输入)mov ir_code,#0ffhSETB EA ;打开CPU总中断请求mov VFD_LGH,#00Hclr Delay_REQljmp& start;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;红外线控制程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;INT:& CLR EA& & & &暂时关闭CPU的所有中断请求& MOV R6,#8& & ;为兼容11.2896MHZ,缩短延迟数 ,原先12M的时候是 10SB:&& ;SJMP YS0& & &转到882微秒延时判断子程序& call YS1& jb p3.3,exitSBB:& & & & & & ;延时882微秒中判断P3.3脚是否出现高电平如果有就退出解码程序& DJNZ R6, SB& & ;重复'R6次,目的是检测在8820微秒内如果出现高电平就退出解码程序& & & & & & & &以上完成对遥控信号的9000微秒的初始低电平信号的识别。& JNB P3.3, $& & ;等待高电平避开9毫秒低电平引导脉冲& ;ACALL YS2& & & ;延时4.74毫秒避开4.5毫秒的结果码& call ys3;1000ms& call ys3;1000ms& MOV R4,#2 ;如果在2.5ms出现低电平表示重复按键irRP:& MOV R5,#248CK_loop:& jnb P3.3,RP_FUN& DJNZ R5,CK_loop& DJNZ R4,irRP ;& call ys4;600ms&& MOV R1,#5CH& & ;设定1AH为起始RAM区& MOV R2,#4PP:& MOV R3,#8& JJJJ:& JNB P3.3,$& &等待地址码第一位的高电平信号& call YS1& & & ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态& MOV C,P3.3& &将P3.3引脚此时的电平状态0或1存入C中& JNC UUU& & & & ;如果为0就跳转到UUU& call YS3UUU:&
MOV A,@R1& &将R1中地址的给A&
RRC A& & & &将C中的值0或1移入A中的最低位&
MOV @R1,A& &将A中的数暂时存放在R1中&
DJNZ R3,JJJJ& ;接收地址码的高8位&
INC R1& & & & ;对R1中的值加1,换下一个RAM&
DJNZ R2,PP& & ;接收完16位地址码和8位数据码和8位数据反码,存放在5CH/5DH/5EH/5FH的RAM中&
mov a,5eh&
CPL A& & & &对1AH取反后和1BH比较&
CJNE A,5fH,EXIT& & & ;如果不等表示接收数据发生错误,放弃&
cjne a,#0FFh,ir_rec& ;如果是0FFH,转入长按键处理&
RP_FUN:&all change_light&
jnb P3.3,$&
call RPSKEY;长按遥控处理&
sjmp Exit& ir_rec:&mov ir_code,5fh& & mov ir_RPS,#00h;重复计数清零&
call ir_key_codeEXIT:&
SETB EA ;允许中断&
RETI ;退出解码子程序RPSKEY:&
mov a,ir_RPS&
cjne a,#04H,INCPRS;重复按键灵敏度 4次以后,生效&
mov ir_RPS,#00h&
call Ir_KPD; 按键第二功能&
inc ir_RPS&
retIr_KPD:; 按键第二功能& mov a,ir_temp& cjne a,#14h,irkp01& mov ir_key,#13h& ;call change_light& retirkp01:& & cjne a,#10h,irkp02& & mov ir_key,#0eh& & retirkp02:& & cjne a,#0Fh,irkp03& & mov ir_key,#0dh& & retirkp03:& & retYS0:& MOV R4,#220irD0:&
JB P3.3,EXIT&
DJNZ R4,irD0&
SJMP SBBYS1:& MOV R4,#20 ;延时子程序1,精确延时882微秒irD1:& MOV R5,#20& DJNZ R5,$& DJNZ R4,irD1& RETYS2:& MOV R4,#10 ;延时子程序2,精确延时4740微秒irD2:& MOV R5,#235& DJNZ R5,$& DJNZ R4,irD2& RETYS3:& MOV R4,#2;延时程序3,精确延时1000微秒irD3:& MOV R5,#248& DJNZ R5,$& DJNZ R4,irD3& RETYS4:& MOV R4,#20 ;延时子程序1,精确延时600微秒irD4:& MOV R5,#12& DJNZ R5,$& DJNZ R4,irD4& RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;不同的遥控器键值修改此处;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IR_key_code:& mov a,5dh& & & & & & &判断遥控器种类& ;cjne a,#69h,irkc2& ;ljmp IR_key_code_69;irkc2:;cjne a,#0cfh,irkc3;ljmp IR_key_code_cfirkc3:& cjne a,#0f7h,irkc4& ljmp IR_key_code_ffirkc4:irkc5:irkc6:& ljmp ir_kcretIR_key_code_ff:& & & & & & & & && mov a,5fh& & & & & & & &定义键值,将接收到红外线原码定义成具体的红外键值,&& cjne a,#0a0h,ir_confff2& mov ir_key,#01h& & & & & ;1& & & & & &
将F6的红外码定义为 1 按键 键值为 #01H& ljmp ir_kcretir_confff2:& cjne a,#0e3h,ir_confff3& mov ir_key,#02h& & & & & ;2& & & & & &
将E2的红外码定义为 2 按键& ljmp ir_kcretir_confff3:& cjne a,#0e0h,ir_confff4& mov ir_key,#03h& & & & & ;3& ljmp ir_kcretir_confff4:& cjne a,#0A1h,ir_confff5& mov ir_key,#04h& & & & & ;4& ljmp ir_kcretir_confff5:& cjne a,#0E2h,ir_confff6& mov ir_key,#05h& & & & & ;5& ljmp ir_kcretir_confff6:& cjne a,#0E1h,ir_confff7& mov ir_key,#06h& & & & & ;6& ljmp ir_kcretir_confff7:& cjne a,#0A8h,ir_confff8& mov ir_key,#07h& & & & & ;7& ljmp ir_kcretir_confff8:& cjne a,#0EBh,ir_confff9& mov ir_key,#08h& & & & & ;8& ljmp ir_kcretir_confff9:& cjne a,#0E8h,ir_confff10& mov ir_key,#09h& & & & & ;9& ljmp ir_kcretir_confff10:& cjne a,#0EAh,ir_confff11& mov ir_key,#0ah& & & & & ;0& ljmp ir_kcretir_confff11:& ;cjne a,#0B0h,ir_confff12&& ;mov ir_key,#0bh& & & & & ;play& & &
将AE的红外码定义为 play/stop 按键,键值为#0Bh& ;ljmp ir_kcretir_confff12:& cjne a,#0B0h,ir_confff13&& mov ir_key,#0bh& & & & & ;pause/resume& && ljmp ir_kcretir_confff13:& ;cjne a,#0FAh,ir_confff14&& ;mov ir_key,#0dh& & & & & ;forward& & & & & 将E1的红外码定义为 forward 按键,键值为#0Dh& ;ljmp ir_kcretir_confff14:& ;cjne a,#0f9h,ir_confff15&& ;mov ir_key,#0eh& & & & & ;backward& ;ljmp ir_kcretir_confff15:& cjne a,#0F0h,ir_confff16&& mov ir_key,#0fh& & & & & ;next& setb Delay_REQ& ljmp ir_kcretir_confff16:& cjne a,#0F3h,ir_confff17&& mov ir_key,#010h& & & &previous& setb Delay_REQ& ljmp ir_kcretir_confff17:& cjne a,#0A9h,ir_confff18&& mov ir_key,#11h& & & & & ;Time& ljmp ir_kcretir_confff18:& ;cjne a,#0A9h,ir_confff19&& ;mov ir_key,#12h& & & & & ;Enter& ;ljmp ir_kcretir_confff19:& ;cjne a,#0b7h,ir_confff20&& ;mov ir_key,#13h& & & & & ;setup& ;ljmp ir_kcretir_confff20:& ;cjne a,#0B1h,ir_confff21&& ;mov ir_key,#14h& & & & & ;Power---Eject& ;ljmp ir_kcretir_confff21:& cjne a,#0B1h,ir_confff22& mov ir_key,#14h& & & & & ;ALT& setb Delay_REQ& ljmp ir_kcretir_confff22:& ;cjne a,#0F4h,ir_confff23&& ;mov ir_key,#16h& & & & & ;A-B& ;ljmp ir_kcretir_confff23:& cjne a,#0E9h,ir_confff24&
mov ir_key,#17h& & & & & ;repeat&mov a,play_mode&cjne a,#0BAh,ir_ 循环判断值,ircode=0xABh 表示 A-B循环中&mov ir_key,#11h;在AB循环模式中,这个按键=exit time& ljmp ir_kcretir_confff24:& cjne a,#0F1h,ir_confff25& mov ir_key,#18h& & & & & ;eject& ljmp ir_kcretir_confff25:&cjne a,#0B0h,ir_confff26&mov ir_key,#19h& & & & & ;volume+&ljmp ir_kcretir_confff26:&cjne a,#0B1h,ir_confff27&mov ir_key,#1ah& & & & & ;volume-&ljmp ir_kcretir_confff27:&
cjne a,#0F2h,ir_confff28&
mov ir_key,#1bh& & & & & ;Stop&
ljmp ir_kcretir_confff28:&&
mov ir_key,#0ffh&
ljmp ir_kcret&ir_kcret:& ret;=============延时程序============&delay_100000us:& mov&
r7,#0c8hdelay_100000us_l0:& mov&
r6,#0f8hdelay_100000us_l1:& djnz& r6,delay_100000us_l1& nop& djnz& r7,delay_100000us_l0& ret&delay_10ms:& mov&
r7,#100delay_10ms_l0:& mov&
r6,#100delay_10ms_l1:& djnz& r6,delay_10ms_l1& nop& djnz& r7,delay_10ms_l0& ret&;r5 = secondsdelay:& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& call delay_100000us& djnz& r5,delay& retdelay_1s:& mov r5,#01& call delay& ret;-------------------------------------------------------------------&&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CD-ROM控制指令源代码;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; atomic routines;; Nb/ code assumes 1us clock cycle (12Mhz xtal clock);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;read_cycle:& mov&
ATA_DATA_LS,#0ffh& mov&
ATA_DATA_MS,#0ffh& clr&
ATA_nDIOR& mov&
a,ATA_DATA_LS& mov&
b,ATA_DATA_MS& setb& ATA_nDIOR& retread_cycle_ls:& mov&
ATA_DATA_LS,#0ffh& clr&
ATA_nDIOR& mov&
a,ATA_DATA_LS& setb& ATA_nDIOR& retwrite_cycle:& mov&
ATA_DATA_LS,a& mov&
ATA_DATA_MS,b& clr&
ATA_nDIOW& nop& setb& ATA_nDIOW& retwrite_cycle_ls:& mov&
ATA_DATA_LS,a& clr&
ATA_nDIOW& nop& setb& ATA_nDIOW& retwait_irq:& ;setb& ATA_INTRQ& jnb&
ATA_INTRQ,wait_irq& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cylinder register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_cyl_high_register:;mov&
ATA_ADDR,#b& setb DA2& CLR& DA1& SETB DA0&& call read_cycle_ls& retget_cyl_low_register:;& mov&
ATA_ADDR,#b& setb DA2& CLR& DA1& CLR& DA0& call read_cycle_ls& retset_cyl_high_register:;& mov&
ATA_ADDR,#b& setb DA2& CLR& DA1& SETB DA0& call write_cycle_ls& retset_cyl_low_register:;mov&
ATA_ADDR,#b& setb DA2& CLR& DA1& CLR& DA0& call write_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; a = cmd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;set_cmd_register:;& mov&
ATA_ADDR,#b& setb DA2& SETB DA1& SETB DA0& call write_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; data register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret: a = ls& b = msget_data:;& mov&
ATA_ADDR,#b& CLR& DA2& CLR& DA1& CLR& DA0& call read_cycle& ret; a = ls& b = msset_data:;& mov&
ATA_ADDR,#b& CLR& DA2& CLR& DA1& CLR& DA0& call write_cycle& ret; a = lsset_data_ls:;& mov&
ATA_ADDR,#b& CLR& DA2& CLR& DA1& CLR& DA0& call write_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; device/head register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_devhead_register:;& mov&
ATA_ADDR,#b& setb& DA2& SETB& DA1& CLR&
DA0& call read_cycle_ls& retset_devhead_register:;& mov&
ATA_ADDR,#b& setb& DA2& SETB& DA1& CLR&
DA0& call write_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; error register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ERROR_REG_AMNF& bit acc.0ERROR_REG_TK0NF bit acc.1ERROR_REG_ABRT& bit acc.2ERROR_REG_MCR&
bit acc.3ERROR_REG_IDNF& bit acc.4ERROR_REG_MC& & bit acc.5ERROR_REG_UNC&
bit acc.6ERROR_REG_RES&
bit acc.7get_error_register:;& mov&
ATA_ADDR,#b& CLR& DA2& CLR& DA1& SETB DA0& call read_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sector register's;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;get_sector_c_register:;& mov&
ATA_ADDR,#b& CLR&
DA2& SETB& DA1& CLR&
DA0& call read_cycle_ls& retget_sector_n_register:;& mov&
ATA_ADDR,#b& CLR&
DA2& SETB& DA1& SETB& DA0& call read_cycle_ls& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; status register;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;STATUS_REG_ERR& bit acc.0STATUS_REG_IDX& bit acc.1STATUS_REG_CORR bit acc.2STATUS_REG_DRQ& bit acc.3STATUS_REG_DSC& bit acc.4STATUS_REG_DF&
bit acc.5STATUS_REG_DRDY bit acc.6STATUS_REG_BSY& bit acc.7get_status_register:;& mov&
ATA_ADDR,#b& setb& DA2& SETB& DA1& setb& DA0& call read_cycle_ls& retbsy_wait:& nop& nop& nop& nop& call get_status_register& jb& & STATUS_REG_BSY,bsy_wait& retbsy_drdy_wait:& nop& nop& nop& nop& call delay_100000us& call get_status_register& jb& & STATUS_REG_BSY,bsy_drdy_wait& jnb&
STATUS_REG_DRDY,bsy_drdy_wait& retdrq_wait:& nop& nop& nop& nop& call get_status_register& jb& & STATUS_REG_BSY,drq_wait& jnb&
STATUS_REG_DRQ,drq_wait& retndrq_wait:& nop& nop& nop& nop& call get_status_register& jb& & STATUS_REG_BSY,drq_wait& jb& & STATUS_REG_DRQ,drq_wait& retIO_CoD_Wait:& call get_sector_c_register& jnb acc.0,IO& & & & &check CoD& sjmp io_cod_waitIO:& jnb acc.1,io_cod_wait& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; main routines;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; misc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;terminate_with_error:;mov r5,#2h;call delaycall s_wait& ret& sjmp& $; clocks data out of buffer until all done (DRQ goes low);skip_rest_of_packet:& call get_status_register& jnb&
STATUS_REG_DRQ,skip_rest_of_packet_d& call get_data& sjmp& skip_rest_of_packetskip_rest_of_packet_d:& ret;skip_rest_of_packet2:;& call get_status_register;& jnb&
STATUS_REG_DRQ,skip_rest_of_packet_d2;& call set_data;& sjmp& skip_rest_of_packet2;skip_rest_of_packet_d2:;& ret&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init ATA device routines..;; also detects the device during the process of initing it.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init_ata_device:clr ea; do hard reset..;; nb/ you have a wait a bit after pulling the reset back high. if you; don't, then bsy flag will falsey pass. i haven't figured out a way; yet to determine when the device controller is busy during hard reset;& clr&
ATA_nRESET& call delay_100000us& setb& ATA_nRESET& mov&
r5,#2& call delay& call s_ver& mov&
r5,#1& call delay& call S_space& call s_MCU_ST& call bsy_wait&;select device 0;;the device will now respond to commands now;& call get_devhead_register& clr&
acc.4& & & & & &set device to 0& call set_devhead_register; test for device signature to determine if it's 'packet command' device; if it's not a packet command, then it's probably a harddisk or; something, and we can't continue.;; we have to check this inorder to know if we can issue the 'identify; packet device' ATA command.;& call bsy_wait& call get_cyl_low_register& cjne& a,#14h,init_device_s_error_L& call get_cyl_high_register& cjne& a,#0ebh,init_device_s_error_h& sjmp& init_device_s_doneinit_device_s_error:& ;ajmp& terminate_with_error_iniinit_device_s_error_ini:sjmp $init_device_s_error_H:call s_IDE_errorsjmp $init_device_s_error_L:call s_IDE_errorsjmp $init_device_s_done:; running self diagonistics..; nb/ this is the first ATA command we send;& mov&
a,#90h& call set_cmd_register& call bsy_wait& mov a,#0& call get_error_register& jb& & acc.0,init_device_c1& ajmp& terminate_with_error_ini_s_doneterminate_with_error_ini_s_done:sjmp $init_device_c1:& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ATAPI identify packet device;; this ATA/ATAPI command is mandatory for CDROM (and like) devices, as it; will enable the DRDY flag. without this command, we won't be able to; issue any commands (ATA or packet).;; nb/ older ATA standards, DRDY goes high immediately after BSY goes low; during reset. .. not so for CDROM);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;identify_packet_device:clr ea;identify device cmd;& mov&
a,#2h& & & & & & & &set byte count registers& call set_cyl_high_maximum transfer length = 0200h& clr&
a& & & & & & & & & &nb/ on the few devices i've tested, this& call set_cyl_low_register& ;cmd automatically sets these registers.& & & & & & & & & & & & & & & ;but i'll set)& mov&
a,#0a1h& call set_cmd_register& call wait_irq; get general config word;& call get_data& clr&
a& jb& & acc.0,identify_packet_device_c2& jb& & acc.1,identify_packet_device_c2& mov&
a,#6identify_packet_device_c2:& jb& & acc.0,identify_packet_device_c3& jnb&
acc.1,identify_packet_device_c3& mov&
a,#8identify_packet_device_c3:& mov&
packet_size,a& call skip_rest_of_packet& call bsy_drdy_waitcall s_start& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;do_packet_cmd:clr ea; clr packet table& mov&
r0,#packet_tab& mov&
r7,#16init_pck_l:& mov&
@r0,#0& inc&
r0& djnz& r7,init_pck_l; send packet command;& call IO_CoD_wait& call ndrq_wait& mov&
a,#0a0h& call set_cmd_register& retsend_packet:&
call drq_wait&
r0,#packet_tab& ;mov&
r7,#packet_size&
mov r7,#06hsend_packet_l:& mov&
a,@r0& inc&
r0& push& acc& mov&
a,@r0& inc&
acc& call set_data& djnz& r7,send_packet_l& call wait_irq& call get_status_register& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;action cmd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACT_CMD:ret& clr ea& mov&
a,#16h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#5ah& mov&
packet_1,#08H& ;& mov&
packet_2,#01& ;PC and page Code& mov&
packet_7,#0ffh& & & & ;allocation length& mov&
packet_8,#0ffh& & & & ;allocation length& call send_packet& jb& & STATUS_REG_DRQ,act_ok& sjmp act_cmd&act_ok:& call skip_rest_of_packet& ret&&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; test unit ready ATAPI command;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test_unit_ready_cmd:& clr ea& call do_packet_cmd& call send_packet& jnb&
STATUS_REG_ERR,test_unit_ready_d& clr&
c& rettest_unit_ready_d:& setb& c& retwait_for_ready_state:& mov&
r2,#2wait_for_ready_state_l:& ;mov&
r5,#1& ;call delay& call test_unit_ready_cmd& jnc&
wait_for_ready_state_l& dec&
r2& cjne& r2,#0,wait_for_ready_state_l& ret&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Table of Contents command;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;read_toc_cmd:& call delay_100000us& call s_x& & & & & ;关显示音量& mov sense_code,#001h& clr ea& mov&
a,#0ffh& & & & & & &set byte counter register& acall set_cyl_low_register& ;(set it to full on.. it doesn't matter coz& acall set_cyl_high_DRQ controls the feed)& acall do_packet_cmd& mov&
packet_cmd,#43h& mov&
packet_1,#b&MSF=1& mov&
packet_7,#0FFh& & & & ;allocation length& mov&
packet_8,#0FFh& & & & ;(again, set it to full on)& acall send_packet&& jb& & STATUS_REG_DRQ,read_toc_cmd_rread_toc_cmd_e:& ;acall read_toc_cmd& ajmp& terminate_with_error_Rterminate_with_error_R:ret;mov r5,#1h;call delay;ret;sjmp $; read header;read_toc_cmd_r:& acall get_data& & &data length& acall get_data& & &get track limits& mov&
start_track,a& mov&
end_track,b& mov a,next_track& cjne a,end_track,read_toc_cmd_l2& sjmp read_toc_cmd_l2_end; read track descriptorsread_toc_cmd_l2:& acall get_data&get ADR and control fields& acall get_data&get track number& mov&
tmp0,a& acall get_data&& mov&
tmp1,b& acall get_data& mov&
tmp2,a& mov&
tmp3,b;& record MSF position,ready for play& mov&
a,tmp0& cjne a,next_track,read_toc_cmd_i0_p& mov&
start_M,tmp1& mov&
start_S,tmp2& mov&
start_F,tmp3read_toc_cmd_i0_P:& & & & & & & & & ;next_track不是最后一曲& inc next_track& cjne a,next_track,read_toc_cmd_i0_3& ;是下一曲吗?是--继续& mov n_m,tmp1& mov n_s,tmp2read_toc_cmd_i0_3:& cjne& a,#0aah,read_toc_cmd_i1_2& mov&
end_M,tmp1& ;dec end_m& mov&
end_S,tmp2& mov&
end_F,tmp3& call fix_msf& & & & & & & & & & & &fix msfread_toc_cmd_i1_2:& dec next_track& acall bsy_wait& jb& & STATUS_REG_DRQ,read_toc_cmd_l2& setb& c& retread_toc_cmd_l2_end:& acall get_data&get ADR and control fields& acall get_data&get track number& mov&
tmp0,a& acall get_data&& mov&
tmp1,b& acall get_data& mov&
tmp2,a& mov&
tmp3,b& mov&
a,tmp0cjne a,next_track,read_toc_cmd_i0_end& mov&
start_M,tmp1& mov&
start_S,tmp2& mov&
start_F,tmp3read_toc_cmd_i0_end:& cjne& a,#0aah,read_toc_cmd_i1_2_end& mov&
end_M,tmp1& mov&
end_S,tmp2& mov&
end_F,tmp3& call fix_msf& mov n_s,end_s& mov n_m,end_mread_toc_cmd_i1_2_end:& acall bsy_wait& jb& & STATUS_REG_DRQ,read_toc_cmd_l2_end& setb& c& ret&fix_msf:& & & & & & & & & & ;修正sony一些旧光驱MSF会多出几秒,导致播放出错问题ret;& mov a,end_s;& cjne a,#3,fmsf1;& mov end_s,#00h;& ret; fmsf1:;& jnc msf3;& dec end_m;& mov a,#3;& mov end_s,a;& mov a,#59;& subb a,end_s;& mov end_s,a;& ret&& ; msf3:& ;& dec end_s& ;& dec end_s& ;& dec end_s& ;& ret& &&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; play MSF cd cmd;按MSF格式播放CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;play_entire_cd_cmd:& call delay_100000us& clr ea& call do_packet_cmd& mov&
packet_cmd,#47h& mov&
packet_3,start_M& mov&
packet_4,start_S& mov&
packet_5,start_F& mov&
packet_6,end_M& mov&
packet_7,end_S& mov&
packet_8,end_F& call send_packet& jnb&
STATUS_REG_ERR,play_audio_cmd_d& ajmp& terminate_with_errorplay_audio_cmd_d:& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; read sub channel cmd;CD播放状态信息;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;read_subchan_cmd:& call delay_100000us& clr ea& mov&
a,#016h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#42h& mov&
packet_1,#b& ;MSF=1& mov&
packet_2,#b& ;SubQ=1& mov&
packet_3,#01h& & & & ;format=01& (current position)& mov&
packet_8,#016h& & &allocation length (16 bytes)& call send_packet& jb& & STATUS_REG_DRQ,read_subchan_cmd_rread_subchan_cmd_e:& mov&
audio_status,#0ffh& ret;read Current Audio track,MSFread_subchan_cmd_r:& call get_data& & &get audio status& mov&
audio_status,b& call get_data& & &sub channel data length (will be zero).. ignore& call get_data& & &data format,adr/fiel& call get_data& & &current track ,index track& mov current_track,a& call get_data& & &M& mov current_M,b&& call get_data& & &SF& mov current_S,a& mov current_F,b& call skip_rest_of_packet& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Load/Unload command;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LOAD_disc_cmd_1:& call delay_100000us& clr ea& mov&
a,#16h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#0A6h& mov&
packet_1,#00H& ;& ret& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& mov&
packet_8,#01h& & & & ;slot No. (NEC CDR-251 Slot= 0 1 2 3)LOAD_disc_cmd_2:& call send_packet& jb& & STATUS_REG_DRQ,load_disc_r& retload_disc_r:& ;call skip_rest_of_packet& ret;;;;----select slot -----------select_slot_1:& call load_disc_cmd_1& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& mov&
packet_8,#00h& & & & ;slot No. (NEC CDR-251 Slot= 0 1 2 3)& call load_disc_cmd_2& retselect_slot_2:& call load_disc_cmd_1& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& mov&
packet_8,#01h& & & & ;slot No. (NEC CDR-251 Slot= 0 1 2 3)& call load_disc_cmd_2& retselect_slot_3:& call load_disc_cmd_1& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& mov&
packet_8,#02h& & & & ;slot No. (NEC CDR-251 Slot= 0 1 2 3)& call load_disc_cmd_2& ret& &select_slot_4:& call load_disc_cmd_1& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& mov&
packet_8,#03h& & & & ;slot No. (NEC CDR-251 Slot= 0 1 2 3)& call load_disc_cmd_2& retunload_disc:& call load_disc_cmd_1& mov&
packet_4,#02h& & & & ;02=unload disc,03=load disc& call load_disc_cmd_2& retload_disc:& call load_disc_cmd_1& mov&
packet_4,#03h& & & & ;02=unload disc,03=load disc& call load_disc_cmd_2& ret&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MECHANISM STATUS CCD-ROM状态信息;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mech_status_cmd:& call delay_100000us& clr ea& mov&
a,#16h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#0BDh& mov&
packet_8,#0ffh& & & & ;allocation length& mov&
packet_9,#0ffh& & & & ;allocation length& call send_packet& jb& & STATUS_REG_DRQ,mech_status_cmd_rmech_status_cmd_e:& ;jmp mech_status_cmd& ;mov& media_type,#0ffh& retmech_status_cmd_r:& mov 2fH,#00& mov slot_DI,#00h& call get_data& mechanism status header& mov mech_s_0,a& mov mech_s_1,b& call get_data& call get_data& mov slot_q,b&Number of slots available& call get_data& call get_data& mov c,acc.7 ; slot 0 disc status& mov 78h,c& call get_data& call get_data& mov c,acc.7 ; slot 1 disc status& mov 79h,c& call get_data& call get_data& mov c,acc.7 ; slot 2 disc status& mov 7ah,c& call get_data& call get_data& mov c,acc.7 ; slot 3 disc status& mov 7bh,c& mov slot_di,2Fh& call skip_rest_of_packet& ret&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CD-ROM状态信息;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mode_sense_cmd:& call delay_100000us& clr ea& mov&
a,#16h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#5ah& mov&
packet_1,#00H& ;& mov&
packet_2,#01H& ;PC and page Code& mov&
packet_7,#0ffh& & & & ;allocation length& mov&
packet_8,#0ffh& & & & ;allocation length& call send_packet& jb& & STATUS_REG_DRQ,mode_sense_cmd_rmode_sense_cmd_e:& jmp mode_sense_cmd& ;mov& media_type,#0ffh& ret;read Current CD-ROM Media Type Codemode_sense_cmd_r:& call get_data&mode Data length& call get_data&Medium Type& mov media_type,a& call skip_rest_of_packet& ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mode sense read 0E读音频控制页;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mode_sense_cmd_0e:& call delay_100000us& clr ea& mov&
a,#016h& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#5ah& mov&
packet_1,#000H& ;& mov&
packet_2,#00eH& ;PC and page Code& mov&
packet_7,#000h& & & & ;allocation length& mov&
packet_8,#018h& & & & ;allocation length& call send_packet& jb& & STATUS_REG_DRQ,mode_sense_cmd_r_0e& jmp&
mode_sense_cmd_0emode_sense_cmd_r_0e:&
mov r7,#12&
mov r1,#0B0h&
get_audio_data_loop:&
acall get_data&
mov @r1,a&
mov @r1,b&
djnz r7,get_audio_data_loop&
mov r0,#0C1h&
mov volume_1,@r0&
mov r0,#0C3h&
mov volume_2,@r0&
call skip_rest_of_packet&
mov sense_code,#0eh&
ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mode select(10);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mode_select_cmd:& call delay_100000us& clr ea& mov&
a,#0FFh& & & & & & & & ;set byte counter register& call set_cyl_low_register& ;= 16 bytes& call set_cyl_high_& call do_packet_cmd& mov&
packet_cmd,#55h& mov&
packet_1,#10H& ;& mov&
packet_2,#000H& ;PC and page Code& mov&
packet_7,#000h& & & & ;allocation length& mov&
packet_8,#018h& & & & ;allocation length& call send_packet& jb& STATUS_REG_DRQ,mode_select_cmd_r& jmp mode_select_cmdmode_select_cmd_r:& setb ea& ret&mode_sense_10:& mov a,sense_code& cjne a,#00eh,ms0e& ret&ms0e:& call mode_sense_cmd_0e& ret&v_change:& mov a,44h& cjne a,#11h,v_tc1& & & & ;11h=volume +& jmp volume_inc& v_tc1:&
cjne a,#99h,v_tc2& & &99h=volume -&
jmp volume_dec&& v_tc2:&&
ret&volume_inc:& mov a,volume_1& cjne a,#245,v_inc& call set_v&& retv_inc:& jc vup10& call set_v&& retvup10:& mov a,volume_1& addc a,#10& call set_v& retvolume_dec:& mov a,volume_1& cjne a,#11,v_dec& mov a,#0& call set_v& retv_dec:& jnc v_dn10& mov a,#0& call set_v& retv_dn10:& mov a,volume_1& subb a,#10& call set_v& retset_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 earetsend_data:mov r1,#0B0hmov r0,#12set_head_data_loop:mov a,@r1inc r1mov b,@r1acall set_datainc r1call delay_1000usdjnz r0,set_head_data_loopret&;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Key control 按键功能;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KEY_DEL:& mov r6,#200DEL1:&& mov r7,#20DEL2:& djnz r6,DEL2& djnz r7,DEL1retkey_wait_s:&
mov a,ir_key&
cjne a,#18h,kwsa0&
call ir_eject&
mov ir_key,#0ffh&
jnb stop_key,eject_s&
reteject_s:& call delay_10ms& jb stop_key,esret& call e_cdesret:& retkey_wait:&
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&
retplay_cdd:& & & & & & & & & & & &播放按键call play_cdretpause_cdd:& & & & & & & & & & & & ;停止按键call pause_cdretprevous_d:& & & & & & & & & & & & ;上一曲按键call delay_10mscaod:& & & & & & & & & & & & & & & &call delay_10msjnb pre_key,bwd_cdcall prevousretbwd_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& retnext_d:& & & & & & & & & & & ;下一曲按键call delay_10msjnb next_key,fwd_cdJHY:& & & & & & & & & & & &call nextretfwd_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& retstop_cdd:& & & & & & & & & &停止& call delay_10ms& jb stop_key,stopret& call stop_cd& jb stop_key,stopret& call eject_cdstopret:& retplay_cd_s:& & & & & & & & & & &播放指定曲& call delay_10ms& jnb play_key,Cnex2cnex1:retCnex2:& mov r3,#00h& inc r3& mov next_track,r3& call read_toc_cmd& call play_entire_cd_cmdr_ne2:& mov packet_6,#00hsjmp& cnex1play_cd:& & & & & & & & & & & &播放& call delay_10ms& jnb play_key,PR_D&& sjmp PR_D3PR_D:&& call read_subchan_cmd& mov a,audio_status& cjne a,#12h,PR_D1&& call resume_cd& sjmp PR_D3PR_D1:& cjne a,#11h,PR_D2& call delay_10ms& call delay_10ms& call delay_10ms& jnb play_key,PR_D4& sjmp PR_D3PR_D4:& jnb play_key,$& ;call change_disp& sjmp pr_d3PR_D2:& call play_cd_sPR_D3:retprevous:& & & & & & & & & & & & & & ;上一曲& ;acall delay_10ms& ;jnb pre_key,CPRE& ;retCPRE:& mov a,current_track& cjne a,#01,maop& && mov a,end_track& inc a& ;sjmp r_pemaop:& dec a& mov next_track,a& call read_toc_cmd& call play_entire_cd_cmdr_pe:& mov packet_6,#00hretnext:& & & & & & & & & & & & & & & & ;下一曲& ;acall delay_10ms& ;jnb next_key,Cnex& ;retCnex:& mov a,current_track& cjne a,end_track,xich& & && mov a,#00hxich:& inc a& mov next_track,a& call read_toc_cmd& call play_entire_cd_cmdr_ne:& mov packet_6,#00hretpause_cd:& & & & & & & & & & ;暂停& call delay_10ms& jnb pause_key,CpauF& retCpauF:& call delay_100000us& jb pause_key,CPAUSE_R& & call delay_100000us& jb pause_key,CPAUSE_R& & call delay_100000us& jb pause_key,CPAUSE_R& & call delay_100000us& jb pause_key,CPAUSE_R& & call delay_100000us& jb pause_key,CPAUSE_R& & call delay_100000us& jnb pause_key,slot_se_mo& CPAUSE_R:& call pause_resume_cd& ret& slot_se_mo:&
call slot_sect&
retCpau:& & & & & & & & & & & & ;pause cd command& call delay_100000us& 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_DRQ controls the feed)& call do_packet_cmd& mov&
packet_cmd,#4Bh& mov&
packet_1,#b&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,PC1PC1:& retslot_sect:& & & & & & & & ;切换碟片& call s_space& call s_clr& & ;clr lcm& call mech_status_cmd& & & & & & && & & & mov a,mech_s_0& & & & & & & clr acc.7& & & & & & & clr acc.6& & & & & & & clr acc.5& & & &
inc a& && & mov slot_sn,a& & mov ir_key,slot_sn& slot_sect1:&&
call mech_status_cmd&call ir_num_key_wait&mov slot_sn,ir_key&
mov a,ir_key&mov slot_sn,ir_num&
cjne a,#015h,sldd2&&
sjmp s2ret&
sldd2:& & cjne a,#0bh,sldd3& & ;按下play 键就选择 slot&
sjmp retsl&
sldd3:& & cjne a,#012h,sldd4& & ;按下enter 键就选择 slot&
sjmp retsl&
cjne a,#011h,sldd5& & jmp IRSLRET&
sldd5:& & mov slot_sn,ir_key& & mov a,slot_sn& & cjne a,#04h,ir_chek&如果输入大于 4,修正为 4。&mov slot_sn,ir_keysldd:&mov slot_sn,ir_key&call delay_100000us&
call key_wait_ID&
call s_slot_info&
call s_slot_sec&
call s_slot_sno&
jnb stop_key,s2ret& & ;stop key----&exit&
jnb play_key,retSL& & ;play key----&load&
call key_wait_ID&
mov ir_key,slot_sn&
jmp slot_sect1& ir_chek:&
mov slot_sn,#04h&
jmp slddS2ret:&
jnb stop_key,$&
call s_space&
call s_clr&
mov ir_key,#0ffh&mov show_all,#0a0h&mov ir_num,#0ffh&
retretsl:&
jnb play_key,$&
call s_load&
mov slot_n,slot_sn&
dec slot_n&
call slot_load&
mov ir_key,#0ffh&mov show_all,#0a0h&
call s_space&
call s_clr&
ret&key_wait_ID:&
jnb next_key,next_add&
jb pre_key,kwiret&
ljmp pre_dec&
retnext_add:& & call delay_10ms& & jb next_key,prret2& & jnb next_key,$& & mov a,slot_sn& & cjne a,#04h,nddd& & mov slot_sn,#4h&
prret2:& & ret&
nddd:& & jnc nddret& & inc slot_sn& & jmp prret& & nddret:& & mov slot_sn,#04h& & ret&prret:&
ret&pre_dec:&
call delay_10ms&
jb pre_key,pdcret&
jnb pre_key,$&
mov a,slot_sn&
cjne a,#1h,dkdk&
dec slot_sn&
ret&&& & & &pause_resume_cd:& call read_subchan_cmd& mov a,audio_status& cjne a,#12h,Pa_CD3& call cres& & &resume cd& retPa_CD3:& cjne a,#11h,Pr_ret& call cpau& & &pause cd& pr_ret:& ret&&&stop_cd:& & & & & & & & & & & ;停止& call delay_10ms& jnb stop_key,Cstoretcsto:& mov a,#0ffh& & & & & & && call set_cyl_low_register&& call set_cyl_high_register& call do_packet_cmd& mov&
packet_cmd,#4Eh& mov&
packet_1,#b&& call send_packet& mov next_track,start_trackSC3:& mov toc_times,#4retforward:& & & & & & & & & & & & & & & & ;快进&
call s_forward&
mov pause_da,#07h& & & ;速度初始值&
call read_subchan_cmdfo_start:&&
call track_inc&
call s_msf_pn&
call s_speed&
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_retfo_play_ret:&
call delay_10ms&
jb play_key,csfor& ir_froward_p:&
call fb_msf_play&&
mov next_track,current_track&
call read_toc_cmd&call read_subchan_cmd&
mov ir_key,#0ffh&
call s_space&
retfo_cancel:&
call delay_10ms&
jb stop_key,fo_start&
jnb stop_key,$& ir_for_ret:&
call read_subchan_cmd&
mov ir_key,#0ffh&
call s_space&
retcf_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,#07速度最快为1,否则为7&
mov ir_key,#0ffh&
sjmp fo_start& cfsd1:&
dec pause_da&
dec pause_da& & & ;改变速度值&
mov ir_key,#0ffh&
sjmp fo_starttrack_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&
ret&trackil:&&
inc current_track&
mov next_track,current_track&
call read_toc_cmd&
sjmp track_inctime_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_mc_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&&
retretdelay_fb:& call delay_10ms& retS_msf_PN:& push acc& ;mov pause_da,#07h& & & ;快进速度& mov pause_db,pause_da& ;mov a,dm_code& ;cjne a,#0,MSFPN_1& PNM0:& call disp_m2z& call delay_fb& djnz pause_db,PNM0& pop acc& ret&&backward:& & & & & & & & & & & ;快退&
call s_backward&
mov pause_da,#07h& & & & &速度值&
call read_subchan_cmdba_start:&&
call track_dec&
call s_msf_pn&
call s_speed&
jnb play_key,ba_play_ret&
jnb stop_key,ba_cancel&
jnb pre_key,cb_speed&
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,csbak&jnb play_key,$& ir_bakward_p:&
call fb_msf_play&call read_subchan_cmd&
mov next_track,current_track&
call read_toc_cmd&
mov ir_key,#0ffh&
call s_space&
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&
call s_space&
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,#07速度最快为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&
ret& trac_d1:&
dec current_track&
mov next_track,current_track&
call read_toc_cmd&
sjmp time_dectime_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& rete_cd:& call mode_sense_cmd& mov a,media_type& cjne a,#71H,e_cd_out& ljmp e_cd_ine_cd_out:&& call tray_out& mov current_s,#0& mov d_s,#0& mov current_m,#0& mov d_m,#0& ljmp ee_ende_cd_in:&& call tray_inee_end:&
retir_eject:& & & & & & & & & &红外线出盘指令具体& call mode_sense_cmd& mov a,media_type& cjne a,#71H,ir_e_cd_out& sjmp ir_e_cd_inir_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_endir_e_cd_in:& call t_inir_ee_end:& mov toc_times,#4& retresume_cd:& & & & & & & & & & ;恢复播放call delay_10msjnb play_key,CresretCres:&
call delay_100000us&
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_DRQ controls the feed)&
call do_packet_cmd&
packet_cmd,#4Bh&
packet_1,#b&MSF=1&
packet_4,#000h& & & & ;allocation length&
packet_8,#001h& & & & ;(again, set it to full on)&
call send_packet&jnb STATUS_REG_DRQ,d3&
retTray_out:& & & & & & & & &出盘指令call delay_10msjnb stop_key,t_outrett_out:& & call s_tray_outmov&
a,#0ffh& & & & & & &set byte counter registercall set_cyl_low_register& ;(set it to full on.. it doesn't matter cozcall set_cyl_high_DRQ controls the feed)call do_packet_cmdmov&
packet_cmd,#1bhmov&
packet_1,#b&mov&
packet_4,#002h& & & & ;mov&
packet_8,#000h& & & & ;call send_packetjb& & STATUS_REG_DRQ,doutdout:retTray_in:& & & & & & & & & & & &进盘指令call delay_10msjnb stop_key,t_inrett_in:& & call s_tray_inmov&
a,#0ffh& & & & & & &set byte counter registercall set_cyl_low_register& ;(set it to full on.. it doesn't matter cozcall set_cyl_high_DRQ controls the feed)call do_packet_cmdmov&
packet_cmd,#1bhmov&
packet_1,#b&mov&
packet_4,#003h& & & & ;mov&
packet_8,#000h& & & & ;call send_packetjb& & STATUS_REG_DRQ,dindin:call delay_100000uscall delay_100000us;call act_cmdretfb_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:& & & & & & & & & & & &&
mov a,ir_key&
cjne a,#0ffh,irk_num&
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&
ret;;;;;;;;;;;;;;;;;;;;;;;;;;具体功能执行ir_key_wait:&
mov a,ir_key&
cjne a,#0ffh,irktw1&
ret& irktw1:&
mov dptr,#irKm&
mov a,ir_key&
jmp @A+dptrirkm:& & & & & & & & & & ;这里定义了共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&
ajmp irk27irk00:&
ljmp irk_retirk01:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk02:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk03:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk04:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk05:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk06:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk07:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk08:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk09:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abpirk10:&
mov ir_code,#0CEh&
mov ir_temp,ir_key&
ljmp irk_ret_abp&
irk11_1ret:&
retirk11:& & & & & & & & & & & &paly/stop& & mov a,driver_status&
cjne a,#0ffh,irk11_1ret&mov a,play_mode&cjne a,#0BAH,irk11_0& ;在 A-B模式 Play用做Enter&ljmp irk_ret&mov driver_status,#031h&ljmp irk_ret& irk11_0:& &
mov a,audio_ 修正sony CDU4811光驱在暂停状态下,执行mode_sense_cmd会出现死机现象,先判断是否暂停,如果是暂停,则跳开mode_sense_cmd,直接执行resume命令& & cjne a,#12h,irk11_0A& & jmp irk11_00&
irk11_0A:& & & & & & && & call mode_sense_cmd&在 open 状态下,按play 直接进仓 并播放& & mov a,media_type& & cjne a,#71H,irk11_00& & call t_in& & setb play_mk&acdre:& & & & & & & & & & &如果tray out---》Tray in ---》Play & call disc_wait& call read_toc_cmd& mov a,end_m& & & & & & & ;判断分如果不是 0x00,就执行play cd& cjne a,#00,iroc& call delay_10ms& call delay_10ms& call delay_10ms& call delay_10ms& jmp acdre&iroC:& jmp irplay_cd& &&
irk11_00:&&
mov a,audio_status&
cjne a,#11h,irk11_1& & & & & ;如果正在播放--》stop&
call cpau&
ljmp irk_ret& irk11_1:&
cjne a,#12h,irk11_2& & & &如果暂停--》play&
call cres&
ljmp irk_ret& irk11_2:&
cjne a,#13h,irk11_3& & & &如果停止--》play& irplay_cd:&
mov next_track,#01h&
call read_toc_cmd&
call play_entire_cd_cmd&
call luchunfang&
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_retirk13:& & & & & & & & & & & &&&& & call forward& & ljmp irk_ret_abpirk14:& & & & & & & & & & & &&&& & call backward& & & & & & & & & & && & ljmp irk_ret_abpirk15:& & & & & & & & & & & & & ;NEXT&
jb Delay_REQ,irk15_2& call delay_100000延迟执行快进,是为了识别是否重复按下& mov a,ir_key& cjne a,#0fh,irk15_0&
mov a,audio_status&
cjne a,#11h,irk15_1&
call cnex& irk15_1:&
ljmp irk_ret_abp& irk15_0:&
ljmp irk_ret_abp& irk15_2:&
ljmp irk_ret_abp2irk16:& & & & & & & & & & & &PRE.& &
setb Delay_REQ&call delay_100000延迟执行快进,是为了识别是否重复按下& &mov a,ir_key& & ;cjne a,#010h,irk16_0&
mov a,audio_status&
cjne a,#11h,irk16_1&
call cpre& irk16_1:&
ljmp irk_ret_abp& &
ljmp irk_ret_abp& &
ljmp irk_ret_abp2irk17:& ;mov a,ir_code& ;cjne a,#0ffh,irk17_0& ;ljmp irk_ret_----------& irk17_0:& clr ex1&
mov r0,#090hirk17_2:&;& & Mov DPTR,#NUM16& & mov a,dm_code& & cjne a,#4,irk17_3& & mov a,#0& irk17_3:&& & ;MOVC A,@A+DPTR& & djnz r0,irk17_2& & setb ex1& & ;call change_disp& & & & & & ;改变显示模式& & ljmp irk_ret_abpirk18:& & & & & & & & & & & ;Enter& & ljmp irk_ret& irk18_0:&
mov ir_temp,ir_key&
ljmp irk_retirk19:&mov ir_temp,ir_key&
call change_light&
ljmp irk_ret&ljmp irk_ret_abpirk20:;;;进入碟片选择状态&
jb Delay_REQ,irk20_2&
call slot_sect&
ljmp irk_ret& irk20_2:&
ljmp irk_ret_abp2irk21:&mov a,driver_status&cjne a,#021h,irk21_0&
mov a,play_mode&
cjne a,#0BAH,irk21_0&
mov play_mode,#0ffh&
mov ir_code,#0ffh&
mov driver_status,#0ffh&
ljmp irk_ret& irk21_1:&
mov ir_temp,ir_key&
ljmp irk_retirk22:&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_abpirk23:& & & & & & & &Repeat &
mov a,play_mode&
cjne a,#0BAh,irk23_0 ; 循环判断值,ircode=0xABh 表示 A-B循环中&
mov play_mode,#0ffh&
mov driver_status,#0ffh&
mov ir_code,#0ffh& & ;当第四次按下repeat 退出重复,ir_code=#0ffh&
call s_space&call reset_data&
ljmp irk_ret&mov ir_key,#11h&
ljmp irk17& irk23_0:&
cjne a,#0deh,irk23_1;; 循环判断值,ircode=0xDEh 表示整碟循环中&&
mov ir_code,#0ABH ;当第三次按下repeat 进入A-B循环,ir_code=#0ABh&
mov play_mode,#0ABh&
ljmp irk_ret_abp&
cjne a,#0eah,irk23_2; 循环判断值,ircode=0xeah 表示单曲目循环中&
mov ir_code,#0deH;当第二次按下repeat 进入整碟循环,ir_code=#0DEh&
mov play_mode,#0deh&
ljmp irk_ret_abp&
mov ir_code,#0&&
mov track_a,current_当第一次按下repeat 进入整碟循环,ir_code=#0eah&
mov play_mode,#0eah&
ljmp irk_ret_abpirk24:&
call ir_eject&
ljmp irk_retirk25:&
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&
call delay_100000us&
ljmp irk_ret_abpirk26:&
call mode_sense_10&
mov 44h,#99h&
call v_change&call delay_100000us&
call scmd&
call delay_100000us&
ljmp irk_ret_abp& irk27:& & call csto& & & & & & & &stop& & ljmp irk_retirvolumejudge:& & & & & & & ;判断是否在改变音量&
mov a,44h&
cjne a,#11h,ivj1&
cjne a,#99h,ivj2&
call mode_sense_cmd_0e&
ret&irk_ret:& & & & & & & & &完全返回&
mov ir_temp,ir_key&
mov ir_key,#0ffh&
mov ir_code,#0ffh&
ret&irk_ret_abp:& & & & & & & & ;不改变ir_code 返回&
mov ir_temp,ir_key&
mov ir_key,#0ffh&
ret& irk_ret_abp2:& & & & & & & & ;不改变ir_key 返回&
mov ir_temp,ir_key&mov ir_key,#0ffh&
retRPT_wait2:;退出判断& clr ea& mov a,ir_key& cjne a,#17h,PRE2ret& mov play_mode,#0ffh& mov ir_key,#0ffh& ;call s_space& PRE2ret:& setb ea& retExit_ABS:& mov ir_code,#0ffh& mov driver_status,#0ffh& mov play_mode,#0ffh& call s_space& retir_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:&
mov a,play_mode&
cjne a,#0abh,Exit_ABS&
call RPT_wait2;检查是否有退出指令请求,再按一下repeat就退出循环&
call ir_num_key_wait&
acall ab_num_in&
mov track_a,ir_num&
call disp_track_a&
mov a,ir_temp&
cjne a,#0bh,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_looptnoca2:&
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&
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&
call s_space&
mov play_mode,#00h& & &exit a-b 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& Exit_ABSb:& mov ir_code,#0ffh& mov driver_status,#0ffh& mov play_mode,#0ffh& rettrack_b_loop:&
mov a,play_mode&
cjne a,#0abh,Exit_ABSb&
call RPT_wait2&
call ir_num_key_wait&
acall ab_num_in&
mov track_b,ir_num&
call disp_track_b&&
mov a,ir_temp&
cjne a,#0bh,baira1& & & & ;ir enter play&
mov a,ir_num& & & & & & & ;判断输入的track是否在范围内&
cjne a,#00h,tnocb2&
mov ir_num,#00h&
mov driver_status,#055h&
mov ir_temp,#0ffh&
sjmp track_b_looptnocb2:&
mov a,end_track&
cjne a,ir_num,tnocb3& tnocb3:&
jc tnocb4& & & & & & & &超出&
mov track_b,ir_num&
call a_b_start&
call s_退出选择显示模式,清屏&
mov driver_status,#0ffh&
mov ir_code,#0BAh& & & &标记0bah&
mov play_mode,#0BAH;输入曲目后,BA模式才生效&
mov ir_key,#0ffh&
ret&& tnocb4:&
mov ir_num,#00h&
mov driver_status,#055h&
mov ir_temp,#0ffh&
sjmp track_b_loop& && baira1:&
cjne a,#15h,baira2& & & & ;clr&mov track_a,#00h&& 修正显示B位的时候,按clr时候会同时清零两个输入数据&
mov ir_num,#00h&
mov driver_status,#055h&
mov ir_temp,#0ffh&
sjmp track_b_loop& baira2:&
cjne a,#11h,baira3& & & & ;ir mode&
call s_退出模式,清屏&
mov play_mode,#00h&
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&
retab_num_in:&
mov a,ir_code&
cjne a,#0ceh,ab_num_ret&
mov a,ir_temp&
cjne a,#0ah,irab0&
mov ir_temp,#0hirab0:&
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& & retdisp_track_a:&
call s_ab_fmt&
acall disp_ab&
retdisp_track_b:&
call s_ab_fmt&
acall disp_ab&
retdisp_ab:&
Mov DPTR,#NUM&
mov a,track_a&
call HEXtodec&
mov a,track_b&
call HEXtodec&
reta_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_abaabdiffe:& & & & & & & & && 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_abaabdiff:& & & & & & & & & &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_abaabddera:& 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_ababmorea:& & & & & & & & & ;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_abaplay_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&&
mov ir_code,#0bah&
mov play_mode,#0bah& retir_track:&
mov driver_status,#55hir_loop_t:&
mov a,ir_temp&
cjne a,#0ah,irttv&
mov ir_temp,#0hirttv:&
mov ir_num,ir_tempir_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_keyiloopre:&
mov a,ir_code&
cjne a,#0ceh,ir_tloop1&
mov a,ir_temp& & & & & & & &;;;;;;;;;;;;;;&
cjne a,#0ah,irttv2&
mov ir_temp,#0hirttv2:& & mov b,#10& & mov a,ir_num& & mul ab& & add a,ir_temp& & mov ir_num,air_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_tir_t_key:& & & & & & & & & ;功能键等待&
mov a,ir_temp&
cjne a,#12h,irtka0& & &ir enter&
sjmp irtplayirtka0:&&
cjne a,#0bh,irtka1& & &ir play&
sjmp irtplayirtka1:&
cjne a,#15h,irtka2& & &ir clr&
mov ir_num,#00h&
mov ir_temp,#00h&
ljmp ir_tloop2irtka2:&
cjne a,#11h,irtka3& & &ir exit&
ljmp ir_t_retirtka3:&&
jb play_key,irtsp& & & & ;play&
call delay_10ms&
jb play_key,irtsp&
jnb play_key,$&
ljmp irtplayirtsp:&
jb stop_key,irtk1& & & & ;stop&
call delay_10ms&
jb stop_key,irtk1&
jnb stop_key,$&
ljmp ir_t_retirtk1:&
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&
call read_toc_cmd&
call play_entire_cd_cmd&
ljmp ir_t_retirover:&
mov ir_num,#00h&
mov ir_temp,#00h&
ljmp ir_tloop2ir_t_ret:& & mov ir_temp,#00h& & mov ir_code,#0ffh& & mov driver_status,#0ffh& & retir_track_disp:& 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& & && & & & retm_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:& & & & & mov a,#016h& & & &设置DDRAM地址& &
修正VFD1602会重复显示上一个字符问题 设置一个无效的地址,跳过显示 & & & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & & CALL& & LCDWC& & & ;写地址& & & & retLCM_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& & & & & &开中断& & &
rets_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& & & && & & & retM_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& & & call LCM_Sb& & & call LCM_Sa& & & ret& & LCM_M:& & & mov dptr,#lcm_num& & & mov a,e_m& & & call hextodec& & & call LCM_Mb& & & call LCM_Ma& & & ret&& & LCM_Track:& & & mov dptr,#lcm_num& & & mov a,e_t& & & call hextodec& & & call LCM_Ta& & & call LCM_Tb& & && & & ret&& & LCM_Sb:& & & & mov a,#0Eh& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,b_bit& & & & call tc& & & & ret& & LCM_Sa:&& & & & mov a,#0Fh& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,a_bit& & & & call tc& & & & ret& & LCM_Mb:& & & & mov a,#0Bh& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,b_bit& & & & call tc& & & & ret& & LCM_Ma:& & & & mov a,#0Ch& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,a_bit& & & & call tc& & & & ret& & LCM_Tb:& & & & mov a,#07h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,b_bit& & & & call tc& & & & ret& & LCM_Ta:& & & & mov a,#08h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,a_bit& & & & call tc& & & & rettc:movc a,@a+dptr& call lcdwdDISP_FX_VFD:& mov a,#016h& & & &设置DDRAM地址& &
修正VFD1602会重复显示上一个字符问题 设置一个无效的地址,跳过显示 & ORL& &
A,#80H& &LCM上的物理地址& && CALL& & LCDWC& & & ;写地址retlcm_num:db''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_ata& & & ret&S_aTb:& & & & CLR EA& & & & setb disp_e& & & & mov dptr,#lcm_num2& & & & ;mov a,#07h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,b_bit& & & & call tc& & & & clr disp_e& & & & setb ea& & & & retS_aTa:& & & & CLR EA& & & & setb disp_e& & & & mov dptr,#lcm_num2& & & & ;mov a,#08h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,a_bit& & & & call tc& & & & clr disp_e& & & & setb ea& & & & retlcm_num2:db''s_speed:;显示快进速度& & call s_s_X& & & & mov a,#4Fh& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & mov a,pause_da& & mov dptr,#lcm_num& & cjne a,#1,SSP01& & & & mov a,#4& & jmp SSDRET& &
SSP01:& & & &
cjne a,#3,SSP02& & & & mov a,#3& & jmp SSDRET& &
SSP02:& & & &
cjne a,#5,SSP03& & & & mov a,#2& & jmp SSDRET& &
SSP03:& & & &
cjne a,#7,SSP04& & & & mov a,#1& & jmp SSDRET& &
SSP04:& & SSDRET:& & & & call tc& & & & retS_S_X:& & & & mov r5,#1& & & & mov a,#04Eh& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_x& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & retM_x:DB 'x'&S_repeat:& & & call s_rpt& & & mov a,track_a& & & call hextodec& & & mov dptr,#lcm_num& & & mov a,#49h& & & &设置DDRAM地址& & & acall s_atb& & & mov a,#4ah& & & &设置DDRAM地址& & & acall s_ata& & & retS_play:& & clr ea& & ;mov a,ir_code& & mov a,play_mode& & cjne a,#0bah,s_py1& & call s_repeat_ab& & setb ea& & ret&&
s_PY1:& & mov a,ir_code& & cjne a,#0eah,s_py2& & call s_repeat& & setb ea& & ret&&
cjne a,#0DEh,s_py3& &
call s_Disc_RPT& &
setb ea& &
call s_playing& &call s_volume& & & & & & & ;显示音量值点阵图& &
setb ea& &
retS_CDrom:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#00h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_cdrom& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & && & & & retm_cdrom:DB ' CD-ROM& PLAYER 's_design:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_design& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_design:DB 'Design By Wu_Wei 's_IDE_error1:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#00h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#IDE_error1& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retIDE_error1:DB 'IDE Connect Err.'S_IDE_error2:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#IDE_error2& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & && & & & retIDE_error2:DB 'Please check IDE'S_IDE_error:call s_IDE_error1call s_IDE_error2rets_MCU_ST:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#80h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_MCu& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retM_MCu:DB 'Checking IDE... 's_playing:& & & & clr ea& & & & setb disp_e& & & & mov r5,#14& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_play& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string&& & & & ;call s2spec& & & & ;显示两个空格& & && & & & CLR disp_e& & & & setb ea& & & & retm_play:DB 'Playing...& & &
's2spec:& & & & mov a,#4CH& & & & & & && & & & ORL a,#80H& & & & & & & & & && & & & call LCDWC& & && & & & mov a,#' '& & & & & & && & & & call LCDWD&& & & & mov a,#4DH& & & & & & && & & & ORL a,#80H& & & & & & & & & && & & & call LCDWC& & && & & & mov a,#' '& & & & & & && & & & call LCDWD&& & & & retS_RPT:& & & & clr ea& & & & setb disp_e& & & & mov r5,#10& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_rpt& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_rpt:DB 'Repeat:& & &
abcdefs_Disc_RPT:& & & & call s_rpT& & & & clr ea& & & & setb disp_e& & & & mov r5,#4& & & & mov a,#49h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_d_rpt& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_d_rpt:DB 'DISC's_wait:retS_C2:retS_A:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#m_a& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_a:DB 'Set&
B 'S_B:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#m_b& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_b:DB 'Set& &
'S_from_to:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#00h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#m_ft& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_ft:DB 'From :& & To:&
's_slot_sno:& & & & ;mov ir_num,#03h& & & & CLR EA& & & & setb disp_e& & & & mov dptr,#lcm_num2& & & & mov a,#09h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov a,slot_sn& & & & call tc& & & & clr disp_e& & & & setb ea& & & & & rets_slot_sec:& & & & clr ea& & & & setb disp_e& & & & mov r5,#8& & & & mov a,#00h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#m_slot_sec& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & retm_slot_sec:DB 'Select :'S_slot_no_disc:& & & & clr ea& & & & setb disp_e& & & & mov r5,#16& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#M_sndc& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & & & CLR disp_e& & & & setb ea& & & & ;call s_space& & & & retm_sndc:DB ' Slot No Disc&
's_slot_info:& && & & & clr ea& & & & setb disp_e& & & & mov r5,#8h& & & & mov a,#40h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& & & && & & & CALL& & LCDWC& & & & mov dptr,#m_slotinfo& & & & mov a,#0& & & & mov r6,#0h& & & & call lcm_string& & & && & mov a,#48h& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & &
mov 2FH,slot_DI& & & &
jnb 78h,s178h& & & &
mov a,#'1'& & & &
jmp sc11& & &
s178h:& & & &
mov a,#' '& & &
sc11:&& & & & CALL& & LCDWD& & & && & mov a,#4ah& & & &设置DDRAM地址& & & & ORL& &
A,#80H& &LCM上的物理地址& && & & & CALL& & LCDWC& & & ;写地址& & & & mov 2FH,slot_DI& & & &
jnb 79h, s179h& & & &
mov a,#'2'& & & &
jmp sc12& & &
s179h:& & & &
mov a,#' '& & &
sc12:&& &

我要回帖

更多关于 计算i dxsiny 2dy 的文章

 

随机推荐