📄 语音1.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 + -