📄 _rb_24c16_rw.c
字号:
#include <REG51.h>
#include "__24C16.h"
//-----------------------------------------------------------------------------------------
const unsigned long XTAL = 11059200;
const unsigned long baudrate = 9600;
const unsigned char Ins_Read_RomToPC = 0x55;
const unsigned char Ins_Write_PCToRom = 0x5A;
const unsigned char Ins_OK = 0x33;
const unsigned char Ins_NotOK = 0x26;
const unsigned char Ins_Start = 0xAA;
const unsigned char Ins_Stop = 0xDC;
void com_initialize(void);
void DataOut(unsigned char);
unsigned char DataIn(void);
void DelayX100ms(unsigned int);
unsigned char CheckSum(unsigned char*, int);
Bool RecPCData(unsigned char*, int);
void SendPCData(unsigned char*, int);
void ChangeAddr(unsigned char*, unsigned char*, unsigned char);
//-----------------------------------------------------------------------------------------
void main(void){
Byte PCIns[6]; //Instruction Form Length is 6; 1st is Ins, 2nd is DeviceAddress.
// 3rd is StartAddress.
// 4th is the times of work; 5th is the mount of each work.
// 6th is CheckSum.
// But in this program, the 2nd, 3rd and 4th, We do not use.
Byte PCInsC = 0x00;
Byte RomData[17]; // array size is for read or write data size; (Rom page size)
Byte DataSum = 0x00; // check sum
Byte DataAddr = 0x00; // Data Address
Byte DevAddr = 0x00; // Device Address
Byte Page = 0x00; // Device page
Byte Pgsize = 0x00; // Each page size in each Device
Bool PCIns_Flag = 0; // 1 is ok, 0 is wrong;
int i = 0;
com_initialize();
P0=0x00;
while(1){
PCIns_Flag = RecPCData(&PCIns,6);
if(~PCIns_Flag){
DataOut(Ins_NotOK);
P0=Ins_NotOK;
}
if(PCIns_Flag){
DataOut(Ins_OK);
P0=Ins_OK;//
DataAddr = 0x00;
DevAddr = 0xA0;
Page = 128;
Pgsize = 16;
}
while(PCIns_Flag){ // when Flag = 1, it means that we have many work to do befor
// next RecPCIns. it usually has write or read many data, so
// we use "while", not use "if".
PCInsC = 0x00;
PCInsC = DataIn();
if(PCInsC == Ins_Stop){
PCIns_Flag = 0;
break; // To avoid infinite loop
}
if((PCIns[0] == Ins_Read_RomToPC)&&(PCInsC == Ins_Start)){
I2cByteRead(DevAddr,DataAddr,Pgsize,&RomData); // read 16 data in each read action
for (i=0;i<16;i++){//
P0 = ~RomData[i];
DelayX100ms(1);
}
SendPCData(&RomData,Pgsize);
ChangeAddr(&DevAddr,&DataAddr,Pgsize);
}
if((PCIns[0] == Ins_Write_PCToRom)&&(PCInsC == Ins_Start)){
RecPCData(&RomData,17);
for (i=0;i<16;i++){//
P0 = ~RomData[i];
DelayX100ms(1);
}
I2cByteWrite(DevAddr, DataAddr, Pgsize, &RomData);
ChangeAddr(&DevAddr,&DataAddr,Pgsize);
}
}
}
}
//-----------------------------------------------------------------------------------------
void ChangeAddr(unsigned char* pDevAddr, unsigned char* pDataAddr, unsigned char Pgsize){
int DataWord = 0x0000;
DataWord = (int)(*pDataAddr);
DataWord += (int)Pgsize;
*pDevAddr &=0x0F;
if(DataWord >= 256){
*pDevAddr = *pDevAddr + 2;
}
*pDevAddr &=0x0F;
*pDevAddr |=0xA0;
*pDataAddr = (unsigned char)DataWord;
}
void SendPCData(unsigned char* pData, int DataLen){ // Send total Data length is DataLen+1
int i;
Byte Sum;
Sum = CheckSum(pData, DataLen);
for(i=0;i<DataLen;i++){
DataOut(*(pData+i));
}
DataOut(Sum);
}
Bool RecPCData(unsigned char* pData, int DataLen){ // Receive total Data length is DataLen
int i; // the lastest Data is checksum
Byte Sum;
for(i=0;i<DataLen;i++){
*(pData+i) = DataIn();
}
Sum = CheckSum(pData,DataLen-1);
if (*(pData+DataLen-1) == Sum)
return 1;
else
return 0;
}
unsigned char CheckSum(unsigned char* pData, int Num){
int i;
int Sum = 0x00; // integer Sum
Byte ReSum = 0x00; // return Sum for unsigned char (8 bits)
for(i=0;i<Num;i++){
Sum += (int)(*(pData+i));
}
ReSum = (unsigned char)Sum;
return ReSum;
}
void DelayX100ms(unsigned int count){
unsigned char i,j,k;
for (i=0;i<count;i++)
for(j=0;j<100;j++)
for(k=0;k<250;k++)
;
}
unsigned char DataIn(void){
do{
}while(!RI);
RI=0;
return(SBUF);
}
void DataOut(unsigned char c){
do{
}while(!TI);
TI = 0; //Before transmit next data, must clear TI;
SBUF = c;
}
void com_initialize(void){
SCON = 0x52; // choose mode 1 serial interrupt, and no read state. Set TI = 1;
PCON = 0x00; // power control, PCON.1 is SMOD which is choose baudrate double or not.
IE = 0x00; // Set on interrupt.
IP = 0x10; // Set on Serial interrupt priority.
TMOD = 0x20;// Set Time control in Timer1 work on model 2.
TH1 = (unsigned char)(256-(XTAL/((unsigned long)384*baudrate)));
TR1 = 1; // Timer1 start.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -