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

📄 spi.test.txt

📁 SPI总线以及9346EEPROM的读写程序
💻 TXT
字号:
?SPI总线以及9346EEPROM的读写
 ;RBO键按下时把DATA和DATA2写入到EEPROM中以EE—ADDR为地址的单元内,
 ;完成后,单个数码观显示“9”做为完成标志
 ;RB1键按下时,读取EEPROM中以EE—ADDR为地址的单元,并送数码管显示
 ;硬件要求:S3、S5、S6拨码管置ON,S1第7、8位置ON。
 LIST      P=16F877A, R=DEC
include "P16F877A.inc"     ;包含头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
#DEFINE  CS  PORTC,2        ;片选信号
#DEFINE  CLK PORTC,3        ;时钟信号输入
#DEFINE  DI  PORTC,5        ;数据输入脚
#DEFINE  D0  PORTC,4        ;数据输出脚
EE_ADDR  EQU  05H           ;待写EEPROM单元地址
EE_DATA  EQU  56H          ;待写入的数据
EE_DATA2 EQU  78H
TEMP1    EQU  30H           ;读EEPROM结果存放单元
TEMP2    EQU  31H
DL1      EQU   77H            ;延时用
DL2      EQU   78H            ;延时用
;******************************************************
  ORG 000H                  ;复位地址
  NOP                       ;放置一条ICD必需的空操作指令
  GOTO MAIN
  ORG 0008H
TABLE      
               ADDWF   PCL,1                    ;PC值加上偏移地址
               RETLW       0C0H          ;0
               RETLW       0F9H          ;1的编码
               RETLW       0A4H          ;2的编码
               RETLW       0B0H          ;3的编码
               RETLW       99H           ;4的编码
               RETLW       92H           ;5的编码
            RETLW       082H       ;6
            RETLW       0F8H       ;7
            RETLW       080H       ;8
            RETLW       090H       ;9
               RETLW       88H           ;A
               RETLW       083H          ;b
               RETLW       0C6H          ;c
               RETLW       0A1H          ;d
               RETLW       086H          ;E
               RETLW       08EH          ;F
               RETLW       0FFH
;********************主程序***************************
MAIN
  MOVLW   0FFH
  MOVWF   PORTD
  CLRF    TEMP1
  BANKSEL SSPSTAT
  MOVLW   b'10000000'      
  MOVWF   SSPSTAT           ;SMP=1,CKE=0
  MOVLW   B'11010000'
  MOVWF   TRISC             ;D0输入,DI输出,CLK输出
  MOVLW   0FFH
  MOVWF   TRISB
  CLRF    TRISD
  CLRF    TRISA
  MOVLW   06H
  MOVWF   ADCON1
  CLRF    STATUS
  CLRF    INTCON            ;清除所有中断使能位
  CLRF    PIR1              ;清除SSP中断标志位
  BCF     CS                ;片选禁止
  MOVLW   B'00110001'    
  MOVWF   SSPCON            ;CKP=1,SSPEN=1,SPI主模式Fosc/16
LOOP
  CLRF    STATUS
  BTFSC   PORTB,0
  GOTO    EE_READ
  CALL    WRITE_EE
  MOVLW   90H
  MOVWF   PORTD
  MOVLW   0FEH
  MOVWF   PORTA
  GOTO    $
EE_READ
  BTFSC   PORTB,1
  GOTO    MAIN
  CALL    READ_EE
  CALL    DISPLAY
  GOTO    $-1
;**********************写使能*********************************
WRITE_EE
  BSF     CS                ;片选使能
  MOVLW   B'00000001'       ;发送起始位
;  MOVLW  
  CALL    SPI_COMM          ;发送
  MOVLW   B'00110000'       ;写使能命令代码
  CALL    SPI_COMM          ;发送
  BCF     CS                ;片选禁止
  NOP
  NOP                       ;延时一定时间
;*********************写数据**********************************
;入口参数:EE_ADDR,EE_DATA,EE_DATA2
;出口参数:无
;*************************************************************
  BSF     CS                ;片选使能
  MOVLW   B'00000001'       ;发送起始位
  CALL    SPI_COMM          ;发送
  MOVLW   EE_ADDR           ;发送待写单元的地址
  IORLW   B'01000000'       ;地址加上写命令代码
  CALL    SPI_COMM
  MOVLW   EE_DATA           ;发送待写入的数据
  CALL    SPI_COMM
  MOVLW   EE_DATA2         
  CALL    SPI_COMM          ;再次发送8位数据,组成16位数据
  BCF     CS                ;片选禁止
  NOP
  NOP
  NOP                       ;延时一定时间
  BSF     CS                ;片选使能
  NOP
  NOP
  BTFSS    D0               ;判断内部写操作是否完成
  GOTO     $-1              ;正在操作,等待完成
  BCF      CS               ;片选禁止
  NOP
  NOP                       ;延时一定时间
  RETURN
;*********************读数据*********************************** 
;入口参数:EE_ADDR
;出口参数:TEMP1,TEMP2
;**************************************************************
READ_EE
  BSF      CS               ;片选使能
  NOP
  NOP                       ;延时一定时间
  MOVLW    B'00000001'      ;发送起始位
  CALL     SPI_COMM
  MOVLW    EE_ADDR          ;发送待读单元地址
  IORLW    B'10000000'      ;地址加上读命令代码   
  CALL     SPI_COMM
  MOVLW    00H
  CALL     SPI_COMM         ;读取EEPROM中指定单元高8位数据
  MOVWF    TEMP1            ;保存到结果存放单元
  MOVLW    00H
  CALL     SPI_COMM         ;读取EEPROM中指定单元低8位数据
  MOVWF    TEMP2
  NOP
  BCF      CS               ;片选禁止
  NOP
  NOP
 
  MOVLW    0FH
  ANDWF    TEMP1,0
  MOVWF    61H
  SWAPF    TEMP1,0
  ANDLW    0FH
  MOVWF    60H
  MOVLW    0FH
  ANDWF    TEMP2,0
  MOVWF    63H
  SWAPF    TEMP2,0
  ANDLW    0FH
  MOVWF    62H
  RETURN   
;*****************发送命令/数据和读取数据子程序*************
SPI_COMM
  MOVWF    SSPBUF           ;SSPBUF中写入数据,启动发送接收过程
  BTFSS    PIR1,SSPIF       ;判断是否发送/接收完成
  GOTO     $-1              ;等待完成
  BCF      PIR1,SSPIF       ;清除中断标志位
  MOVF     SSPBUF,W         ;清空SSPBUF,以便下一次通信
  RETURN                    ;子程序返回
;**********************延时程序******************************
DELAY10MS
   MOVLW   0CH
   MOVWF   DL1
DELAY2
   MOVLW   0FFH
   MOVWF   DL2
DELAY1
   DECFSZ  DL2,1
   GOTO    DELAY1
   DECFSZ  DL1,1
   GOTO    DELAY2
   RETURN
;**********************显示程序******************************
;入口参数:60H-63H
;无
;***********************************************************
DISPLAY
   MOVFW   60H
   CALL    TABLE
   MOVWF   PORTD
   BCF     PORTA,0
   CALL    DELAY10MS
   BSF     PORTA,0
   MOVFW   61H
   CALL    TABLE
   MOVWF   PORTD
   BCF     PORTA,1
   CALL    DELAY10MS
   BSF     PORTA,1
   MOVFW   62H
   CALL    TABLE
   MOVWF   PORTD
   BCF     PORTA,2
   CALL    DELAY10MS
   BSF     PORTA,2
   MOVFW   63H
   CALL    TABLE
   MOVWF   PORTD
   BCF     PORTA,3
   CALL    DELAY10MS
   BSF     PORTA,3
   RETURN
;********************************************
       end                  ;源程序结束

⌨️ 快捷键说明

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