📄 at89s52.h
字号:
////////////////////////AT89S5X//////////////////////////////////////////////////////
void at89s5XWriteByte(BYTE b)
{
BYTE i;
ACC=b;
for(i=8; i>0; i--){
B_MISO = ACC_7;
B_SCK = 1;
_nop_();
B_SCK = 0;
ACC <<= 1;
}
}
BYTE at89s5XReadByte(void)
{
BYTE i;
ACC=0;
for(i=8; i>0; i--){
ACC <<= 1;
B_SCK = 1;
ACC_0 = B_MOSI;
B_SCK = 0;
}
return(ACC);
}
////////////////////////AT89S5X/////////////////////////////////////////////////////
///////////////////////////////////ATMEGA8L/////////////////////////////////////////
void atmegaXWriteByte(BYTE b)
{
BYTE i;
ACC=b;
for(i=8; i>0; i--){
B_MISO = ACC_7;
B_SCK = 0;
B_SCK = 1;
ACC <<= 1;
}
}
BYTE atmegaXReadByte(void)
{
BYTE i;
ACC=0;
for(i=8; i>0; i--){
B_SCK = 0;
ACC <<= 1;
B_SCK = 1;
ACC_0 = B_MOSI;
}
return(ACC);
}
///////////////////////////////////ATMEGA8L/////////////////////////////////////////
void Reset_Target()
{
B_RST = !buf[1];
B_SCK = 1;
B_MOSI= 1;
B_MISO= 1;
programed=0;
Delay_ms (20);
tx_buf[0]=0;
tx_buf[1]=0xEE;
tx_buf[2]=0xEE;
}
BYTE Enable_Program()
{
BYTE cReturn,cError;
switch (device){
case 0:
case 1: //at89s51,at89s52
for (cError=0;cError<4;cError++)
{
B_RST = 1;
B_SCK = 0;
Delay_ms(20);
at89s5XWriteByte(0xAC);
at89s5XWriteByte(0x53);
at89s5XWriteByte(0x00);
cReturn=at89s5XReadByte ();
if (cReturn==0x69){
tx_buf[0]=1;tx_buf[1]=0xEE; tx_buf[2]=0xEE;
programed=1;
return 1;
}
Delay_ms (10);
}
break;
case 2: //atmega8L
for (cError=0;cError<4;cError++)
{
B_SCK = 0;
B_MOSI= 0;
B_MISO= 0;
B_RST = 0;
Delay_ms (50);
B_RST = 1;
Delay_ms (10);
B_RST = 0;
Delay_ms(10);
atmegaXWriteByte(0xAC);
atmegaXWriteByte(0x53);
cReturn=atmegaXReadByte ();
atmegaXWriteByte(0x00);
//atmegaXWriteByte (0xFF);
if (cReturn==0x53){
tx_buf[0]=1;tx_buf[1]=0xEE; tx_buf[2]=0xEE;
programed=1;
return 1;
}
}
break;
}
tx_buf[0]=1;tx_buf[1]=cReturn; tx_buf[2]=cReturn;
programed=0;
return 0;
}
BYTE Flash_ReadByte(WORD Addr)
{
BYTE head;
switch (device){
case 0: //at89s51,at89s52
case 1:
at89s5XWriteByte(0x20);
at89s5XWriteByte(Addr/256);
at89s5XWriteByte(Addr%256);
return at89s5XReadByte();
break;
case 2: //atmega8L
if (Addr&1)
head=0x28;
else
head=0x20;
atmegaXWriteByte (head);
atmegaXWriteByte (Addr/256>>1);
atmegaXWriteByte (Addr%256>>1);
return atmegaXReadByte ();
break;
}
}
BYTE Chip_Erase(void)
{
BYTE i;
switch (device){
case 0:
case 1:
at89s5XWriteByte(buf[2]);
at89s5XWriteByte(buf[3]);
at89s5XWriteByte(buf[4]);
at89s5XWriteByte(buf[5]);
Delay_ms(500);
tx_buf[0]=2;
for (i=0;i<10;i++)
if (Flash_ReadByte (i)!=0xFF)break;
if (i!=10) //擦除失败
{tx_buf[1]=0x00; tx_buf[2]=0x00; return 0;}
else //擦除成功
{tx_buf[1]=0xEE; tx_buf[2]=0xEE; return 1;}
break;
case 2:
atmegaXWriteByte(buf[2]);
atmegaXWriteByte(buf[3]);
atmegaXWriteByte(buf[4]);
atmegaXWriteByte(buf[5]);
Delay_ms(10);
tx_buf[0]=2;
for (i=0;i<10;i++)
if (Flash_ReadByte (i)!=0xFF)break;
if (i!=10) //擦除失败
{tx_buf[1]=0x00; tx_buf[2]=0x00; return 0;}
else //擦除成功
{tx_buf[1]=0xEE; tx_buf[2]=0xEE; return 1;}
break;
}
}
void Flash_WriteByte(WORD Addr, BYTE Data)
{
switch (device){
case 0: //at89s51,at89s52
case 1:
at89s5XWriteByte(0x40);
at89s5XWriteByte(Addr/256);
at89s5XWriteByte(Addr%256);
at89s5XWriteByte(Data);
break;
case 2: //atmega8L
atmegaXWriteByte(0xC0);
break;
}
}
void Write_LockBit(BYTE mode)
{
atmegaXWriteByte(0xAC);
atmegaXWriteByte(0xE0|mode);
atmegaXWriteByte(0x00);
atmegaXWriteByte(0x00);
Delay_ms(1);
}
void Flash_WritePage(BYTE mode,BYTE page)
{
BYTE i,head,k,addrinpage;
switch (device){
case 0:
case 1:
if(!mode){
at89s5XWriteByte (0x50);
at89s5XWriteByte (page);
}
for(i=0; i<32; i++)
{at89s5XWriteByte(buf[i+4]);for(k=190; k>0; k--);}
break;
case 2:
addrinpage=buf[3];
for (i=0;i<32;i++){
if (addrinpage&1)
head=0x48;
else
head=0x40;
atmegaXWriteByte (head);
atmegaXWriteByte (0xFF);
atmegaXWriteByte (addrinpage>>1);
atmegaXWriteByte (buf[i+4]);
addrinpage++;
}
if (!mode){
atmegaXWriteByte (0x4C);
atmegaXWriteByte (page>>3);
atmegaXWriteByte (page<<5);
atmegaXWriteByte (0x00);
Delay_ms (2);
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -