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

📄 语音1.lis

📁 ISD1720芯片实现录音,定点录音,播放,定点播放等.
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -