📄 语音1.lis
字号:
.module _语音1.c
.area text(rom, con, rel)
0000 .dbfile E:\写的程序\AVR(C)\语音1.c
0000 .dbfunc e spi_sent_init _spi_sent_init fV
.even
0000 _spi_sent_init::
0000 .dbline -1
0000 .dbline 51
0000 ;
0000 ; /****************************************************************
0000 ; 在发送命令时的第四位是开LED指示位
0000 ; 当C4=1时开启,要指示话要在每个命令中将此位置位
0000 ; 以下的程序都将此位置位了。
0000 ; /*****************************************************************
0000 ;
0000 ; #define PU PU(0x11) //POWER UP 01
0000 ; #define PD PU(0x17) //POWER DOWN 07
0000 ; #define EXTLCK PU(0x5A) //是否使能外部时钟 4A
0000 ;
0000 ; #define STOP PU(0x12) //停止 02
0000 ; #define RESET PU(0x13) //复位 03
0000 ; #define FWD PU(0x01) //下一曲 48
0000 ; #define PLAY PU(0x50) //播放当前曲目 40
0000 ; #define REC PU(0x51) //从当前地址开始录音 41
0000 ;
0000 ; #define CLR_INT PU(0x14) //清除中断和EOM位 04
0000 ; #define ERASE PU(0x52) //擦除当前曲目 42
0000 ; #define G_ERASE PU(0x53) //擦除全部曲目除了提示音 43
0000 ;
0000 ; #define WR_NVCFG PU(0x56) //将APC的内容写到NVCFG中 46
0000 ; #define LD_NVCFG PU(0x57) //将NVCFG的内容加载到APC中 47
0000 ; #define CHK_MEM PU(0x59) //检查环形存储结构 49
0000 ;
0000 ; #define RD_STATUS status_address(0x15) //读取状态寄存器,当前地址 05
0000 ; #define DEVID status_address(0x19) //读取器件ID 09
0000 ;
0000 ; #define RD_PLAY_PTR status_address_pointer(0x16) //读取状态寄存器,当前地址和播放指针 06
0000 ; #define RD_REC_PTR status_address_pointer(0x18) //读取状态寄存器,当前地址和录音指针 08
0000 ; #define RD_APC status_address_pointer(0x54) //读取状态寄存器,当前地址和APC寄存器 44
0000 ; /****************************************************************************
0000 ; 下面的程序是要用
0000 ; unsigned char command_data(unsigned char command,unsigned int data1,unsigned int data2)
0000 ; 该函数要实现如下功能由不同的命令实现
0000 ; 返回的i值是状态值
0000 ; ***********************************************************************
0000 ; i=command_data(0x55,data1,data2);//wr_apc1(void);将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
0000 ; i=command_data(0x75,data1,data2);//wr_apc2(void);将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
0000 ;
0000 ; i=command_data(0x90,data1,data2); //set_play(void);//从<S10:S0>开始播放,直到<E10:E0>或EOM 80
0000 ; i=command_data(0x91,data1,data2); //set_rec(void); //从<S10:S0>开始录音,直到<E10:E0> 81
0000 ; i=command_data(0x92,data1,data2); //set_erase(void);//擦除<S10:S0>到<E10:E0>的内容 82
0000 ;
0000 ; /***********************************************************
0000 ; SPI发送程序
0000 ; *************************************************************/
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; void spi_sent_init(void)
0000 ; { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
0000 .dbline 51
0000 88B3 in R24,0x18
0002 806F ori R24,240
0004 88BB out 0x18,R24
0006 .dbline 52
0006 ; DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
0006 87B3 in R24,0x17
0008 806B ori R24,176
000A 87BB out 0x17,R24
000C .dbline 53
000C ; SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
000C 83E7 ldi R24,115
000E 8DB9 out 0xd,R24
0010 .dbline 54
0010 ; SPSR = 0x00; //预分频为128
0010 2224 clr R2
0012 2EB8 out 0xe,R2
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
0016 .dbfunc e SPI _SPI fc
0016 ; sign -> R20
0016 ; Data -> R16,R17
.even
0016 _SPI::
0016 0E940000 xcall push_gset1
001A .dbline -1
001A .dbline 58
001A ; }
001A ;
001A ; unsigned char SPI(unsigned int Data)
001A ; {
001A .dbline 60
001A ; unsigned char sign;
001A ; PORTB &=~ (1<<PB4); //强制接收方进入从模式
001A C498 cbi 0x18,4
001C .dbline 61
001C ; SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
001C 6C9A sbi 0xd,4
001E .dbline 62
001E ; SPDR = Data; //启动数据传输
001E 0FB9 out 0xf,R16
0020 L3:
0020 .dbline 63
0020 L4:
0020 .dbline 63
0020 ; while(!(SPSR&(1<<SPIF))); //等待传输结束
0020 779B sbis 0xe,7
0022 FECF rjmp L3
0024 .dbline 64
0024 ; PORTB |= (1<<PB4);
0024 C49A sbi 0x18,4
0026 .dbline 65
0026 ; sign=SPSR;
0026 4EB1 in R20,0xe
0028 .dbline 66
0028 ; sign=SPDR;
0028 4FB1 in R20,0xf
002A .dbline 67
002A ; return sign;
002A 042F mov R16,R20
002C .dbline -2
002C L2:
002C 0E940000 xcall pop_gset1
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r sign 20 c
0032 .dbsym r Data 16 i
0032 .dbend
0032 .dbfunc e PU _PU fc
0032 ; i -> R20
0032 ; data -> R22
.even
0032 _PU::
0032 0E940000 xcall push_gset2
0036 602F mov R22,R16
0038 .dbline -1
0038 .dbline 73
0038 ; }
0038 ; /***********************************************************
0038 ; 命令程序
0038 ; *************************************************************/
0038 ; unsigned char PU(unsigned char data)
0038 ; {
0038 L7:
0038 .dbline 76
0038 ; unsigned char i;
0038 ; do
0038 ; {
0038 .dbline 77
0038 ; i=SPI(data);//发送命令
0038 062F mov R16,R22
003A 1127 clr R17
003C ECDF xcall _SPI
003E 402F mov R20,R16
0040 .dbline 78
0040 ; }
0040 L8:
0040 .dbline 79
0040 ; while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
0040 0027 clr R16
0042 1127 clr R17
0044 E8DF xcall _SPI
0046 402F mov R20,R16
0048 40FD sbrc R20,0
004A F6CF rjmp L7
004C .dbline 80
004C ; return i;
004C .dbline -2
004C L6:
004C 0E940000 xcall pop_gset2
0050 .dbline 0 ; func end
0050 0895 ret
0052 .dbsym r i 20 c
0052 .dbsym r data 22 c
0052 .dbend
0052 .dbfunc e status_address _status_address fi
0052 ; k -> R20,R21
0052 ; i -> R22
0052 ; data -> R10
.even
0052 _status_address::
0052 0E940000 xcall push_gset3
0056 A02E mov R10,R16
0058 .dbline -1
0058 .dbline 84
0058 ; }
0058 ; //*************************************************************
0058 ; unsigned int status_address(unsigned char data)//读取状态寄存器,当前地址
0058 ; {
0058 L11:
0058 .dbline 88
0058 ; unsigned char i;
0058 ; unsigned int k;
0058 ; do
0058 ; {
0058 .dbline 89
0058 ; i=SPI(data);//发送命令
0058 0A2D mov R16,R10
005A 1127 clr R17
005C DCDF xcall _SPI
005E 602F mov R22,R16
0060 .dbline 90
0060 ; }
0060 L12:
0060 .dbline 91
0060 ; while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
0060 0027 clr R16
0062 1127 clr R17
0064 D8DF xcall _SPI
0066 602F mov R22,R16
0068 60FD sbrc R22,0
006A F6CF rjmp L11
006C .dbline 92
006C ; k=SPI(0x00);//读当前地址
006C 0027 clr R16
006E 1127 clr R17
0070 D2DF xcall _SPI
0072 402F mov R20,R16
0074 5527 clr R21
0076 .dbline 93
0076 ; k=(8<<k)+i;//低位是状态,高位是地址
0076 08E0 ldi R16,8
0078 10E0 ldi R17,0
007A 9A01 movw R18,R20
007C 0E940000 xcall lsl16
0080 A801 movw R20,R16
0082 262E mov R2,R22
0084 3324 clr R3
0086 420D add R20,R2
0088 531D adc R21,R3
008A .dbline 94
008A ; return k;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -