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

📄 语音1.s

📁 ISD1720芯片实现录音,定点录音,播放,定点播放等.
💻 S
字号:
	.module _语音1.c
	.area text(rom, con, rel)
	.dbfile E:\写的程序\AVR(C)\语音1.c
	.dbfunc e spi_sent_init _spi_sent_init fV
	.even
_spi_sent_init::
	.dbline -1
	.dbline 51
; 
; /****************************************************************
;            在发送命令时的第四位是开LED指示位
; 		   当C4=1时开启,要指示话要在每个命令中将此位置位
; 		   以下的程序都将此位置位了。
; /*****************************************************************
; 
; #define PU      PU(0x11) //POWER UP 01
; #define PD      PU(0x17) //POWER DOWN 07
; #define EXTLCK  PU(0x5A) //是否使能外部时钟 4A
; 
; #define STOP    PU(0x12) //停止   02
; #define RESET   PU(0x13) //复位  03
; #define FWD     PU(0x01) //下一曲 48
; #define PLAY    PU(0x50) //播放当前曲目  40
; #define REC     PU(0x51) //从当前地址开始录音 41
; 
; #define CLR_INT  PU(0x14) //清除中断和EOM位  04 
; #define ERASE    PU(0x52) //擦除当前曲目 42
; #define G_ERASE  PU(0x53) //擦除全部曲目除了提示音 43
; 
; #define WR_NVCFG  PU(0x56) //将APC的内容写到NVCFG中 46
; #define LD_NVCFG  PU(0x57) //将NVCFG的内容加载到APC中 47
; #define CHK_MEM   PU(0x59) //检查环形存储结构 49
; 
; #define RD_STATUS  status_address(0x15) //读取状态寄存器,当前地址 05
; #define DEVID      status_address(0x19) //读取器件ID 09
; 
; #define RD_PLAY_PTR  status_address_pointer(0x16) //读取状态寄存器,当前地址和播放指针 06
; #define RD_REC_PTR   status_address_pointer(0x18) //读取状态寄存器,当前地址和录音指针 08
; #define RD_APC       status_address_pointer(0x54) //读取状态寄存器,当前地址和APC寄存器 44
; /****************************************************************************
;     下面的程序是要用
; unsigned char command_data(unsigned char command,unsigned int data1,unsigned int data2)
;    该函数要实现如下功能由不同的命令实现
;    返回的i值是状态值
; ***********************************************************************
; i=command_data(0x55,data1,data2);//wr_apc1(void);将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
; i=command_data(0x75,data1,data2);//wr_apc2(void);将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
; 
; i=command_data(0x90,data1,data2); //set_play(void);//从<S10:S0>开始播放,直到<E10:E0>或EOM 80
; i=command_data(0x91,data1,data2); //set_rec(void); //从<S10:S0>开始录音,直到<E10:E0> 81
; i=command_data(0x92,data1,data2); //set_erase(void);//擦除<S10:S0>到<E10:E0>的内容 82
; 
; /***********************************************************
;                     SPI发送程序
; *************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; void spi_sent_init(void)
; { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7); 	
	.dbline 51
	in R24,0x18
	ori R24,240
	out 0x18,R24
	.dbline 52
;   DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4);       //设置MOSI,SCK和SS为输出 
	in R24,0x17
	ori R24,176
	out 0x17,R24
	.dbline 53
;   SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
	ldi R24,115
	out 0xd,R24
	.dbline 54
;   SPSR = 0x00;              //预分频为128
	clr R2
	out 0xe,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SPI _SPI fc
;           sign -> R20
;           Data -> R16,R17
	.even
_SPI::
	xcall push_gset1
	.dbline -1
	.dbline 58
; }
; 
; unsigned char SPI(unsigned int Data)
; { 
	.dbline 60
;   unsigned char sign;
;   PORTB &=~ (1<<PB4);            //强制接收方进入从模式
	cbi 0x18,4
	.dbline 61
;   SPCR |= (1<<MSTR);             // MSTR有时会被清零,这里强制进入主机模式
	sbi 0xd,4
	.dbline 62
;   SPDR = Data;              //启动数据传输 
	out 0xf,R16
L3:
	.dbline 63
L4:
	.dbline 63
;   while(!(SPSR&(1<<SPIF)));      //等待传输结束 
	sbis 0xe,7
	rjmp L3
	.dbline 64
;   PORTB |= (1<<PB4);
	sbi 0x18,4
	.dbline 65
;   sign=SPSR;
	in R20,0xe
	.dbline 66
;   sign=SPDR;
	in R20,0xf
	.dbline 67
;   return sign;            
	mov R16,R20
	.dbline -2
L2:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r sign 20 c
	.dbsym r Data 16 i
	.dbend
	.dbfunc e PU _PU fc
;              i -> R20
;           data -> R22
	.even
_PU::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 73
; }
; /***********************************************************
;                     命令程序
; *************************************************************/
; unsigned char PU(unsigned char data)
; {
L7:
	.dbline 76
;    unsigned char i;
;    do
;    {
	.dbline 77
;      i=SPI(data);//发送命令
	mov R16,R22
	clr R17
	xcall _SPI
	mov R20,R16
	.dbline 78
;    }
L8:
	.dbline 79
;    while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
	clr R16
	clr R17
	xcall _SPI
	mov R20,R16
	sbrc R20,0
	rjmp L7
	.dbline 80
;    return i;
	.dbline -2
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e status_address _status_address fi
;              k -> R20,R21
;              i -> R22
;           data -> R10
	.even
_status_address::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 84
; }
; //*************************************************************
; unsigned int status_address(unsigned char data)//读取状态寄存器,当前地址
; {
L11:
	.dbline 88
;     unsigned char i;
; 	unsigned int k;
;    do
;    {
	.dbline 89
;      i=SPI(data);//发送命令
	mov R16,R10
	clr R17
	xcall _SPI
	mov R22,R16
	.dbline 90
;    }
L12:
	.dbline 91
;    while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
	clr R16
	clr R17
	xcall _SPI
	mov R22,R16
	sbrc R22,0
	rjmp L11
	.dbline 92
;    k=SPI(0x00);//读当前地址
	clr R16
	clr R17
	xcall _SPI
	mov R20,R16
	clr R21
	.dbline 93
;    k=(8<<k)+i;//低位是状态,高位是地址
	ldi R16,8
	ldi R17,0
	movw R18,R20
	xcall lsl16
	movw R20,R16
	mov R2,R22
	clr R3
	add R20,R2
	adc R21,R3
	.dbline 94
;    return k;
	movw R16,R20
	.dbline -2
L10:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r k 20 i
	.dbsym r i 22 c
	.dbsym r data 10 c
	.dbend
	.dbfunc e status_address_pointer _status_address_pointer fL
;              j -> R20
;              k -> y+0
;              i -> R22
;           data -> R10
	.even
_status_address_pointer::
	xcall push_gset3
	mov R10,R16
	sbiw R28,4
	.dbline -1
	.dbline 98
; }
; //*************************************************************
; long status_address_pointer(unsigned char data)//读取状态寄存器,当前地址和播放指针
; {
L15:
	.dbline 102
;     unsigned char i,j;
; 	long k;
;    do
;    {
	.dbline 103
;      i=SPI(data);//发送命令
	mov R16,R10
	clr R17
	xcall _SPI
	mov R22,R16
	.dbline 104
;    }
L16:
	.dbline 105
;    while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
	clr R16
	clr R17
	xcall _SPI
	mov R22,R16
	sbrc R22,0
	rjmp L15
	.dbline 106
;    j=SPI(0x00);//读当前地址
	clr R16
	clr R17
	xcall _SPI
	mov R20,R16
	.dbline 107
;    k=SPI(0x00);//读播放指针
	clr R16
	clr R17
	xcall _SPI
	mov R2,R16
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 108
;    k=(8<<k)+j;//低位是状态,高位是地址
	movw R30,R28
	ldd R18,z+0
	ldd R19,z+1
	ldi R16,8
	ldi R17,0
	xcall lsl16
	movw R2,R16
	mov R4,R20
	clr R5
	add R2,R4
	adc R3,R5
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 109
;    k=(8<<k)+i;//低位是状态,中间是地址,高位是播放指针
	movw R30,R28
	ldd R18,z+0
	ldd R19,z+1
	ldi R16,8
	ldi R17,0
	xcall lsl16
	movw R2,R16
	mov R4,R22
	clr R5
	add R2,R4
	adc R3,R5
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 110
;    return k;
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	.dbline -2
L14:
	adiw R28,4
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym l k 0 L
	.dbsym r i 22 c
	.dbsym r data 10 c
	.dbend
	.dbfunc e command_data _command_data fc
;              n -> R20
;              m -> R22
;              j -> R10
;              k -> R12
;              i -> R14
;          data2 -> y+14
;          data1 -> R20,R21
;        command -> y+10
	.even
_command_data::
	xcall push_arg4
	xcall push_gset5
	movw R20,R18
	.dbline -1
	.dbline 114
; }
; //*************************************************************
; unsigned char command_data(unsigned char command,unsigned int data1,unsigned int data2)
; {
	.dbline 116
;    unsigned char i,j,k,m,n;
;    j=data1/256;k=data1%256;
	movw R10,R20
	mov R10,R11
	clr R11
	.dbline 116
	movw R24,R20
	andi R25,0
	mov R12,R24
	.dbline 117
;    m=data2/256;n=data2%256;
	ldd R22,y+14
	ldd R23,y+15
	mov R22,R23
	clr R23
	.dbline 117
	ldd R20,y+14
	ldd R21,y+15
	andi R21,0
L19:
	.dbline 119
;    do
;    {
	.dbline 120
;      i=SPI(command);//发送命令
	ldd R16,y+10
	clr R17
	xcall _SPI
	mov R14,R16
	.dbline 121
;    }
L20:
	.dbline 122
;    while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
	clr R16
	clr R17
	xcall _SPI
	mov R14,R16
	sbrc R14,0
	rjmp L19
	.dbline 123
;    k=SPI(k);k=SPI(j);
	mov R16,R12
	clr R17
	xcall _SPI
	.dbline 123
	mov R16,R10
	clr R17
	xcall _SPI
	.dbline 124
;    k=SPI(n);k=SPI(m);
	mov R16,R20
	clr R17
	xcall _SPI
	.dbline 124
	mov R16,R22
	clr R17
	xcall _SPI
	mov R12,R16
	.dbline 125
;    return i;
	mov R16,R14
	.dbline -2
L18:
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r n 20 c
	.dbsym r m 22 c
	.dbsym r j 10 c
	.dbsym r k 12 c
	.dbsym r i 14 c
	.dbsym l data2 14 i
	.dbsym r data1 20 i
	.dbsym l command 10 c
	.dbend

⌨️ 快捷键说明

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