?? 語音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 + -