;标号 | ;指令 | ;操作数 | ;注释 |
;说明:本程序用Excel做为编写工具,只需选中相应的单元格拷贝,直接粘贴到MPLAB中 | 2007-10-22 22:50 | | |
;软件名称:ISD1700PRO | | | |
;作者:ISD1700@163.com或kuheye@163.com | | |
ISD1700开发工具销售价格: | | | |
| 个人零售:280元或面谈 | |
| 代理价格:面谈 | | |
;作者电话: | 13602696863 | | |
;整理日期 | 2007-10-22 22:50 | | |
;创建地点 | 深圳市323路公交车上 | | |
;版本 | ;日期 | ;说明 | |
;V000 | 2007-10-22 22:50 | | |
| 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 | | |
文章评论(0条评论)
登录后参与讨论