📄 test_24c51xxc.c
字号:
// TITLE TEST 24CXX (CONVERT FROM 24CXX51A.ASM CPU 89C51)
//对应原理图 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 数码字符个位
//data char CHR_D ; //CHARACTER1 BUFFER, BCD 数码字符十位
//data char CHR_H ; //CHARACTER2 BUFFER, BCD 数码字符百位
#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 // 读出页数为 3 页 READ PAGE TIMES IS 3
#define WR_PAGE_T 3 // 写入页数为 3 页 WRITE PAGE TIMES IS 3
#define E_D_E_ADR 0x00 //写入数据时器件存放写入数据的首址 DATA ADDRESS OF EEPROM FOR WRITE
#define E_D_R_ADR 0x00 //读出数据时器件的被读出数据的首址 DATA ADDRESS OF EEPROM FOR READ
#define C_D_W_ADR 0x50 //写入数据时CPU存放要写的数据的首址 ADDRESS OF DATA ON CPU RAM FOR WRITE TO EEPROM
#define C_D_R_ADR 0x40 //读出数据时CPU用于存放读出数据的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 //一页所含子节数 ST24CXX 系列为8字节 FOR 24C02 PAGE IS 8
sbit SCL=P3^1; //P3.1 S CLOCK 串行数据线
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;
/*****************函数列表**********************/
void FLASH_ALL(); //闪烁全部数码和指示灯模块
void FLASH(char CHR_LED); //显示指定LED灯模块
void CLR_CPU_RAM(STR_ADR,END_ADR); //清CPU内存模块
void SET_CPU_RAM(STR_ADR,END_ADR); //写00~FFH 到CPU内存模块
void DISPLAY(CHR_,CHR_LED); //显示单个字符及指示灯模块
void DSP_SEG(STR_ADR,END_ADR,CHR_LED); //显示 CPU 内存由地址STR_ADR开始到END_ADR 内容
void FLASH_ERR(char ERR ); //读写EEPROM错误显示模块
void start(); //启动时序模块子模块
void stop(); //终止时序子模块
void ack(); //产生应答位子模块
void noack(); //产生非应答位子模块,用于数据写入结束
void chkack(); //检测应答位子模块
void shift_out8(WR_DATA); //8位数据移出子模块
static unsigned char shift_in8(); //8位数据移入子模块
void CALL_24CXX(); //唤醒EEPROM子模块
W_1_PAGE(CPU_S_ADR,E_S_ADR); //写入一页子模块
W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); //写入数页主模块
R_1_PAGE(CPU_S_ADR,E_S_ADR); //读入一页子模块
RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N); //读入数页主模块
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 显示状态 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(){ //闪烁全部数码和指示灯模块
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内存模块 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内存模块 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 十六进制转化为十进制模块
_nop_();
CHR_H=CHR_/0x64; //bit hundred,0x64=100d 商为百位
R=CHR_%0x64;
CHR_D=R/0x0a; //bit ten 商为十位
CHR_L=R%0x0a; //bit literal 余数为个为个位
_nop_();
//HEX TO BCD END
for(i=0;i<0x40;i++) //显示数码时间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 内存由地址STR_ADR开始到END_ADR 内容
//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); //调用显示单个字符
}}
// 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() //产生应答位子模块
{
unsigned char t;
SDA=0;
_nop_(); //
SCL=1; //
_nop_();
t=0;while(t<=DELAY_R){t++;}_nop_(); //
_nop_(); //
SCL=0; //
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -