?? sm.c
字號:
#include <MSP430X14X.h>
#include "SM.h"
//全局變量
extern int nSM_R_B;
void SM_Port_Init(void)
{
P4DIR = 0;
P4DIR |= BIT0; //設(shè)置CLE為輸出管腳
P4DIR |= BIT1; //設(shè)置CE~為輸出管腳
P4DIR |= BIT2; //設(shè)置ALE為輸出管腳
P4DIR |= BIT3; //設(shè)置RE~為輸出管腳
P4DIR |= BIT4; //設(shè)置WE~為輸出管腳
P1DIR &= ~(BIT1); //設(shè)置R/B為輸入管腳
//將P4、P5口的管腳設(shè)置為一般I/O口
P4SEL = 0;
P5SEL = 0;
return;
}
void CLE_Enable(void)
{
P4OUT |= BIT0;
return;
}
void CLE_Disable(void)
{
P4OUT &= ~(BIT0);
return;
}
void CE_Enable(void)
{
P4OUT &= ~(BIT1);
return;
}
void CE_Disable(void)
{
P4OUT |= BIT1;
return;
}
void ALE_Enable(void)
{
P4OUT |= BIT2;
return;
}
void ALE_Disable(void)
{
P4OUT &= ~(BIT2);
return;
}
void WE_Enable(void)
{
P4OUT &= ~(BIT4);
return;
}
void WE_Disable(void)
{
P4OUT |= BIT4;
return;
}
void RE_Enable(void)
{
P4OUT &= ~(BIT3);
return;
}
void RE_Disable(void)
{
P4OUT |= BIT3;
return;
}
////////////////////////////////////////
// 正確返回 1,錯誤返回 0
int PageWrite(int nCol,unsigned long nRow,char *pBuf)
{
int nTemp = 0;
int i;
int j;
unsigned nADD1;
unsigned nADD2;
unsigned nADD3;
//處理最高地址的時候必須注意的是其余沒有用的位必須是 0
nADD1 = (unsigned char)((nRow & 0x000000ff) >> 0);
nADD2 = (unsigned char)((nRow & 0x0000ff00) >> 8);
nADD3 = (unsigned char)((nRow & 0x00010000) >> 16);
CE_Enable();
P5DIR = 0xff; //設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = 0x80; //頁寫命令
WE_Disable();
CLE_Disable();
ALE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCol); // 行的起始地址
WE_Disable();
// 發(fā)送第一個行地址
WE_Enable();
P5OUT = nADD1;
WE_Disable();
// 發(fā)送第二個行地址
WE_Enable();
P5OUT = nADD2;
WE_Disable();
// 發(fā)送第三個行地址
WE_Enable();
P5OUT = nADD3;
WE_Disable();
ALE_Disable();
// 寫如數(shù)據(jù)
for(j = 0;j < 528;j++)
{
WE_Enable();
P5OUT = pBuf[j];
WE_Disable();
}
// 發(fā)送寫確認(rèn)命令
CLE_Enable();
WE_Enable();
P5OUT = 0x10;
WE_Disable();
CLE_Disable();
//延遲一點時間,等待R/B低電平
for(i = 100;i > 0;i--);
// 讀狀態(tài)寄存器
CLE_Enable();
WE_Enable();
P5OUT = 0x70;
WE_Disable();
CLE_Disable();
P5DIR = 0x00; //設(shè)置P5口為輸入方向
for(i = 1000;i > 0;i--)
{
RE_Enable();
nTemp = P5IN;
RE_Disable();
if(nTemp == 0xc0) break;
}
if(nTemp == 0xc0) return 1;
else return 0;
}
////////////////////////////////////////
// 正確返回 1,錯誤返回 0
int WriteByte(int nCommand,int nCol,unsigned long nRow,char nValue)
{
int nTemp = 0;
int i;
unsigned nADD1;
unsigned nADD2;
unsigned nADD3;
//處理最高地址的時候必須注意的是其余沒有用的位必須是 0
nADD1 = (unsigned char)((nRow & 0x000000ff) >> 0);
nADD2 = (unsigned char)((nRow & 0x0000ff00) >> 8);
nADD3 = (unsigned char)((nRow & 0x00010000) >> 16);
CE_Enable();
P5DIR = 0xff; //設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCommand); //命令
WE_Disable();
CLE_Disable();
CLE_Enable();
WE_Enable();
P5OUT = 0x80; //頁寫命令
WE_Disable();
CLE_Disable();
ALE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCol); // 行的起始地址
WE_Disable();
// 發(fā)送第一個行地址
WE_Enable();
P5OUT = nADD1;
WE_Disable();
// 發(fā)送第二個行地址
WE_Enable();
P5OUT = nADD2;
WE_Disable();
// 發(fā)送第三個行地址
WE_Enable();
P5OUT = nADD3;
WE_Disable();
ALE_Disable();
// 寫入一個字節(jié)的內(nèi)容
WE_Enable();
P5OUT = nValue;
WE_Disable();
// 發(fā)送寫確認(rèn)命令
CLE_Enable();
WE_Enable();
P5OUT = 0x10;
WE_Disable();
CLE_Disable();
//延遲一點時間,等待R/B低電平
for(i = 100;i > 0;i--);
// 讀狀態(tài)寄存器
CLE_Enable();
WE_Enable();
P5OUT = 0x70;
WE_Disable();
CLE_Disable();
P5DIR = 0x00; //設(shè)置P5口為輸入方向
for(i = 1000;i > 0;i--)
{
RE_Enable();
nTemp = P5IN;
RE_Disable();
if(nTemp == 0xc0) break;
}
if(nTemp == 0xc0) return 1;
else return 0;
}
////////////////////////////////////////
// 正確返回 1,錯誤返回 0
char ReadByte(int nCommand,int nCol,unsigned long nRow)
{
int i;
char chrLow = 0;
unsigned char nADD1;
unsigned char nADD2;
unsigned char nADD3;
//處理最高地址的時候必須注意的是其余沒有用的位必須是 0
nADD1 = (unsigned char)((nRow & 0x000000ff) >> 0);
nADD2 = (unsigned char)((nRow & 0x0000ff00) >> 8);
nADD3 = (unsigned char)((nRow & 0x00010000) >> 16);
CE_Enable();
P5DIR = 0xff; //設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCommand); //輸出讀命令代碼;
WE_Disable();
CLE_Disable();
// 發(fā)送列地址
ALE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCol);
WE_Disable();
// 發(fā)送第一個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD1);
WE_Disable();
// 發(fā)送第二個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD2);
WE_Disable();
// 發(fā)送第三個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD3);
WE_Disable();
ALE_Disable();
//延遲一點時間,等待R/B低電平
for(i = 100;i > 0;i--);
P5DIR = 0; //設(shè)置P5口為輸入方向
// 讀取一個字節(jié)的內(nèi)容
RE_Enable();
chrLow = P5IN;
RE_Disable();
CE_Disable();
return chrLow;
}
////////////////////////////////////////
// 正確返回 1,錯誤返回 0
int PageRead(int nCol,unsigned long nRow,char *pBuf)
{
int nTemp = 0;
int i;
int j;
unsigned char nADD1;
unsigned char nADD2;
unsigned char nADD3;
//處理最高地址的時候必須注意的是其余沒有用的位必須是 0
nADD1 = (unsigned char)((nRow & 0x000000ff) >> 0);
nADD2 = (unsigned char)((nRow & 0x0000ff00) >> 8);
nADD3 = (unsigned char)((nRow & 0x00010000) >> 16);
CE_Enable();
P5DIR = 0xff; //設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = 0x00; //輸出讀命令代碼 0x00;
WE_Disable();
CLE_Disable();
// 發(fā)送列地址
ALE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nCol);
WE_Disable();
// 發(fā)送第一個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD1);
WE_Disable();
// 發(fā)送第二個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD2);
WE_Disable();
// 發(fā)送第三個行地址
WE_Enable();
P5OUT = (unsigned char)(nADD3);
WE_Disable();
ALE_Disable();
//延遲一點時間,等待R/B低電平
for(i = 100;i > 0;i--);
P5DIR = 0; //設(shè)置P5口為輸入方向
// 讀取一頁的數(shù)據(jù)
for(j = 0;j < 528;j++)
{
RE_Enable();
pBuf[j] = P5IN;
RE_Disable();
}
CE_Disable();
return nTemp;
}
////////////////////////////////////////
// 正確返回 1,錯誤返回 0
int ReadID(unsigned char pBuf[2])
{
int nTemp = 0;
int nMaker = 0;
int nDevice = 0;
CE_Enable(); // 使能片選信號
ALE_Disable();
CLE_Disable();
RE_Disable();
WE_Disable();
P5DIR = 0XFF; // 設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = 0x90; // 輸出命令代碼 0x90
WE_Disable();
CLE_Disable();
ALE_Enable();
WE_Enable();
P5OUT = 0x00; // 地址周期
WE_Disable();
ALE_Disable();
P5DIR = 0x00; // 設(shè)置P5口為輸入方向
// 讀取內(nèi)容
RE_Enable();
nMaker = P5IN;
RE_Disable();
RE_Enable();
nDevice = P5IN;
RE_Disable();
CE_Disable();
if(nMaker == 0xec)
{
if(nDevice == 0x76 || nDevice == 0x79)
{
nTemp = 1;
pBuf[0] = (unsigned char)(nMaker);
pBuf[1] = (unsigned char)(nDevice);
}
}
return nTemp;
}
/////////////////////////////////////////
//成功返回 1,錯誤返回 0
int BlockErase(unsigned long nAddr)
{
int nTemp = 0;
int i;
unsigned char nADD1;
unsigned char nADD2;
unsigned char nADD3;
//處理最高地址的時候必須注意的是其余沒有用的位必須是 0
nADD1 = (unsigned char)((nAddr & 0x000000ff) >> 0);
nADD2 = (unsigned char)((nAddr & 0x0000ff00) >> 8);
nADD3 = (unsigned char)((nAddr & 0x00010000) >> 16);
CE_Enable();
P5DIR = 0xff; //設(shè)置P5口為輸出方向
CLE_Enable();
WE_Enable();
P5OUT = 0x60; //輸出塊擦出命令
WE_Disable();
CLE_Disable();
// 發(fā)送行地址第一字節(jié)
ALE_Enable();
WE_Enable();
P5OUT = (unsigned char)(nADD1);
WE_Disable();
// 發(fā)送行地址第二字節(jié)
WE_Enable();
P5OUT = (unsigned char)(nADD2);
WE_Disable();
// 發(fā)送行地址第三字節(jié)
WE_Enable();
P5OUT = (unsigned char)(nADD3);
WE_Disable();
ALE_Disable();
// 發(fā)送擦除確認(rèn)命令
CLE_Enable();
WE_Enable();
P5OUT = 0xd0;
WE_Disable();
CLE_Disable();
//延遲一點時間,等待R/B低電平
for(i = 200;i > 0;i--);
// 發(fā)送讀狀態(tài)寄存器命令
CLE_Enable();
WE_Enable();
P5OUT = 0x70;
WE_Disable();
CLE_Disable();
P5DIR = 0; //設(shè)置P5口為輸入方向
// 讀狀態(tài)寄存器的內(nèi)容
RE_Enable();
nTemp = P5IN;
RE_Disable();
CE_Disable();
if(nTemp & 0x01) return 0;
else return 1;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -