?? main.c
字號:
/*************************************************************************************************
說明;SPI使用EEPROM存儲芯片93C56A,256X8bit=2K的存儲空間.在使用SPI通訊時通常使用端口進行仿真,為了符合
使用需要,本程序同樣使用了端口進行仿真,當然也可以直接使用88F516自帶的SPI總線進行通訊.
串口1用于觀測93C56A的讀寫數據正確與否?寫入成功接收到數據R,寫入失敗接收到數據E,讀取成功接收到數據r,
讀取失敗接收到數據e.
要求:打開撥碼開關J6的5,6,7,8,打開撥碼開關J4
*************************************************************************************************/
#include <sh88f516.h>
#include <INTRINS.H> //for use 51 instruction
sbit cs_93=P1^4;
sbit di_93=P1^5;
sbit do_93=P1^6;
sbit sk_93=P1^7;
void UART1SendChar(unsigned char value)
{
IEN1 &= 0xFB; //ES1=0;
SBUF1=value; //寫SBUF1,激活發送
while(TI1==0); //等待轉換結束
TI1=0; //清除發送標志位
IEN1 = 0x04; //ES1=1;
}
/*-----------------------------------------------------
SPI93cXX系列函數調用
void high56(void)--------發送1
void low56(void) --------發送0
void wd56(unsigned char dd) --------寫8位數據,輸入參數address or data
unsigned char rd56(void) --------讀8位數據,返回值data
-----------------------------------------------------*/
void high56(void)
{
di_93=1;
sk_93=1; _nop_();
sk_93=0; _nop_();
}
void low56(void)
{
di_93=0;
sk_93=1;_nop_();
sk_93=0;_nop_();
}
void wd56(unsigned char dd)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (dd>=0x80) high56();
else low56();
dd=dd<<1;
}
}
unsigned char rd56(void)
{
unsigned char i,dd=0;
do_93=1;
for (i=0;i<8;i++)
{
dd<<=1;
sk_93=1;_nop_();
sk_93=0;_nop_();
if (do_93) dd|=1;
}
return(dd);
}
/*-----------------------------------------------------
SPI93c56系列函數調用
void ewen56(void)-----------寫使能
unsigned char read93c56_word(unsigned char address) ------------SPI讀函數,輸入參數為address,返回dat
bit write93c56_word(unsigned char address,unsigned char dat)----SPI寫函數,輸入參數為address,dat,寫入成功返回0,失敗返回1
-----------------------------------------------------*/
void ewen56(void)
{
_nop_();
cs_93=1;
high56();
low56();
low56();
//low56();
high56();//add
wd56(0xc0);
//wd56(0x00);
cs_93=0;
}
unsigned char read93c56_word(unsigned char address)
{
unsigned char dat;
cs_93=sk_93=0;
cs_93=1;
high56(); //1 --start
high56(); //1
low56(); //0 --10 read
low56(); //X --A8,
wd56(address); //A7--A0
dat=rd56(); //data
cs_93=0;
return(dat);
}
bit write93c56_word(unsigned char address,unsigned char dat)
{
unsigned char e;
unsigned char temp=address;
e=0;
while (e<3)
{
cs_93=sk_93=0;
cs_93=1;
ewen56();
_nop_();
cs_93=1;
_nop_();
high56(); //1 --start
low56(); //0
high56(); //1 --01 write
low56(); //X --A8,
wd56(address); //A7--A0
wd56(dat); //data
cs_93=0;
_nop_();
cs_93=1;
do_93=1;
while (1)
{
if (do_93==1) break;
}
cs_93=0;
if (read93c56_word(temp)==dat)
{
return(0);
}
e++;
}
return(1);
}
main()
{
unsigned char i;
CLKCON = 0x60; //f=osc/12
SCON1 = 0x50; //工作方式選擇,此處為工作方式1
SBRT1 = 0xFF; //波特率設置.工作在方式1時,BAUDRATE=(1/16)*Fsys/(32768-SBRT[1:0]) Fsys=16M
SBRT0 = 0xF7; //Fsys=16M/12
IEN1 = 0x04;
EA = 1;
for(i=0;i<200;i++)
{
if(write93c56_word(i,i)==0)
UART1SendChar('R');
else
UART1SendChar('E');
}
while(1)
{
for(i=0;i<200;i++)
{
if(read93c56_word(i)==i)
UART1SendChar('r');
else
UART1SendChar('e');
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -