📄 93c46读写程序.txt
字号:
SETB C ;产生启始条件。
MOV R6,#09H
READ1:
CLR SK_93C46
MOV DI_93C46,C
SETB SK_93C46
RLC A
DJNZ R6,READ1
MOV R6,#09H ;连续读取两个字节的数据加一位伪数据位。
READ2:
CLR SK_93C46
SETB DO_93C46
MOV C,DO_93C46
SETB SK_93C46
RLC A
DJNZ R6,READ2
MOV DATA_HIGH,A
MOV R6,#08H
READ3:
CLR SK_93C46
SETB DO_93C46
MOV C,DO_93C46
SETB SK_93C46
RLC A
DJNZ R6,READ3
MOV DATA_LOW, A
CLR SK_93C46
CLR CS_93C46
CLR DI_93C46
CLR DO_93C46
SETB EA
RET
;******************************************************************
;名称:写指令(WRITE指令)
;功能:把DATA_HIGH(H),DATA_LOW(L)的数据
; 写到93C46中DATA_ADDRESS所指向的存储器中
;******************************************************************
WRITE_93C46:
CLR EA
SETB DI_93C46
SETB CS_93C46
MOV A, #30H ;写允许操作码0011XXXXB
SETB C
MOV R6, #09H
WRIT1:
CLR SK_93C46
MOV DI_93C46, C
SETB SK_93C46
RLC A
DJNZ R6, WRIT1
CLR CS_93C46
NOP
MOV A,DATA_ADDRESS ;送入写操作码和地址。
ORL A,#40H
SETB CS_93C46
SETB C
MOV R6,#09H
WRIT3:
CLR SK_93C46
MOV DI_93C46,C
SETB SK_93C46
RLC A
DJNZ R6,WRIT3
MOV R6,#08H ;写入高八位。
MOV A,DATA_HIGH
WRIT4:
CLR SK_93C46
RLC A
MOV DI_93C46,C
NOP
SETB SK_93C46
NOP
DJNZ R6,WRIT4
MOV R6,#08H ;写入低八位。
MOV A,DATA_LOW
WRIT5:
CLR SK_93C46
RLC A
MOV DI_93C46,C
NOP
SETB SK_93C46
NOP
DJNZ R6,WRIT5
SETB DO_93C46
CLR CS_93C46
NOP
SETB CS_93C46
JNB DO_93C46,$ ;检测就绪状态。
CLR CS_93C46
SETB CS_93C46
MOV A,#00H ;写禁止操作码0000XXXXB
SETB C
MOV R6,#09H
WRIT6:
CLR SK_93C46
MOV DI_93C46,C
RLC A
SETB SK_93C46
NOP
DJNZ R6,WRIT6
CLR CS_93C46
CLR SK_93C46
CLR DI_93C46
CLR DI_93C46
SETB EA
RET
93c46-8bit.c(day_new)
#include <reg51.h>
#include <intrins.h>
sbit cs= P1^7;
sbit sk= P1^6;
sbit di= P1^5;
sbit dod= P1^4;
sbit led_r= P1^3;
sbit led_g= P1^2;
/*
#define cs P1^7
#define sk P1^6
#define di P1^5
#define dod P3^7
#define led_g P1^3
#define led_r P1^3*/
//#define de 100 //8
#define uchar unsigned char
#define uint unsigned int
unsigned char de=100;
/***********************************
@ = _at_ (c51); _delay(de)=_nop(c51)
_pac ,pcc ,pbc ,pdc is control i/o port
************************************/
//unsigned char r_data1 _at_ 0x40;
void _delay(uchar de)
{
while(de){de--; _nop_();}
}
/****************************************
start bit: 1, op: 10, addr : A6--A0;*****
addrx=1 10 a6a5a4a3a2a1a0 : 10 number ***
******* read_9346() 8bit
****************************************/
unsigned char read_9346(uchar addrx)
{
uchar i;
unsigned char j=0x00;
cs=1; _delay(de);
sk=0; _delay(de);
di=1; //1 1 0
sk=1; _delay(de);
sk=0; _delay(de);
di=1;
sk=1;_delay(de);
sk=0;_delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
// a6---a0 valid 7 bit data;so follow
for(i=0;i<7;i++)
{ addrx<<=1;
di=(addrx&0x80);
sk=1;_delay(de);
sk=0;_delay(de);
}
dod=1;
// return char 8 bit data;
for(i=0;i<8;i++)
{//j=(j<<1)|dod;
sk=1;_delay(de);
j=(j<<1)|dod;
sk=0;_delay(de);
}
cs=0;
return j;
}
/****************************************
********** en_ dis write_ erase() 8bit
*****************************************/
void en_dis(uchar a)
{
uchar i,en_dis;
cs=1; _delay(de);
sk=0; _delay(de);
di=1; //1 0 0
sk=1; _delay(de);
sk=0; _delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
if(a>=1)en_dis=0xc0;else en_dis=0x00; //11x_xxxxb
for(i=0;i<7;i++)
{
di=en_dis&0x80;
sk=1;_delay(de);
sk=0;_delay(de);
en_dis<<=1;
}
cs=0;
}
/*********************************************
******* void erase_all93c46(void)***********
a>0 write ;a=0; erase
*********************************************/
void erase(void)
{
uchar i,erase;
cs=1; _delay(de);
sk=0; _delay(de);
di=1; //1 0 0
sk=1; _delay(de);
sk=0; _delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
//if(a>0)erase=0x40;else erase=0x20;
erase=0x80;
for(i=0;i<7;i++)
{
di=erase&0x80;
sk=1;_delay(de);
sk=0;_delay(de);
erase<<=1;
}
cs=0;
}
/*****************************************
********void write_all_93c46(uchar a)
*****************************************/
void write_all(unsigned char ax)
{
uchar i,erase;
cs=0; _delay(de);
sk=0; _delay(de);
cs=1; _delay(de);
di=1; //1 0 0
sk=1; _delay(de);
sk=0; _delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
di=0;
sk=1;_delay(de);
sk=0;_delay(de);
erase=0x40; //01x_xxxxb
//if(a>0)erase=0x40;else erase=0x20;
for(i=0;i<7;i++)
{
di=erase&0x80;//if((erase&0x80)>0)di=1;else di=0;
sk=1;_delay(de);
sk=0;_delay(de);
erase<<=1;
}
//dod=1;
for(i=0;i<8;i++)
{
di=ax&0x80;
sk=1;_delay(de);
sk=0;_delay(de);
ax<<=1;
}
//ax<<=1;
//di=ax&0x80;
cs=0;_delay(30);dod=1;;cs=1;
sk=1;_delay(de);
sk=0;_delay(de);
//_delay(de);cs=1;
/*_delay(de); dod=1;
cs=1; sk=1;_delay(de);
while(dod==0) {
sk=0;_delay(de);
sk=1;_delay(de);
}
sk=0;*/ cs=0;
}
/**********************************
**********************************/
void main(void)
{ uchar xdata b=0,r_data1;
//_pac=0x8;
dod=1;
r_data1=0x00;
led_g=1;led_r=1;
//_pbc=0x00;
r_data1=read_9346(b);
en_dis(1);
//_delay(de);
erase();
en_dis(0);
r_data1=read_9346(b);
en_dis(1);
//_delay(de);
write_all(0xaa);
_delay(200);
en_dis(0);
r_data1=read_9346(b);
// led_g=0;led_r=0;
for(b=0;b<=127;b++)
{
r_data1=read_9346(b);
if(r_data1==0xaa){led_g=0;
led_r=1;}
else {led_g=1;
led_r=0;
while(1);
}
}
en_dis(1);
erase();
en_dis(0);
_delay(300);
en_dis(1);
write_all(0x55);
_delay(200);
en_dis(0);
r_data1=read_9346(b);
//led_g=0;led_r=0;
for(b=0;b<=127;b++)
{
r_data1=read_9346(b);
if(r_data1==0x55){led_g=0;
led_r=1;}
else {led_g=1;
led_r=0;
while(1);
}
}
en_dis(1);
erase();
en_dis(0);
while(1);// _clrwdt();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -