📄 z_25045.c
字号:
/*-------------------------------------------------------------
**
** 版权:上海航虹高科技有限公司,2002年
**
** 文件名: e25045b.C
**
** 描述: 本文件是与5196ET实验机配套完成的实验程序。
** 更改: FOR EAT598实验机
**--------------------------------------------------------------
*/
/*-------------------------------------------------------------
** 文件包括
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
**
**
*/
#include <reg51.h> //定义51单片机特殊功能寄存器的值的标准头文件
#define XBYTE ((unsigned char volatile *) 0x020000L)
//#define CBYTE ((unsigned char volatile *) 0x050000L)
//#define DBYTE ((unsigned char volatile *) 0x040000L)
#define z8279 XBYTE[0xf239] //8279命令/状态口//
#define d8279 XBYTE[0xf238] //8279数据口//
unsigned char data dataBuf[16];//数据缓冲区
/*used in 25045读写*/
unsigned char bdata x1; //used in 25045读写
sbit x1b0=x1^0;
sbit x1b1=x1^1;
sbit x1b2=x1^2;
sbit x1b3=x1^3;
sbit x1b4=x1^4;
sbit x1b5=x1^5;
sbit x1b6=x1^6;
sbit x1b7=x1^7;
sbit cs=P1^0; //cs接5196ET的P1.0
sbit sck=P1^1; //sck接5196ET的P1.1
sbit si=P1^2; //SI接5196ET的P1.2
//sbit so=P1^2; //so接5196ET的P1.2
sbit so=P1^5; //so接5196ET的P1.5
sbit wp=P1^3; //wp接5196ET的P1.3
bit addr8; //地址第八位
unsigned char data addr;
unsigned char data *dataP;
unsigned char data rn;
sbit light1=P1^4; //数据传送指示灯5196ET的P1.4
/*数码管显示码表*/
unsigned char code led[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char n;//数码管显示的位置
/*-------------------------------------------------------------
** 函数定义
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** 函数名:wr8Bit
** 格式: void wr8Bit()
** 返回值: 无
** 描述:x1写入25045 8位
** 算法:从高位一位一位传送,在SCK上升沿输入
**-------------------------------------------------------------
*/
void wr8Bit() //x1写入25045 8位
{
si=x1b7;
sck=1;
sck=0;
si=x1b6;
sck=1;
sck=0;
si=x1b5;
sck=1;
sck=0;
si=x1b4;
sck=1;
sck=0;
si=x1b3;
sck=1;
sck=0;
si=x1b2;
sck=1;
sck=0;
si=x1b1;
sck=1;
sck=0;
si=x1b0;
sck=1;
sck=0;
}
/*-------------------------------------------------------------
** 函数名:rd8Bit
** 格式: void rd8Bit()
** 返回值: 无
** 描述:读25045 8位到x1
** 算法:从高位一位一位传送,在SCK下降沿输出
**-------------------------------------------------------------
*/
void rd8Bit() //读25045 8位到x1
{
so=1;
sck=1;
x1b7=so;
sck=0;
sck=1;
x1b6=so;
sck=0;
sck=1;
x1b5=so;
sck=0;
sck=1;
x1b4=so;
sck=0;
sck=1;
x1b3=so;
sck=0;
sck=1;
x1b2=so;
sck=0;
sck=1;
x1b1=so;
sck=0;
sck=1;
x1b0=so;
sck=0;
}
/*-------------------------------------------------------------
** 函数名:rd2545S
** 格式: void rd2545S()
** 返回值: 无
** 描述:读25045状态到x1
** 算法:
**-------------------------------------------------------------
*/
void rd2545S() //读25045状态到x1
{
do
{
x1=0x05;//写状态的指令格式0000 0101
sck=0;
cs=0;
wr8Bit();
rd8Bit();
cs=1;
}while(x1b0==1);
}
/*-------------------------------------------------------------
** 函数名:wr2545en
** 格式: void wr2545en()
** 返回值: 无
** 描述:置写允许
** 算法:将写允许的指令格式00000110写入到X25045
**-------------------------------------------------------------
*/
void wr2545en() //置写允许
{
x1=0x06; //读状态的指令格式0000 0110
sck=0;
cs=0;
wr8Bit();
cs=1;
}
/*-------------------------------------------------------------
** 函数名:wr2545S
** 格式: void wr2545S()
** 返回值: 无
** 描述:写25045状态
** 算法:先置写允许,然后把写状态的指令地址写入25045,再将状态写入
**-------------------------------------------------------------
*/
void wr2545S() //写x1到25045状态
{
unsigned char data y1;
y1=x1;
wp=1;
wr2545en();
x1=0x01; //写状态的指令格式0000 0001
sck=0;
cs=0;
wr8Bit();
x1=y1&0x3c; //00111100看门狗溢出和写保护四位有效
wr8Bit();
cs=1;
wp=0;
}
/*-------------------------------------------------------------
** 函数名:rd2545D
** 格式: void rd2545D()
** 返回值: 无
** 描述:读25045内E2PROM的数据
** 算法:将从25045读到的数据送入dataP指向的数组。地址=addr8,addr,rn个
**-------------------------------------------------------------
*/
void rd2545D()
{
x1=0x03; //读数据的指令格式0000 A8011
x1b3=addr8; //位3(A8)=addr8用于选择芯片的上半区还是下半区
sck=0;
cs=0;
wr8Bit();
x1=addr; //数据所要存放的地址addr
wr8Bit();
while(rn!=0)//判断所要读的数据个数rn,不为零就将读到的送入dataP指向的数组
{
rd8Bit();
*dataP=x1;
dataP++;
rn--;
}
cs=1;
}
/*-------------------------------------------------------------
** 函数名:wr2545D
** 格式: void wr2545D()
** 返回值: 无
** 描述:写dataP指向的数组数据到25045的E2PROM
** 算法:参见程序注释
**-------------------------------------------------------------
*/
void wr2545D()
{
wp=1;
wr2545en();
x1=0x02; //写数据的指令格式0000 A8010
x1b3=addr8; //位3(A8)=addr8用于选择芯片的上半区还是下半区
sck=0;
cs=0;
wr8Bit();
x1=addr&0xfc; //addr&0xfc地址是从00——11
wr8Bit();
while(rn!=0) //判断要写入的数据个数rn(最多为4个)
{ //rn不为零,写dataP指向的数组数据到 25045
x1=*dataP;
wr8Bit();
dataP++;
rn--;
}
cs=1;
wp=0;
rd2545S();
}
/*-------------------------------------------------------------
** 函数名:wr2545D1
** 格式: void wr2545D1()
** 返回值: 无
** 描述:写1个数据到25045的E2PROM
** 算法:参见程序注释
**-------------------------------------------------------------
*/
void wr2545D1() //写x1数据到 25045,地址=addr8,addr,1个,
{
unsigned char data y1;
y1=x1;
wp=1;
wr2545en();
x1=0x02;
x1b3=addr8;
sck=0;
cs=0;
wr8Bit();
x1=addr;
wr8Bit();
x1=y1;
wr8Bit();
cs=1;
wp=0;
rd2545S();
}
/*-------------------------------------------------------------
** 函数名:mSecond
** 格式: void mSecond(unsigned char x)
** 返回值: 无
** 描述:延迟x ms
** 算法:
**-------------------------------------------------------------
*/
void mSecond(unsigned int x) //延迟x ms
{
unsigned int i;
while((x--)!=0)
{
for (i=0;i<125;i++){;}
}
}
/*-------------------------------------------------------------
** 函数名:sta8279
** 格式: void sta8279()
** 返回值: 无
** 描述:初始化8279
** 算法:
**-------------------------------------------------------------
*/
void sta8279() //初始化8279
{
z8279=0x00; //00表示左键输入,八位字符显示
z8279=0x2f; //2f表示扫描速率
z8279=0xc1; //C1清除显示RAM
}
/*-------------------------------------------------------------
** 函数名:dispLed1
** 格式: void dispLed1()
** 返回值: 无
** 描述:一个数码管显示
** 算法:设定显示位置并显示数据,
**-------------------------------------------------------------
*/
void dispLed1()
{
z8279=0x80+n; //显示的RAM地址加上位置偏移量n
d8279=led[x1]; //数据x1送8279数据口地址
}
/*-------------------------------------------------------------
** 函数名:dispLed2
** 格式: void dispLed2()
** 返回值: 无
** 描述:两个数码管显示
** 算法:
**-------------------------------------------------------------
*/
void dispLed2() //两个数码管显示,x1=data,n=position
{
unsigned char y1;
y1=x1;
x1=x1&0x0f; //取低位
dispLed1();
n++; //位置偏移量加1准备显示下一位
x1=y1&0xf0; //取高位
x1=x1>>4; //右移四位
dispLed1();
}
/*------------------------------------------------
** 函数名: main
** 格式: void main()
** 返回值: 无
** 描述:主程序
** 算法:参见程序注释
**------------------------------------------------
*/
void main() //主函数
{
unsigned char data y1;
unsigned int data i;
sta8279();
x1=0x00;//00 无看门狗溢出
wr2545S();
while(1)
{
y1=0xff; //从FF——00显示
addr8=0;
for(i=0;i<0xff;i++)
{
addr=i;
x1=y1;
wr2545D1();
dataP=&dataBuf[0];
rn=1;
rd2545D();
x1=dataBuf[0];
n=0;
dispLed2();
light1=~light1;
mSecond(200);
y1--;
}
y1=0; //从00——FF显示
addr8=1;
// for(i=0;i<0xfc;i+=4)
for(i=0;i<0xff;i+=4)
{
dataBuf[0]=y1++;
dataBuf[1]=y1++;
dataBuf[2]=y1++;
dataBuf[3]=y1++;
addr=i;
dataP=&dataBuf;
rn=4;
wr2545D();
dataP=&dataBuf[0];
rn=4;
rd2545D();
x1=dataBuf[0];
n=6;
dispLed2();
light1=~light1;
mSecond(200);
x1=dataBuf[1];
n=6;
dispLed2();
light1=~light1;
mSecond(200);
x1=dataBuf[2];
n=6;
dispLed2();
light1=~light1;
mSecond(200);
x1=dataBuf[3];
n=6;
dispLed2();
light1=~light1;
mSecond(200);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -