📄 ir_yinyue.ls1
字号:
000E F582 880 MOV DPL,A
0010 E4 881 CLR A
0011 3400 F 882 ADDC A,#HIGH (yin)
0013 F583 883 MOV DPH,A
0015 E4 884 CLR A
0016 93 885 MOVC A,@A+DPTR
0017 F58C 886 MOV TH0,A
887 ; TL0=yin[2*l+1];
888 ; SOURCE LINE # 210
0019 E500 F 889 MOV A,l
001B 25E0 890 ADD A,ACC
001D 2400 F 891 ADD A,#LOW (yin+01H)
001F F582 892 MOV DPL,A
0021 E4 893 CLR A
0022 3400 F 894 ADDC A,#HIGH (yin+01H)
0024 F583 895 MOV DPH,A
0026 E4 896 CLR A
0027 93 897 MOVC A,@A+DPTR
0028 F58A 898 MOV TL0,A
899 ; SPK = !SPK;
900 ; SOURCE LINE # 211
002A B2B7 901 CPL SPK
902 ;
903 ; }
904 ; SOURCE LINE # 213
002C D0D0 905 POP PSW
002E D082 906 POP DPL
0030 D083 907 POP DPH
0032 D0E0 908 POP ACC
0034 32 909 RETI
910 ; END OF timer0
A51 MACRO ASSEMBLER IR_YINYUE 10/24/2006 16:41:18 PAGE 15
911
912 ;
913 ;
914 ;
915 ;
916 ; void sing_song()
917
---- 918 RSEG ?PR?sing_song?IR_YINYUE
0000 919 sing_song:
920 USING 0
921 ; SOURCE LINE # 218
922 ; {
923 ; SOURCE LINE # 219
924 ;
925 ; unsigned int data j; //取码指针
926 ; unsigned char data i; //用于循环
927 ; unsigned char data k; //几个1/4拍
928 ; IR_OK=0; //不能少掉!!!!
929 ; SOURCE LINE # 224
0000 C200 F 930 CLR IR_OK
931 ; song=songs[song_number];
932 ; SOURCE LINE # 225
0002 E500 F 933 MOV A,song_number
0004 25E0 934 ADD A,ACC
0006 2400 F 935 ADD A,#LOW (songs)
0008 F582 936 MOV DPL,A
000A E4 937 CLR A
000B 3400 F 938 ADDC A,#HIGH (songs)
000D F583 939 MOV DPH,A
000F E4 940 CLR A
0010 93 941 MOVC A,@A+DPTR
0011 FE 942 MOV R6,A
0012 7401 943 MOV A,#01H
0014 93 944 MOVC A,@A+DPTR
0015 AA06 945 MOV R2,AR6
0017 7500FF F 946 MOV song,#0FFH
001A 8A00 F 947 MOV song+01H,R2
001C F500 F 948 MOV song+02H,A
949 ; j=0;
950 ; SOURCE LINE # 226
001E E4 951 CLR A
001F F500 F 952 MOV j?755,A
0021 F500 F 953 MOV j?755+01H,A
0023 954 ?C0074:
955 ; while(*(song+j)!=0xFF) //是否取到结束码
956 ; SOURCE LINE # 227
0023 AB00 F 957 MOV R3,song
0025 AA00 F 958 MOV R2,song+01H
0027 A900 F 959 MOV R1,song+02H
0029 850082 F 960 MOV DPL,j?755+01H
002C 850083 F 961 MOV DPH,j?755
002F 120000 F 962 LCALL ?C?CLDOPTR
0032 FF 963 MOV R7,A
0033 F4 964 CPL A
0034 6057 965 JZ ?C0081
966 ; {
967 ; SOURCE LINE # 228
968 ; if(IR_OK==1){break;} //这一句很重要的!!!!!
969 ; SOURCE LINE # 229
0036 200054 F 970 JB IR_OK,?C0081
0039 971 ?C0076:
972 ; k=*(song+j)&0x0F; //后4位为多少个1/4拍
973 ; SOURCE LINE # 230
0039 EF 974 MOV A,R7
003A 540F 975 ANL A,#0FH
003C FE 976 MOV R6,A
A51 MACRO ASSEMBLER IR_YINYUE 10/24/2006 16:41:18 PAGE 16
977 ;---- Variable 'k?757' assigned to Register 'R6' ----
978 ; l=*(song+j)>>4; //song(song+j)[]中所放的每个字节
979 ; SOURCE LINE # 231
003D EF 980 MOV A,R7
003E C4 981 SWAP A
003F 540F 982 ANL A,#0FH
0041 F500 F 983 MOV l,A
984 ; //前4位乘2表示为音符频率在数组yin[]中的位置
985 ;
986 ; TH0=yin[2*l]; //置初值
987 ; SOURCE LINE # 234
0043 25E0 988 ADD A,ACC
0045 2400 F 989 ADD A,#LOW (yin)
0047 F582 990 MOV DPL,A
0049 E4 991 CLR A
004A 3400 F 992 ADDC A,#HIGH (yin)
004C F583 993 MOV DPH,A
004E E4 994 CLR A
004F 93 995 MOVC A,@A+DPTR
0050 FF 996 MOV R7,A
0051 F58C 997 MOV TH0,A
998 ; TL0=yin[2*l+1];
999 ; SOURCE LINE # 235
0053 E500 F 1000 MOV A,l
0055 25E0 1001 ADD A,ACC
0057 2400 F 1002 ADD A,#LOW (yin+01H)
0059 F582 1003 MOV DPL,A
005B E4 1004 CLR A
005C 3400 F 1005 ADDC A,#HIGH (yin+01H)
005E F583 1006 MOV DPH,A
0060 E4 1007 CLR A
0061 93 1008 MOVC A,@A+DPTR
0062 FD 1009 MOV R5,A
0063 F58A 1010 MOV TL0,A
1011 ; TR0=1; //起动定时器0
1012 ; SOURCE LINE # 236
0065 D28C 1013 SETB TR0
1014 ; if ((yin[2*l]==0xff)&&(yin[2*l+1]==0xff)) //如果取到的都是休止符,则不输出音频
1015 ; SOURCE LINE # 237
0067 EF 1016 MOV A,R7
0068 B4FF08 1017 CJNE A,#0FFH,?C0077
006B ED 1018 MOV A,R5
006C B4FF04 1019 CJNE A,#0FFH,?C0077
1020 ; {
1021 ; SOURCE LINE # 238
1022 ; TR0=0;SPK=1;
1023 ; SOURCE LINE # 239
006F C28C 1024 CLR TR0
0071 D2B7 1025 SETB SPK
1026 ; }
1027 ; SOURCE LINE # 240
0073 1028 ?C0077:
1029 ; for(i=k;i>0;--i) //节拍K为多少就执行多少个1/4拍
1030 ; SOURCE LINE # 241
1031 ;---- Variable 'i?756' assigned to Register 'R4' ----
0073 AC06 1032 MOV R4,AR6
0075 1033 ?C0078:
0075 EC 1034 MOV A,R4
0076 D3 1035 SETB C
0077 9400 1036 SUBB A,#00H
0079 4006 1037 JC ?C0079
1038 ; { delay187ms(); }
1039 ; SOURCE LINE # 242
007B 120000 F 1040 LCALL delay187ms
007E 1C 1041 DEC R4
007F 80F4 1042 SJMP ?C0078
A51 MACRO ASSEMBLER IR_YINYUE 10/24/2006 16:41:18 PAGE 17
0081 1043 ?C0079:
1044 ; TR0=0;
1045 ; SOURCE LINE # 243
0081 C28C 1046 CLR TR0
1047 ; j++;
1048 ; SOURCE LINE # 244
0083 0500 F 1049 INC j?755+01H
0085 E500 F 1050 MOV A,j?755+01H
0087 709A 1051 JNZ ?C0074
0089 0500 F 1052 INC j?755
008B 1053 ?C0109:
1054 ; } //回22222
1055 ; SOURCE LINE # 245
008B 8096 1056 SJMP ?C0074
1057 ; } //回xxxxxx
1058 ; SOURCE LINE # 246
008D 1059 ?C0081:
008D 22 1060 RET
1061 ; END OF sing_song
1062
1063 ;
1064 ;
1065 ;
1066 ; void main()
1067
---- 1068 RSEG ?PR?main?IR_YINYUE
0000 1069 main:
1070 USING 0
1071 ; SOURCE LINE # 250
1072 ; {
1073 ; SOURCE LINE # 251
1074 ; IT0=1; //设中断0为边沿触发方式
1075 ; SOURCE LINE # 252
0000 D288 1076 SETB IT0
1077 ; TMOD=0x11; //timer0,timer1工作在方式1
1078 ; SOURCE LINE # 253
0002 758911 1079 MOV TMOD,#011H
1080 ; IE=0x83; //EA=1;ETO=1;EX0=1;
1081 ; SOURCE LINE # 254
0005 75A883 1082 MOV IE,#083H
1083 ; IP=0x01;
1084 ; SOURCE LINE # 255
0008 75B801 1085 MOV IP,#01H
1086 ; /* TMOD=0x01; //timer0工作在方式1
1087 ; IE=0x82; //EA=1;ETO=1;
1088 ; IT0=1; //外部中断0触发方式控制位,下降沿触发
1089 ; EX0=1; //外部中断0(INT0)中断允许位
1090 ; EA=1; //总中断
1091 ; */
1092 ; dm=0;
1093 ; SOURCE LINE # 262
000B E4 1094 CLR A
000C F500 F 1095 MOV dm,A
1096 ; P2=0xc0;
1097 ; SOURCE LINE # 263
000E 75A0C0 1098 MOV P2,#0C0H
1099 ; P1=0x00;
1100 ; SOURCE LINE # 264
0011 F590 1101 MOV P1,A
0013 1102 ?C0082:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -