?? ch11-1.c
字號:
//5045的底層操作程序,
#include <stdio.h>
#include <intrins.h>
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define WREN_INST 0x06 //寫使能控制字 Write enable latch instruction (WREN)
#define WRDI_INST 0x04 //寫禁能控制字 Write disable latch instruction (WRDI)
#define WRSR_INST 0x01 //寫狀態寄存器控制字 Write status register instruction (WRSR)
#define RDSR_INST 0x05 //讀狀態寄存器控制字 Read status register instruction (RDSR)
#define WRITE_INST 0x02 //寫存儲器控制字 Write memory instruction (WRITE)
#define READ_INST 0x03 //讀存儲器控制字 Read memory instruction (READ)
#define MAX_POLL 0x99 //最大查詢周期控制字 Maximum number of polls
#define WDT020 0x20 //看門狗超時周期200ms
#define WDT060 0x10 //看門狗超時周期600ms
#define WDT140 0x00 //看門狗超時周期1400ms
#define WDT000 0x30 //關閉看門狗
#define BP0 0x00 //沒有保護的空間
#define BP1 0x40 //保護0180--01ff
#define BP2 0x80 //保護0100--01ff
#define BP3 0xc0 //保護0000--01ff
//******************************************
//定義對5045的操作方式
#define CONTROL1 WDT000|BP0 //實際控制值一(關閉看門狗 沒有保護的空間)
#define CONTROL2 WDT140|BP3 //實際控制值二(看門狗超時周期1400ms 保護0000--01ff)
#define CONTROL3 WDT140|BP0 //實際控制值三(看門狗超時周期1400ms 沒有保護的空間)
//******************************************
//定義管腳
sbit SCK=P3^4; //時鐘
sbit SI=P3^5; //CPU--->5045
sbit SO=P3^5; //5045-->CPU
sbit CS=P3^6; //片選
//******************************************
//***************************************************************************
//5045底層操作程序,外部函數聲明
extern void Wrdi_Cmd(void); //寫禁能,在非正常的操作中斷后,主程序在初始化時最好執行一次此操作
extern void Wrsr_Cmd(uchar control_Byte); //寫狀態寄存器
extern void Byte_Write(uint e2_add,uchar a); //寫入一字節
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt); //寫入1頁,數據來源:內部的RAM
extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt); //寫入1頁,數據來源:外部的RAM
extern uchar Byte_Read(uint e2_add); //從5045的指定地址讀出1字節
extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uint data_amount); //從5045連續讀取數據.數據存放:內部的RAM
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uchar data_amount); //從5045連續讀取數據.數據存放:外部的RAM
//***************************************************************************
//*****************************************
//功能演示,在實際用的時候把這段注釋掉
void main(void)
{ uint add=0X0000;
uchar a=0x12;
uchar idata *pt;
uchar xdata *pt1;
uchar data temp[16]={8,8,8,7,8,1,4,3,8,6,9,4,3,6,1,9};
uchar data temp1[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar xdata temp2[16]={4,5,6,7,8,1,4,3,8,6,9,4,3,6,1,9};
uchar xdata temp3[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Wrdi_Cmd(); //復位寫使能
Wrsr_Cmd(CONTROL1); //設置5045的工作狀態
Byte_Write(add,0x90); //字節寫
a=Byte_Read(add); //字節讀
pt=&temp[0];
Page_Write_FromIdata(add,pt); //頁寫
pt=&temp1[0];
Sequ_Read_ToIdata(add,pt,16); //連續讀
pt1=&temp2[0];
Page_Write_FromXdata(add,pt1);
pt1=&temp1[0];
Sequ_Read_ToXdata(add,pt1,16);
while(1);
}
//*****************************************
//******************************************
//輸出一個字節
//入口:一個uchar形變量
//出口:無
static void OutByte(uchar ch)
{
uchar i=8;
do
{
SCK=0;
SI=(bit)(ch&0x80); //強制取為位變量,輸出
ch=ch<<1; //右移一位
SCK=1;
}
while(--i);
SI=0;
}
//******************************************
//******************************************
//輸入一個字節
//入口:沒有入口
//出口:一個uchar形變量
static uchar InByte(void)
{
uchar i,a=0;
SO=1;
for (i=8;i>0;i--)
{
SCK=1;
SCK=0;
a<<=1;
if(SO)
a|=0x01;
}
return(a);
}
//*****************************************
//*****************************************
//讀狀態寄存器
//入口:無
//出口:寄存器狀態
static uchar Rdsr_cmd(void)
{
uchar a;
SCK=0;
CS=0;
OutByte(RDSR_INST); //發出讀寄存器命令
a=InByte(); //讀入
SCK=0;
CS=1;
return(a);
}
//*****************************************
//*****************************************
//測試寫周期是否結束,超時后測試不成功也返回
//入口:無
//出口:無
static void Wip_Poll(void)
{
uchar temp,i=MAX_POLL;
do
{
temp=Rdsr_cmd();
ACC=temp;
if(!(ACC&0x01))
break; //結束后返回
}
while(--i); //超時也返回
}
//*****************************************
//*****************************************
//設置寫使能,在執行寫入操作之前要先將寫使能控制位置位
//入口:無
//出口:無
static void Wren_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WREN_INST);
SCK=0;
CS=1;
}
//*****************************************
//*****************************************
//寫禁能,在非正常的操作中斷后,主程序在初始化時最好執行一次此操作
//入口:無
//出口:無
extern void Wrdi_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WRDI_INST);
SCK=0;
CS=1;
}
//*****************************************
//*****************************************
//寫狀態寄存器
//入口:控制字
//出口:無
extern void Wrsr_Cmd(uchar control_Byte)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRSR_INST);
OutByte(control_Byte);
SCK=0;
CS=1;
Wip_Poll();
}
//*****************************************
//*****************************************
//寫入數據之前的預操作
//入口:5045的地址
//出口:無
static void Pre_Write(uint c1)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRITE_INST|(0x08&((uchar)(c1/256))<<3)); //將地址的第9位(D9)傳送到命令字中,隨命令字一起發出
OutByte((uchar)c1); //發送地址的低8位
}
//*****************************************
//*****************************************
//寫入一字節
//入口:5045的地址,待寫數據
//出口:無
extern void Byte_Write(uint e2_add,uchar a)
{
Pre_Write(e2_add); //預操作
OutByte(a); //發出數據
SCK=0;
CS=1;
Wip_Poll(); //等待寫入操作完成
}
//*****************************************
//*****************************************
//寫入1頁,數據來源:內部的RAM
//入口:5045的地址,指向內部RAM的指針
//出口:無
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt)
{
uchar i;
Pre_Write(e2_add); //預寫
for (i=16;i>0;--i,pt++) //連續寫入16字節(5045一頁為16字節)
OutByte(*pt);
SCK=0;
CS=1;
Wip_Poll(); //等待寫入操作完成
}
//*****************************************
//*****************************************
//寫入1頁,數據來源:外部的RAM
//入口:5045的地址,指向外部RAM的指針
//出口:無
extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt)
{
uchar i;
Pre_Write(e2_add); //預寫
for (i=16;i>0;--i,pt++) //連續寫入16字節(5045一頁為16字節)
OutByte(*pt);
SCK=0;
CS=1;
Wip_Poll(); //等待寫入操作完成
}
//*****************************************
//*****************************************
//讀數據之前的預操作
//入口:5045的地址
//出口:無
static void Pre_Read(uint c1)
{
SCK=0;
CS=0;
OutByte(READ_INST|(0x08&((uchar)(c1/256))<<3)); //將地址的第9位(D9)傳送到命令字中,隨命令字一起發出
OutByte((uchar)c1); //發送地址的低8位
}
//*****************************************
//*****************************************
//從5045的指定地址讀出1字節
//入口:5045的地址
//出口:數據
extern uchar Byte_Read(uint e2_add)
{
uchar a;
Pre_Read(e2_add); //預讀取
a=InByte(); //讀出數據
SCK=0;
CS=1;
return(a);
}
//*****************************************
//*****************************************
//從5045連續讀取數據.數據存放:內部的RAM
//入口:5045的地址,指向內部RAM的指針,數據的個數
//出口:無
extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uint data_amount)
{
uint i;
Pre_Read(e2_add); //預讀取
for (i=data_amount;i>0;--i,pt++)
*pt=InByte(); //讀出數據
SCK=0;
CS=1;
}
//*****************************************
//*****************************************
//從5045連續讀取數據.數據存放:外部的RAM
//入口:5045的地址,指向外部RAM的指針,數據的個數
//出口:無
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uchar data_amount)
{
uchar i;
Pre_Read(e2_add);
for (i=data_amount;i>0;--i,pt++)
*pt=InByte();
SCK=0;
CS=1;
}
//*****************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -