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

📄 isd1700.asm

📁 ISD1700录音控制IC源码
💻 ASM
字号:
V000 2007-9-9 10:26  
 LIST P=16F877A 
 INCLUDE P16F877A.INC 
 ERRORLEVEL 2 ;显示错误信息
; 定义别名   
;定义引脚   
#define IsdSS PORTA,0 ;输出,片选
#define IsdMosi PORTA,1 ;输出,MCU出,ISD入
#define IsdMiso PORTA,2 ;输入,MCU人,ISD出
#define IsdSclk PORTA,3 ;时钟
#define TRISA_DATA B'00000100' 
;定义寄存器,在BANK0上   
 CBLOCK 0X20 
SpiData :7  ;SPI发送/接收缓冲寄存器
SpiLen   ;SPI发送长度
SpiPtr   ;SPI发送指针
SpiCnt   ;SPI移位计数器
SpiRSR   ;SPI移位寄存器
 ENDC  
 ORG 0X0000 
 NOP  ;ICD2仿真预设
 GOTO Main 
 ORG 0X0004 
IntServer ;中断服务子程序  
 ;略……  
 RETFIE  
Main ;主程序入口  
 CALL BasicSet ;调基本设置
   
   
DemoPlay ;例1,放音  
 CALL PU 
 CALL CLR_INT 
 CALL PLAY 
 CALL CHK_MEM 
 BTFSS  
 GOTO $-2 
 RETURN  
 …….  
   
BasicSet ;基本设置  
 BANKSEL TRISA ;RA方向设置
 MOVLW TRISA_DATA 
 MOVWF TRISA 
 CLRF STATUS 
 RETURN  
PU ;上电 代码:0X01,0X00 
 ;MOSI:0X01,0X00  
 ;MISO:SR0,SR0  
 MOVLW D'2' 
 MOVWF SpiLen 
 MOVLW 0X01 
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
STOP ;停止当前操作 
 ;MOSI:0X02,0X00 
 ;MISO:SR0①,SR0② 
 MOVLW D'2'
 MOVWF SpiLen
 MOVLW 0X02
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
RESET_SPI ;ISD复位 
 ;MOSI:0X03,0X00 
 ;MISO:SR0,SR0 
 MOVLW D'2'
 MOVWF SpiLen
 MOVLW 0X03
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
CLR_INT ;清除中断标志及EOM位 
 ;MOSI:0X14,0X00 
 ;MISO:SR0,SR0  
 MOVLW D'2' 
 MOVWF SpiLen 
 MOVLW 0X14 ;bit4=1,lED亮
 MOVWF SpiData+D'0' 
 CLRF SpiData+D'1' 
 PAGESEL SpiTx 
 CALL SpiTx 
 PAGESEL $ 
 RETURN  
SET_PLAY ;指定地址放音  
 ;MOSI:0X90,0X00,S<7:0>,0000 0S<10:8>,E<7:0>,0000 0E<10:8>,0X00  
 ;MISO:SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2  
 ;入口参数:起始地址与结束地址,调用前需设定好  
 ;出口参数:无  
 MOVLW D'7' 
 MOVWF SpiLen 
 MOVLW 0X90 ;bit4=1,lED亮
 MOVWF SpiData+D'0' 
 CLRF SpiData+D'1' 
 PAGESEL SpiTx 
 CALL SpiTx 
 PAGESEL $ 
 RETURN  
SET_REC ;指定地址录音  
 ;MOSI:0X91,0X00,S<7:0>,0000 0S<10:8>,E<7:0>,0000 0E<10:8>,0X00  
 ;MISO:SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2  
 ;入口参数:起始地址与结束地址,调用前需设定好  
 ;出口参数:无  
 MOVLW D'7' 
 MOVWF SpiLen 
 MOVLW 0X91 
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
RD_STATUS ;返回SR寄存器内容 
 ;MOSI:0X05,0X00,0X00 
 ;MISO:SR0①,SR0②,SR1 
 MOVLW D'3'
 MOVWF SpiLen
 MOVLW 0X05
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 CLRF SpiData+D'2'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
RD_APC ;读取APC状态寄存器 
 ;MOSI:0X44,0X00,0X00,0X00 
 ;MISO:SR0,SR0,APC<7:0>,**** APC<11:8> 
 ;出口参数:ApcTmpH,ApcTmpL 
 MOVLW D'4'
 MOVWF SpiLen
 MOVLW 0X44
 MOVWF SpiData+D'0'
 CLRF SpiData+D'1'
 CLRF SpiData+D'2'
 CLRF SpiData+D'3'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
