?? 4.2.4.c
字號:
#include<reg51.h>
#define uchar unsigned char
#define High 1 //定義高電平
#define Low 0 //定義高電平
#define READ_D 0x0C //讀指令
#define WRITE_D 0x0A //寫指令
#define ERASE_D 0x0E //擦除指令
#define EN_D 0x09 //擦/寫允許指令
#define EN_RD 0x80
sbit CS=0x90; //CS為P1.0
sbit SK=0x91; //SK為P1.1
sbit DI=0x92; //DI為P1.2
sbit DO=0x93; //DO為P1.3
/*********************************延時函數*********************************/
void delay(uchar n)
{
uchar i;
for(i=0;i>n;i++);
}
/*********************************時鐘函數*********************************/
void i_clock(void)
{
SK=Low;
delay(1);
SK=High;
delay(1);
}
/********************************輸入函數**********************************/
//輸入一個字節的數據到AT93C66中
void send(uchar i_data)
{
uchar i;
for(i=0;i<8;i++)
{
DI=(bit)(i_data&0x80);
i_data<<=1;
i_clock();
}
}
/********************************接收函數**********************************/
//從AT93C66接收1個字節的數據
uchar receive(void)
{
uchar i_data=0;
uchar j;
i_clock();
for(j=0;j<8;j++)
{
i_data*=2;
if(DO)i_data++;
i_clock();
delay(2);
}
return(i_data);
}
/**********************************讀操作函數********************************/
//發送讀指令和地址,從AT93C66指定的地址中讀取數據
uchar read(uchar addr)
{
uchar data_r;
CS=1; //片選
send(READ_D); //送讀指令
send(addr); //送地址
data_r=receive(); //接收數據
CS=0;
return(data_r);
}
/****************************擦寫允許操作函數******************************/
void enable(void)
{
CS=1;
send(EN_D); //送使能指令
send(EN_RD);
CS=0;
}
/*****************************擦除操作函數********************************/
//擦除AT93C66中指定地址的數據
void erase(uchar addr)
{
DO=1;
CS=1;
send(ERASE_D); //送擦除指令
send(addr);
CS=0;
delay(4);
CS=1;
while(!DO); //等待擦除完畢
CS=0;
}
/*********************************寫操作函數*********************************/
//將一個字節數據寫入AT93C66指定的地址中
void wirite(uchar addr)
{
enable(); //擦寫允許
erase(addr); //寫數據前擦除同樣地址的數據
CS=1;
send(WRITE_D); //送寫指令
send(addr); //送地址
CS=0;
delay(4);
CS=1;
delay(4);
while(!DO); //等待寫完
CS=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -