原创 基于PIC单片机的ISD1700源代码

2007-10-22 22:51 4158 2 2 分类: 汽车电子
;标号;指令;操作数;注释
;说明:本程序用Excel做为编写工具,只需选中相应的单元格拷贝,直接粘贴到MPLAB2007-10-22 22:50
;软件名称:ISD1700PRO
;作者:ISD1700@163.comkuheye@163.com
ISD1700开发工具销售价格:
个人零售:280元或面谈
代理价格:面谈
;作者电话:13602696863
;整理日期2007-10-22 22:50
;创建地点深圳市323路公交车上
;版本;日期;说明
;V0002007-10-22 22:50
LISTP=16F877A
INCLUDEP16F877A.INC
ERRORLEVEL2;显示错误信息
; 定义别名   
;定义引脚   
#defineIsdSSPORTA,0;输出,片选
#defineIsdMosiPORTA,1;输出,MCU,ISD
#defineIsdMisoPORTA,2;输入,MCU,ISD
#defineIsdSclkPORTA,3;时钟
#defineTRISA_DATAB'00000100'
;定义寄存器,BANK0   
CBLOCK0X20
SpiData:7;SPI发送/接收缓冲寄存器
SpiLen;SPI发送长度
SpiPtr;SPI发送指针
SpiCnt;SPI移位计数器
SpiRSR;SPI移位寄存器
ENDC
 ORG0X0000 
NOP;ICD2仿真预设
GOTOMain
 ORG0X0004 
IntServer;中断服务子程序
;……
RETFIE 
Main;主程序入口  
CALLBasicSet;调基本设置
DemoPlay;1,放音
CALLPU
CALLCLR_INT
CALLPLAY
CALLCHK_MEM
BTFSS
GOTO$-2
RETURN
…….
BasicSet;基本设置
BANKSELTRISA;RA方向设置
MOVLWTRISA_DATA
MOVWFTRISA
CLRFSTATUS
RETURN
PU;上电代码:0X01,0X00
;MOSI:0X01,0X00
;MISO:SR0,SR0
MOVLWD'2'
MOVWFSpiLen
MOVLW0X01
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
PAGESEL$
RETURN
STOP;停止当前操作
;MOSI:0X02,0X00
;MISO:SR0,SR0
MOVLWD'2'
MOVWFSpiLen
MOVLW0X02
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
PAGESEL$
RETURN
RESET_SPI;ISD复位
;MOSI:0X03,0X00
;MISO:SR0,SR0
MOVLWD'2'
MOVWFSpiLen
MOVLW0X03
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
PAGESEL$
RETURN
CLR_INT;清除中断标志及EOM
;MOSI:0X14,0X00
;MISO:SR0,SR0
MOVLWD'2'
MOVWFSpiLen
MOVLW0X14;bit4=1,lED
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
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
;入口参数:起始地址与结束地址,调用前需设定好
;出口参数:
MOVLWD'7'
MOVWFSpiLen
MOVLW0X90;bit4=1,lED
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
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
;入口参数:起始地址与结束地址,调用前需设定好
;出口参数:
MOVLWD'7'
MOVWFSpiLen
MOVLW0X91
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
PAGESELSpiTx
CALLSpiTx
PAGESEL$
RETURN
RD_STATUS;返回SR寄存器内容
;MOSI:0X05,0X00,0X00
;MISO:SR0,SR0,SR1
MOVLWD'3'
MOVWFSpiLen
MOVLW0X05
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
CLRFSpiData+D'2'
PAGESELSpiTx
CALLSpiTx
PAGESEL$
RETURN
RD_APC;读取APC状态寄存器
;MOSI:0X44,0X00,0X00,0X00
;MISO:SR0,SR0,APC<7:0>,**** APC<11:8>
;出口参数:ApcTmpH,ApcTmpL
MOVLWD'4'
MOVWFSpiLen
MOVLW0X44
MOVWFSpiData+D'0'
CLRFSpiData+D'1'
CLRFSpiData+D'2'
CLRFSpiData+D'3'
PAGESELSpiTx
CALLSpiTx
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
MOVLWD'3'
MOVWFSpiLen
MOVLW0X65
MOVWFSpiData+D'0'
PAGESELSpiTx
CALLSpiTx
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^拉高
CLRFSTATUS
SpiTxLenON;1.发送长度有效性判断,2SpiLen7
MOVLWD'2'
SUBWFSpiLen,W
SKPC
GOTOSpiTxLenError;C=0,有借位,SpiPtr<2,出错
MOVLWD'8'
SUBWFSpiLen,W
SKPNC
GOTOSpiTxLenError;C=1,无借位,SpiPtr>7,出错
SpiTxSS;2.片选设定
BCFIsdSS
SpiTxCLR;3.发送前清场,指针清0
CLRFSpiPtr;SPI发送指针清0
BCFIsdSclk;IsdSclk=低,为后面准备上升沿
SpiTxByteLoop;4.调发送数据到移位缓冲区
;4.1 SpiData间接寻址,调入到SpiRSR缓冲
MOVFWSpiPtr
ADDLWSpiData
MOVWFFSR;发送数据间接寻址
MOVFWINDF
MOVWFSpiRSR
;4.2 发送移位计数器清0
CLRFSpiCnt;位计数器清0
SpiTxBitLoop;5.发送
;注意,ISD1700SPI协议规定,Bit在前,Bit在后
;5.1 MOSI数据准备
BTFSSSpiRSR,0
BCFIsdMosi
BTFSCSpiRSR,0
BSFIsdMosi
;5.2 IsdSclk产生上升沿
BSFIsdSclk;IsdSclk上升沿
;5.4 读取MISO回传数据
BTFSSIsdMiso
BCFSpiRSR,0
BTFSC
BSFSpiRSR,0
;5.5,时钟置低位
BCFIsdSclk;IsdSclk下降沿
;5.6循环右移
;5.6.1 循环右移,同时注意bit7跟踪STATUS,C
RRFSpiRSR
BTFSSSTATUS,C
BCFSpiRSR,7
BTFSCSTATUS,C
BSFSpiRSR,7;位循环右移
;5.7 位计数器加1,判断8位是否发送完毕
INCFSpiCnt;位计数器加1
MOVFWSpiCnt
XORLWD'8'
SKPZ
GOTOSpiTxBitLoop;8位没发完,继续
;5.8 一个字节发送完毕,字节指针加1,检查是否全部发送完毕
;5.8.1 SpiRSR保存的IsdMiso片数据,回存到INDF
MOVFWSpiRSR
MOVWFINDF
;5.8.2 发送字节指针加1,判断是否全部发送完毕
INCFSpiPtr;8位发送完毕,字节指针加1
MOVFWSpiPtr
XORWFSpiLen,W
SKPZ
GOTOSpiTxByteLoop
;5.9 全部发送完毕
BSFIsdSclk;空闲时,IsdSclk=1
BSFIsdSS;片选置高
SETC;C=1,数据发送成功
RETURN
SpiTxLenErrorCLRC
RETURN

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /2 下一条