WR_APC2 ;写数据到APC寄存器,音量控制来自APC<2-0> 
 ;MOSI:0X65,APC<7:8>,**** APC<11:8> 
 ;MISO:SR0_1/2,SR0_2/2,SR0_1/2 

 MOVLW D'3'
 MOVWF SpiLen
 MOVLW 0X65
 MOVWF SpiData+D'0'
 PAGESEL SpiTx
 CALL SpiTx
 PAGESEL $
 RETURN 
;其他指令,请用户自己仿照以上添加  
SpiTx ;模拟SPI子程序 
 ;入口参数1:SpiLen,本次发送的数据长度 
 ;入口参数2,SpiData首地址,本次向ISD发送数据源存放 
 ;出口参数:1:SpiData首地址,本次ISD回传数据 
 ;占用资源1:SpiPtr,发送指针 
 ;占用资源2:SpiCnt发送位计数器 
 ;占用资源3:SpiRSR,移位缓冲寄存器 
 ;空闲状态时,IsdSclk=1 
 ;IsdSclk=0,时准备MOSI数据 
 ;IsdSclk=↑,从机锁存MOSI数据,同时主机锁存MISO数据 
 ;IsdSclk=1,主机读取从机数据 
 ;SS^片选空闲=1,数据传输起始于SS^变低,结束于SS^拉高 
 CLRF STATUS
SpiTxLenON ;1.发送长度有效性判断,2≤SpiLen≤7 
 MOVLW D'2'
 SUBWF SpiLen,W
 SKPC 
 GOTO SpiTxLenError ;C=0,有借位,SpiPtr<2,出错
 MOVLW D'8' 
 SUBWF SpiLen,W 
 SKPNC  
 GOTO SpiTxLenError ;C=1,无借位,SpiPtr>7,出错
SpiTxSS ;2.片选设定  
 BCF IsdSS 
SpiTxCLR ;3.发送前清场,指针清0  
 CLRF SpiPtr ;SPI发送指针清0
 BCF IsdSclk ;IsdSclk=低,为后面准备上升沿
SpiTxByteLoop ;4.调发送数据到移位缓冲区  
 ;4.1 SpiData间接寻址,调入到SpiRSR缓冲  
 MOVFW SpiPtr 
 ADDLW SpiData 
 MOVWF FSR ;发送数据间接寻址
 MOVFW INDF 
 MOVWF SpiRSR 
 ;4.2 发送移位计数器清0  
 CLRF SpiCnt ;位计数器清0
SpiTxBitLoop ;5.发送  
 ;注意,ISD1700的SPI协议规定,低Bit在前,高Bit在后  
 ;5.1 MOSI数据准备  
 BTFSS SpiRSR,0 
 BCF IsdMosi 
 BTFSC SpiRSR,0 
 BSF IsdMosi 
 ;5.2 IsdSclk产生上升沿  
 BSF IsdSclk ;IsdSclk上升沿
 ;5.4 读取MISO回传数据  
 BTFSS IsdMiso 
 BCF SpiRSR,0 
 BTFSC  
 BSF SpiRSR,0 
 ;5.5,时钟置低位  
 BCF IsdSclk ;IsdSclk下降沿
 ;5.6循环右移  
 ;5.6.1 循环右移,同时注意bit7跟踪STATUS,C  
 RRF SpiRSR 
 BTFSS STATUS,C 
 BCF SpiRSR,7 
 BTFSC STATUS,C 
 BSF SpiRSR,7 ;位循环右移
 ;5.7 位计数器加1,判断8位是否发送完毕  
 INCF SpiCnt ;位计数器加1
 MOVFW SpiCnt 
 XORLW D'8' 
 SKPZ  
 GOTO SpiTxBitLoop ;8位没发完,继续
 ;5.8 一个字节发送完毕,字节指针加1,检查是否全部发送完毕  
 ;5.8.1 SpiRSR保存的IsdMiso片数据,回存到INDF  
 MOVFW SpiRSR 
 MOVWF INDF 
 ;5.8.2 发送字节指针加1,判断是否全部发送完毕  
 INCF SpiPtr ;8位发送完毕,字节指针加1
 MOVFW SpiPtr 
 XORWF SpiLen,W 
 SKPZ  
 GOTO SpiTxByteLoop 
 ;5.9 全部发送完毕  
 BSF IsdSclk ;空闲时,IsdSclk=1
 BSF IsdSS ;片选置高
 SETC  ;C=1,数据发送成功
 RETURN  
SpiTxLenError CLRC  
 RETURN


文章引用自: 

⌨️ 快捷键说明

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