📄 串行e2prom93c46扩展.c
字号:
/* 文件名:(C12.c) */
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define COM XBYTE[0xe100] /*命令口*/
#define OUTBIT XBYTE[0xe101] /* 位控制口 */
#define CLK164 XBYTE[0xe102] /* 段控制口(接164时钟位) */
#define DAT164 XBYTE[0xe102] /* 段控制口(接164数据位) */
#define IN XBYTE[0xe103] /* 键盘读入口 */
uint datum;
uint time=0;
sbit SK=P1^5;
sbit DI=P1^6;
sbit DO=P1^7;
sbit CS=P1^4;
sbit K0=P1^3;
uchar buf[6]; /* 显示缓冲 */
uchar code tab[17]={ /* 八段管显示码 */
0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7,
0x7f, 0x6f,0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,0
};
void wbyte(uchar x)
{ uchar i;
for(i=0;i<8;i++)
{ DI=x&0x80;
SK=1;
SK=0;
x<<=1;
_nop_();
}
}
void delay()
{ uint x;
x=200; while(--x);
}
start()
{ CS=0;
SK=0;
CS=1;
DI=1;
SK=1;
SK=0;
}
void Ewen(void) /*擦除写允许*/
{ start();
wbyte(0x30);
CS=0;
}
void Ewds() /*擦除写禁止 */
{ start();
wbyte(0x0);
CS=0;
}
uint Read(uchar adr) /*读某地址16位数据 */
{ uchar data i;
uint data result;
start();
i=adr&0x3f|0x80; /*发读数据命令 */
wbyte(i);
DO=1;
for(i=0;i<16;i++) /*接收16位数据*/
{ SK=1;
result=(result<<1)|DO;
SK=0;
}
CS=0;
return(result);
}
void Write(uchar adr,uint dat) /*写16位数据(dat)到某地址(adr) */
{ uchar data i;
Ewen();
delay();
start();
i=adr&0x3f|0x40;
wbyte(i); /* 发擦除写允许命令*/
for(i=0;i<16;i++) /* 写16位数据 */
{ DI=dat&0x8000;
SK=1; SK=0;
dat<<=1;
}
CS=0; DO=1;
CS=1;
SK=1;
_nop_();
while(!DO) /* 判断芯片闲/忙 */
{ SK=0; SK=1;} /*忙继续等待 */
SK=0;
CS=0;
delay();
Ewds();
}
void Wral() /*擦除整个空间 */
{ Ewen();
delay();
start();
wbyte(0x20);
CS=0;
DO=1;
CS=1;
SK=1;
SK=0;
while(!DO)
{ SK=1; SK=0;
}
CS=0;
delay();
Ewds();
}
void sdelay() /* 延时子程序 */
{ uint x=200;
while(--x);
}
void disp()
{ static uchar temp;
uchar i,j,shift=0x20,x; /* 从左边开始显示 */
for(i=0;i<6;i++) /* 共6个八段管 */
{ OUTBIT=00; /* 关所有八段管 */
temp=0;
x=tab[buf[i]];
for(j=0;j<8;j++) /* 送164 */
{ if( x&0x80) temp|=1;
else temp&=0xfe;
DAT164=temp;
temp|=2; /*CLK='1' */
CLK164=temp;
temp&=0xfd;; /* CLK='0' */
CLK164=temp;
x=x<<1;
}
OUTBIT=shift; /* 显示一位八段管 */
shift>>=1; /* 显示下一位 */
sdelay();
}
}
main()
{ uchar data i;
SP=0x60;
PSW=0;
COM=0x3;
delay();
while(1)
{ if(K0)
{ Write(0x10,0x4121); /* 向0x10,0x11单元分别写入0x412186xx */
Write(0x11,0x8600);
memset(buf,0x0,6); /*设置显示为"000000"*/
}
else
{ datum=Read(0x10); /* 从0x10,0x11单元分别读数据 */
buf[0]=(char)((datum&0xf000)>>12);
buf[1]=(char)((datum&0xf00)>>8);
buf[2]=(char)((datum&0xf0)>>4);
buf[3]=(char)(datum&0xf);
datum=Read(0x11);
buf[4]=(char)((datum&0xf000)>>12 );
buf[5]=(char)((datum&0xf00)>>8);
}
for(i=0;i<20;i++)
disp(); /*显示 */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -