?? test_24c51xxc.c
字號:
// TITLE TEST 24CXX (CONVERT FROM 24CXX51A.ASM CPU 89C51)
//對應(yīng)原理圖 K&D2.SCH/AVC.DDB
//1,CLEAR CPU RAM ADDRESS STR_ADR TO END_ADR (30H~7FH)
//2,WRITE 00~FF TO CPU RAM STR_ADR TO END_ADR (30H~4FH)
//3,WRITE TO EEPROM 24CXX ADDRESS E_D_ADDR_R (00H -
//4,READ EEPROM TO CPU RAM ADDRESS C_R_ADR_R (50H-7FH)
//5,DESPLAY CPU RAM FROM CPU ADDRESS C_R_ADR_R
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
//#pragma small
data char CPU_S_ADR; //DATA START ADDRESS ON CPU RAM FOR STORE AFTER READ BUFFER
data char E_S_ADR; //EEPROM DATA WRITE ADDRESS BUFFER
data char CHR_LED;
data char CHR_;
//static bdata char RD_DATA;
//bdata char WR_DATA;
//sbit RD_BIT=RD_DATA^0;
//data char E_ D_ADR; //EEPROM DATA READ ADDRESS BUFFER
//data char CHR_L ; //CHARACTER1 BUFFER, BCD 數(shù)碼字符個位
//data char CHR_D ; //CHARACTER1 BUFFER, BCD 數(shù)碼字符十位
//data char CHR_H ; //CHARACTER2 BUFFER, BCD 數(shù)碼字符百位
#define DIS_STA P0 //charactor status P0
#define DIS_SEL P1 //charactor select P1
//;NUMBER DEFINE !!!!
#define COMM_R 0xa1 // 10100001B (=A1)器件物理地址與讀命令 EEPROM PHYSICS ADDRESS FOR COMMAND READ
#define COMM_W 0xa0 // 10100000B (=A0)器件物理地址與寫命令 EEPROM PHYSICS ADDRESS FOR COMMAND WRITE
#define RD_PAGE_T 3 // 讀出頁數(shù)為 3 頁 READ PAGE TIMES IS 3
#define WR_PAGE_T 3 // 寫入頁數(shù)為 3 頁 WRITE PAGE TIMES IS 3
#define E_D_E_ADR 0x00 //寫入數(shù)據(jù)時器件存放寫入數(shù)據(jù)的首址 DATA ADDRESS OF EEPROM FOR WRITE
#define E_D_R_ADR 0x00 //讀出數(shù)據(jù)時器件的被讀出數(shù)據(jù)的首址 DATA ADDRESS OF EEPROM FOR READ
#define C_D_W_ADR 0x50 //寫入數(shù)據(jù)時CPU存放要寫的數(shù)據(jù)的首址 ADDRESS OF DATA ON CPU RAM FOR WRITE TO EEPROM
#define C_D_R_ADR 0x40 //讀出數(shù)據(jù)時CPU用于存放讀出數(shù)據(jù)的RAM首址 READ DATA AND STORE TO CPU RAM START ADDRESS
//;different crystal type different delay time
#define DELAY_R 0x05 //FOR 12mHz CRYSTAL DELAYR3~5uS
#define DELAY_T 0x1f
//;ifferent eeproml type different page
#define T_PAGE 0x08 //一頁所含子節(jié)數(shù) ST24CXX 系列為8字節(jié) FOR 24C02 PAGE IS 8
sbit SCL=P3^1; //P3.1 S CLOCK 串行數(shù)據(jù)線
sbit SDA=P3^0; //P3.0 S DATA 串行時鐘線
sbit WC=P1^5; //WRITE CONTROL 選片位
sbit CHR_1_SEL=P1^1; // SELECT CHANNEL 1 FOR CHARACTOR 1 LED
sbit CHR_2_SEL=P1^0; // SELECT CHANNEL 2 FOR CHARACTOR 2 NC
sbit CHR_3_SEL=P1^2; // SELECT CHANNEL 3 FOR CHARACTOR 3 CHR_L
sbit CHR_4_SEL=P1^3; // SELECT CHANNEL 4 FOR CHARACTOR 3 CHR_H
//sbit RD_BIT=RD_DATA^0;
//sbit WR_BIT=WR_DATA^7;
/*****************函數(shù)列表**********************/
void FLASH_ALL(); //閃爍全部數(shù)碼和指示燈模塊
void FLASH(char CHR_LED); //顯示指定LED燈模塊
void CLR_CPU_RAM(STR_ADR,END_ADR); //清CPU內(nèi)存模塊
void SET_CPU_RAM(STR_ADR,END_ADR); //寫00~FFH 到CPU內(nèi)存模塊
void DISPLAY(CHR_,CHR_LED); //顯示單個字符及指示燈模塊
void DSP_SEG(STR_ADR,END_ADR,CHR_LED); //顯示 CPU 內(nèi)存由地址STR_ADR開始到END_ADR 內(nèi)容
void FLASH_ERR(char ERR ); //讀寫EEPROM錯誤顯示模塊
void start(); //啟動時序模塊子模塊
void stop(); //終止時序子模塊
void ack(); //產(chǎn)生應(yīng)答位子模塊
void noack(); //產(chǎn)生非應(yīng)答位子模塊,用于數(shù)據(jù)寫入結(jié)束
void chkack(); //檢測應(yīng)答位子模塊
void shift_out8(WR_DATA); //8位數(shù)據(jù)移出子模塊
static unsigned char shift_in8(); //8位數(shù)據(jù)移入子模塊
void CALL_24CXX(); //喚醒EEPROM子模塊
W_1_PAGE(CPU_S_ADR,E_S_ADR); //寫入一頁子模塊
W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); //寫入數(shù)頁主模塊
R_1_PAGE(CPU_S_ADR,E_S_ADR); //讀入一頁子模塊
RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); //讀入數(shù)頁主模塊
delaytms(t); //延時1mS模塊
char code SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0X92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共陽;= 0 1 2 3 4 5 6 7 8 9 A b C d E F
//用共陽LED 顯示狀態(tài) 0-->選通筆劃 ,字符選擇 0-->選通該字符,請參閱原理圖 K&D2.SCH/AVC.DDB //
delaytms(t){ //延時1mS模塊 for 12mHz crystal delay 1ms=0xff x 0x02
unsigned char i,tmp;
for(i=0;i<t;i++)
{
// tmp=0xff; //
// while(tmp--);
tmp=0xff; //
while(tmp--);
}}
void FLASH_ALL(){ //閃爍全部數(shù)碼和指示燈模塊
unsigned char i,t; //DIS_SEL,DIS_STA,
DIS_STA=0x00;
DIS_SEL=0xff;
for(i=0;i<5;i++)
{
CHR_1_SEL=0;
CHR_2_SEL=0;
CHR_3_SEL=0;
CHR_4_SEL=0;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
CHR_1_SEL=1;
CHR_2_SEL=1;
CHR_3_SEL=1;
CHR_4_SEL=1;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
_nop_();
}
DIS_STA=0xff;
DIS_SEL=0xff;
}
void FLASH(char CHR_LED ){ //顯示指定LED燈模塊
unsigned char i,t; //DIS_SEL,DIS_STA,
DIS_STA=CHR_LED;
DIS_SEL=0xff;
for(i=0;i<5;i++)
{
CHR_1_SEL=0;
CHR_2_SEL=0;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
CHR_1_SEL=1;
CHR_2_SEL=1;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
_nop_();
}
DIS_STA=0xff;
DIS_SEL=0xff;
}
void CLR_CPU_RAM(STR_ADR,END_ADR) { //清CPU內(nèi)存模塊 CLEAR CPU RAM
unsigned char i,s_adr,e_adr;
static unsigned char data *ram;
s_adr=STR_ADR;
ram=STR_ADR;
e_adr=END_ADR;
for (i=s_adr;i<e_adr;i++) //!! i=0x30;i<0x7e;i++
{
*ram=0x00;
++ram;
}}
void SET_CPU_RAM(STR_ADR,END_ADR){ //寫00~FFH 到CPU內(nèi)存模塊 WRITE 00H~FFH TO CPU RAM
unsigned char i,s_adr,e_adr,d;
static unsigned char data *ram;
s_adr=STR_ADR;
ram=STR_ADR;
e_adr=END_ADR;
d=0x00;
for(i=s_adr;i<e_adr;i++) {
*ram=d;
++ram;
++d;
}}
void DISPLAY(CHR_,CHR_LED){ //顯示單個字符及指示燈模塊
unsigned char i,t,CHR_L,CHR_D,CHR_H,R;//CHR_LED, DIS_SEL;
//HEX TO BCD 十六進(jìn)制轉(zhuǎn)化為十進(jìn)制模塊
_nop_();
CHR_H=CHR_/0x64; //bit hundred,0x64=100d 商為百位
R=CHR_%0x64;
CHR_D=R/0x0a; //bit ten 商為十位
CHR_L=R%0x0a; //bit literal 余數(shù)為個為個位
_nop_();
//HEX TO BCD END
for(i=0;i<0x40;i++) //顯示數(shù)碼時間0x7d為1/2秒 1/4SEC=2ms*125times(0x7d)
{
DIS_SEL=0xff; //display charactor LED
CHR_1_SEL=0; //open LED channel
DIS_STA=CHR_LED; //
t=0x02; //2ms
delaytms(t);
_nop_();
DIS_SEL=0xff; //display charactor CHR_LOW
CHR_1_SEL=1; //close LED channel
CHR_3_SEL=0; //open CHR_L channel
DIS_STA=SEG[CHR_L]; //DSP(CHR_L);
t=0x02; //2ms
delaytms(t);
_nop_();
DIS_SEL=0xff; //display charactor CHR_HIGH
CHR_3_SEL=1; //close CHR_L channel
CHR_4_SEL=0; //open CHR_H channel
DIS_STA=SEG[CHR_D]; //DSP(CHR_H);
t=0x02; //2ms
delaytms(t);
CHR_4_SEL=1;
_nop_();
DIS_STA=0xff;
DIS_SEL=0xff;
_nop_();
}
DIS_STA=0xff; //close LED and CHR for 1/4 sec
DIS_SEL=0xff;
t=0xff; //delay 256ms (1/4 sec)
delaytms(t);
_nop_();
}
void DSP_SEG(STR_ADR,END_ADR,CHR_LED) //顯示 CPU 內(nèi)存由地址STR_ADR開始到END_ADR 內(nèi)容
//unsigned char STR_ADR,END_ADR;
{
unsigned char i;
unsigned char data *a;
a=STR_ADR;
for(i=STR_ADR;i<END_ADR;++i)
{
CHR_=*a;
++a;
DISPLAY(CHR_,CHR_LED); //調(diào)用顯示單個字符
}}
// EEPROM IIC PROGRAM START 讀寫 IIC 程序模塊
void FLASH_ERR(char ERR ){ //讀寫EEPROM錯誤顯示模塊
unsigned char t; //DIS_SEL,DIS_STA,
DIS_STA=ERR;
DIS_SEL=0xff;
_nop_();
CHR_1_SEL=0;
CHR_2_SEL=0;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
CHR_1_SEL=1;
CHR_2_SEL=1;
t=0xff; //delay 256ms (1/4 sec
delaytms(t);
_nop_();
DIS_STA=0xff;
DIS_SEL=0xff;
}
void start() //啟動時序模塊子模塊
{
unsigned char t;
//unsigned char DELAY_R;
SDA=1; //
_nop_();
SCL=1; //
t=0;while(t<=DELAY_R){t++;}_nop_();
t=0;while(t<=DELAY_R){t++;}_nop_();
_nop_();
SDA=0; //
t=0;while(t<=DELAY_R){t++;} _nop_();
t=0;while(t<=DELAY_R){t++;}_nop_();
SCL=0;
_nop_();_nop_();//
}
void stop()
{ //終止時序子模塊
unsigned char t;
SDA=0; //
_nop_();
SCL=0;
t=0;while(t<=DELAY_R){t++;}_nop_();
t=0;while(t<=DELAY_R){t++;} _nop_();
SCL=1; //
t=0;while(t<=DELAY_R){t++;}_nop_();
t=0;while(t<=DELAY_R){t++;} _nop_();
SDA=1; //
_nop_();
}
void ack() //產(chǎn)生應(yīng)答位子模塊
{
unsigned char t;
SDA=0;
_nop_(); //
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}_nop_(); //
_nop_(); //
SCL=0; //
_nop_();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -