;实战十一《877A软件模拟SPI通信读写93C46》
;功能说明:
;1.做一个灯的左移,将左移的8个码建于TABLE中.
;2.从TABLE中取出数据并以16位的方式存入93C46中,地址00H-03H.
;3.将93C46的00H-03H地址中的数据码取出并存入877A的RAM(30H)-(37H),并输出至877A的RC口.
;当断电再复电,数据码不会消失.
;4.本电路所使用93C46为ATMEL或MICROCHIP的,或不是该厂的,则烧写时间会有差异
;必须调整本程序的DELAY时间
;本实战的目的是让大家进上步熟悉SPI通信的时序,熟悉93C46的读写,会用软件模拟SPI通信
;硬件接法:
;1.93C46的CS接877A的RB1口;CLK接877A的RB2口;DI接877A的RB4口;DO接877A的RB5口;93C46的ORG端接VCC,使93C46工作于16位方式
;2.实验本实验须将MCD-DEMO实验板上的24CXX系列芯片先取下,在实验过程中不要按动同样接在RB口的按键,以免影响通信时序.
;3.实验板上拔码开关S1要置ON,其它拔码开关都可以关闭。
;版权所有,转载请注明出处,并不能去掉或改变文件中的说明文字。
;程序文件名“MCD-93C46.ASM"
;程序清单如下:
;************************************
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;
;************************************ 定义查表偏移量
READ EQU 0 ;读93C46
WRITE EQU 1 ;写入93C46
EWEN EQU 2 ;93C46写入使能
EWDS EQU 3 ;93C46写入禁止
;*************************************定义引脚位地址
CS EQU 1
CLK EQU 2
DI EQU 4
DO EQU 5
;*********************
ADR46 EQU 20H
F1 EQU 23H
F2 EQU 24H
F3 EQU 25H
F4 EQU 26H
F5 EQU 27H
F6 EQU 28H
F7 EQU 29H
;**********************
ORG 000H
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN
ORG 0008H
;******************************************************
TABLE
ADDWF PCL ,1 ;查表,PORTC一个灯左移
RETLW 01H
RETLW 02H
RETLW 04H
RETLW 08H
RETLW 10H
RETLW 20H
RETLW 40H
RETLW 80H
;*******************************************************
TO9346
MOVWF F1 ;将W的值送F1暂存
BSF PORTB ,CS ;写入起始位1
BSF PORTB ,DI
BSF PORTB ,CLK
CALL DELAY
BCF PORTB ,CLK
CALL DELAY
MOVFW F1
ADDWF PCL ,1
GOTO SREAD ;读
GOTO SWRITE ;写
GOTO SEWEN ;写使能
GOTO SEWDS ;写禁止
;*****************************************************
MAIN
MOVLW 00H
MOVWF PORTC ;LED先全部熄灭
MOVLW 20H
MOVWF PORTB ;除DO外,其它通信口全送0
BSF STATUS,RP0 ;定义RA口,RC口全部为输出
MOVLW 20H
MOVWF TRISB ;RB口5脚为入,其它全为出
CLRW
MOVWF TRISC ;RC口全为输出.
MOVWF OPTION_REG ;开启RB口内部弱上拉
BCF STATUS,R