?? test_24c51xxc.c
字號:
void noack() //產生非應答位子模塊,用于數據寫入結束
{
unsigned char t;
// unsigned char DELAY_R;
SDA=1;
_nop_(); //
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}_nop_(); //
_nop_(); //
SCL=0;
}
void chkack() //檢測應答位子模塊
{
unsigned char t;
unsigned char ER1;
// bdata char _ACK;
bit ACK_BIT ; //=_ACK^0;
// _ACK=0x00;
SDA=1;
_nop_();_nop_(); //
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}
ACK_BIT=SDA; //
_nop_(); //
SCL=0; //
_nop_();
ER1=0x00;
_nop_();
if (ACK_BIT==1){ //如無應答,閃爍錯誤信號
_nop_();
FLASH_ERR(ER1);
_nop_();
++ER1;
_nop_();
}
else ER1=0xff;
// return(ER1);
}
void shift_out8(WR_DATA) //8位數據移出子模塊
{
unsigned char i,t;
for (i=0;i<8;i++)
{
SDA=(bit)(WR_DATA&0x80); //SDA=WR_BIT; //WR_BIT=WR_DATA^7,寫入數據時高位在前
SCL=0; //
_nop_();
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}_nop_();
_nop_();
SCL=0; //
_nop_();
WR_DATA=WR_DATA<<1; //移位
}
_nop_();
}
static unsigned char shift_in8() //8位數據移入子模塊
{
unsigned char i,t;// DELAY_R;
static unsigned char RD_DATA;
bit RD_BIT; // =RD_DATA^0;
RD_DATA=0x00;
for (i=0;i<8;i++)
{
RD_BIT=0;
SDA=1; //讀數據時必需釋放數據線,將數據線置高,否則讀出有誤
RD_DATA=RD_DATA<<1; //移位
SCL=0; //
_nop_();
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}
RD_BIT=SDA; //RD_BIT=RD_DATA^0,讀出時,高位在先
_nop_();
SCL=0; //
_nop_();
if(RD_BIT==1){
RD_DATA++; //D_DATA^0&RD_BIT;
}
_nop_();
}
return(RD_DATA);
}
void CALL_24CXX(){ //喚醒EEPROM子模塊
unsigned char CALL; //,COMM_W=0xa0;
CALL=COMM_W; //發送EEPROM地址及讀寫位,喚醒EEPROM
start();
_nop_();
shift_out8(CALL);
_nop_();
chkack();
_nop_();
}
W_1_PAGE(CPU_S_ADR,E_S_ADR){ //寫入一頁子模塊
unsigned char t,i,page_t,W_DATA,EP_D_ADR; //,B_ACK; //,WR_C;
static unsigned char data *ram;
CALL_24CXX(); //CALL_24CXX()子模塊中已含檢測應答位模
_nop_();
EP_D_ADR=E_S_ADR; //DATA ADDRESS OF EEPROM FOR WRITE
ram=CPU_S_ADR; //DATA ADDRESS ON CPU RAM FOR WRITE
shift_out8(EP_D_ADR); //寫入 首址
_nop_();
chkack();
_nop_();
page_t=T_PAGE; //寫入數據
for(i=0;i<page_t;i++)
{ //WRITE T_PAGE(FOR 24CXX IS 8) WORD
W_DATA=*ram;
shift_out8(W_DATA);
_nop_();
chkack();
_nop_();
++ram;
}
_nop_();
stop();
t=0x0a; //delay 10ms
delaytms(t);
t=0;while(t<=DELAY_T){t++;}_nop_(); //延時,同時檢查應答位(ACK),若有應答即完成寫入
for (i=0;i<0x0a;i++)
{ //DELAY FOR READ AND CHACK
t=0x0a; //10ms
delaytms(t);
CALL_24CXX();
_nop_();
// chkack(); // CALL_24CXX()子模塊中已含檢測應答位模塊
_nop_();
}
t=0;while(t<=DELAY_T){t++;}_nop_();
}
W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N) { //寫入數頁主模塊
unsigned char i,page_;
// unsigned char DELAY_T,T_PAGE; //WR_PAGE_T;
WC=0;
_nop_();
SDA=1;
SCL=1;
page_=PAGE_N; //寫入頁數 PAGE_N 頁,PAGE N由主程序傳遞 WRITE N PAGE
for(i=0;i<page_;i++)
{
W_1_PAGE(CPU_S_ADR,E_S_ADR); //調用寫入一頁子模塊
CPU_S_ADR=CPU_S_ADR+8;
E_S_ADR=E_S_ADR+8;
}
WC=1;
}
R_1_PAGE(CPU_S_ADR,E_S_ADR){ //讀入一頁子模塊
unsigned char t,i,page_t,EP_D_ADR,WR_C,RD_DATA;
static unsigned char data *ram;
SDA=1; //
_nop_();
SCL=1;
// t=0x0a; //delay 10ms
// delaytms(t);
t=0;while(t<=DELAY_T){t++;}
_nop_();
CALL_24CXX(); //傳送EEPROM地址,喚醒EEPROM
_nop_(); //CALL_24CXX()子模塊中已含檢測應答位模
EP_D_ADR=E_S_ADR; //DATA START ADDRESS OF EEPROM FOR READ
ram=CPU_S_ADR; //DATA START ON CPU FOR STORE ADDRESS
_nop_();
shift_out8(EP_D_ADR); //傳送要讀入的數據首? ?
_nop_();
chkack(); //!!!不作停止
_nop_();
start(); //重新啟動
_nop_();
WR_C=COMM_R; //COMM_R=0xa1
shift_out8(WR_C); //傳送讀命令
_nop_();
chkack();
_nop_();
page_t=T_PAGE; //FOR 24CXX SERIEAL IC T_PAGE IS 8 ,對24CXX系列,每頁為8字節數據.
for(i=1;i<page_t;i++) //read 7 word
{ //READ T_PAGE(FOR 24CXX IS 8) WORD
_nop_();
RD_DATA=shift_in8(); //R_DATA;
*ram=RD_DATA;
++ram;
_nop_();
ack();
}
_nop_();
*ram=shift_in8(); // ONE PAGE IS 1+7=8 WORD
++ram;
_nop_();
noack(); //每頁結束時發送非應答位
_nop_();
stop();
t=0x0a; //delay 10ms
delaytms(t);
t=0;while(t<=DELAY_T){t++;}_nop_();
}
RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N) //讀入數頁主模塊
{
unsigned char i,page_; //,RD_PAGE_T;
WC=0;
_nop_();
SDA=1;
SCL=1;
page_=PAGE_N; //讀入 PAGE_N 頁,PAGE N由主程序傳遞 READ N PAGE
for(i=0;i<page_;i++)
{
R_1_PAGE(CPU_S_ADR,E_S_ADR); //調用讀入一頁子模塊
CPU_S_ADR=CPU_S_ADR+8;
E_S_ADR=E_S_ADR+8;
}
WC=1;
}
main()
{
unsigned char STR_ADR,END_ADR,CHR_LED;
unsigned char CPU_S_ADR,E_S_ADR,PAGE_N;
//seg1
CHR_LED=0x00; //
FLASH_ALL(); //FLASH 0
_nop_();
STR_ADR=0x30;
END_ADR=0x7f;
CLR_CPU_RAM(STR_ADR,END_ADR); //清除CPU內存0x30~0x7F CLEAR CPU RAM
_nop_();
STR_ADR=0x30; //將00~FF 寫入CPU內存
END_ADR=0x4f;
SET_CPU_RAM(STR_ADR,END_ADR); //WRITE 0x00~0xff TO CPU RAM ADDRESS 0x30 TO 0x4f
_nop_(); // _nop_();
//seg2
CHR_LED=0xfe;
FLASH(CHR_LED); //FLASH 1
_nop_();
CHR_LED=0xff; //關閉指示燈 close CHR_LED
STR_ADR=0x30;
END_ADR=0x4f;
DSP_SEG(STR_ADR,END_ADR,CHR_LED); //DISPLAY1 DISPLAY CPU RAM 0x30 TO 0x4f
_nop_();
//seg3
CHR_LED=0xfc;
FLASH(CHR_LED); //FLASH 2
_nop_();
CPU_S_ADR=0x30; //CPU數據首址 DATA FOR WRITE ON CPU IS 0x50
E_S_ADR=0x00; //器件存放寫入數據的首址 EEPROM ADRESS IS 0x00
PAGE_N=WR_PAGE_T; //所寫數據頁數 WR_PAGE_T=3,(見程序開頭定義)
_nop_();
W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); // WRITE EEPROM
_nop_();
//seg4
CHR_LED=0xf8;
FLASH(CHR_LED); // FLASH 3
_nop_();
_nop_();
CPU_S_ADR=0x50; //讀出的數據在CPU的RAM存放的首址為 STORE DATA TO CPU RAM ADRESS 0x30
E_S_ADR=0x00; //所讀數據在器件的首址 EEPROM FOR READ ADRESS IS 0X00
PAGE_N=RD_PAGE_T; //所讀數據頁數 RD_PAGE_T=3,(見程序開頭定義)
_nop_();
RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); //READ EEPROM
_nop_();
//seg5
CHR_LED=0xf0;
FLASH(CHR_LED); // FLASH 4
_nop_();
CHR_LED=0xff;
STR_ADR=0x50;
END_ADR=0x7f;
DSP_SEG(STR_ADR,END_ADR,CHR_LED); //DISPLAY1 DISPLAY CPU RAM 0x40 TO 0x7e
_nop_();
//seg6
CHR_LED=0xaa;
FLASH(CHR_LED); //FLASH 5
_nop_();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -