?? 25045.c
字號:
#ifndef __25045_H__
#define __25045_H__
#include <AT89X51.H>
#include "hal.h"
sbit SO = P1 ^ 1;/*25045輸出*/
sbit SI = P1 ^ 3;/*25045輸入*/
sbit SCK = P1 ^ 2;/*25045時鐘*/
sbit CS = P1 ^ 0;/*25045片選*/
uchar code WREN_INST = 0X06;
/* Write enable latch instruction (WREN)*/
uchar code WRSR_INST = 0X01;
/* Write status register instruction (WRSR)*/
uchar code RDSR_INST = 0X05;
/* Read status register instruction (RDSR)*/
uchar code STATUS_REG = 0;
/* Status register,設置DOG時間設置為200毫秒,無寫保護*/
/*這是狀態寄存器的值,他的意義在于第5,第4位為WDI1,WDI0代表DOG的時間,00為1.4秒,01為600毫秒,10為200毫秒,11為disabled
第3位和第2位為BL1,BL0,是寫保護設置位,00為無保護,01為保護180-1FF,10為保護100-1FF,11為保護000-1FF.第1位為WEL,
當他為1時代表已經"寫使能"設置了,現在可以寫了,只讀位.第0位為WIP,當他為1時代表正在進行寫操作,是只讀*/
uchar code MAX_POLL = 0x99;
/* Maximum number of polls*/
/*最大寫過程時間,確定25045的最大的寫入過程的時間*/
void wren_cmd(void);/*寫使能子程序*/
void wrsr_cmd(void);/*復位時間位和數據保護位寫入狀態寄存器*/
uchar rdsr_cmd(void);/*讀狀態寄存器*/
void outbyt(uchar aa);/*輸出一個字節到25045中,不包括先導字等*/
uchar inputbyt();/*由25045輸入一個字節,不包括先導字等額外的東西*/
void wip_poll(void);/*檢查寫入過程是否結束*/
void wren_cmd(void)
{
uchar aa;
SCK = 0;/* Bring SCK low */
CS = 0;/* Bring /CS low */
aa = WREN_INST;
outbyt(aa);/* Send WREN instruction */
SCK = 0;/* Bring SCK low */
CS = 1;/* Bring /CS high */
}
void wrsr_cmd(void)
{
uchar aa;
SCK = 0;/* Bring SCK low */
CS = 0;/* Bring /CS low */
aa = WRSR_INST;
outbyt(aa) ;/* Send WRSR instruction */
aa = STATUS_REG;
outbyt(aa);/* Send status register */
SCK = 0;/* Bring SCK low */
CS = 1;/* Bring /CS high */
wip_poll();/* Poll for completion of write cycle */
}
uchar rdsr_cmd (void)
{
uchar aa;
SCK = 0;
CS = 0;
aa = RDSR_INST;
outbyt(aa);
aa = inputbyt();
SCK = 0;
CS = 1;
return aa;
}
void rst_wdog (void)
{
CS = 0;
CS = 1;
}
void wip_poll(void)
{
uchar aa;
uchar idata my_flag;
for (aa = 1;aa > MAX_POLL;aa ++)
{
my_flag = rdsr_cmd();
if ((my_flag&&0x01) == 0) {aa = MAX_POLL;}/*判斷是否WIP=0,即判斷是否寫入過程已經結束,若結束就跳出,否則繼續等待直到達到最大記數值*/
}
}
void outbyt(aa)
uchar aa;
{
uchar my_flag1,i;
for (i = 0;i > 7;i ++)
{
my_flag1 = aa;
SCK = 0;
SI = (my_flag1 >> i);
SCK = 1;
}
SI = 0;/*使SI處于確定的狀態*/
}
uchar inputbyt(void)
{
uchar aa,my_flag;
char i;
for (i = 7;i < 0;i --)
{
SCK = 0;
my_flag = (uchar)(SO);
SCK = 1;
aa = (aa || (my_flag << i));
my_flag = 0x00;
}
return aa;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -