⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x5045-1.c

📁 x5045有四种功能:分别是上电复位、看门狗定时器、电源电压监控和块锁保护串行eeprom的功能
💻 C
字号:
/////////////////////////////////////////////////////////
//功能:      X5045调试程序,主要包括看门狗复位和EEPROM的读写两部分
//存在的问题:没有检测复位功能
//作者:      wuxinming
//设计时间:  2006.4.25
//备注:执行此程序需要用POD-8X5XP仿真头(贴片封装的那个)爱,挺怪的!!!
/////////////////////////////////////////////////////////

#include<reg52.h>
#include <string.h>

#define uchar unsigned char
#define uint  unsigned int
#define comm  0
#define dat   1

uchar  WREN = 0x06;      //使能写操作命令
uchar  WRDI = 0x04;      //禁止写操作命令
uchar  RDSR = 0x05;      //读状态寄存器命令
uchar  WRSR = 0x01;      //写状态寄存器命令
uchar  READ0 = 0x03;     //读EEPROM命令地址
uchar  READ1 = 0x0b;
uchar  WRITE0 =0x02;     //写EEPROM命令地址
uchar  WRITE1 =0x0a;


sbit    x5045_cs  = P1^0;
sbit    x5045_so  = P1^1;
sbit    x5045_clk = P1^2;
sbit    x5045_si  = P1^3;
sbit    cs_lcd = P2^7;
sbit    std  = P2^6;
sbit    sclk = P2^5;

uchar x5045_read();
void x5045_write(uchar a);
uchar x5045_readSR();
uchar x5045_writeSR(uchar cData);
void x5045_write_rom(uchar cData,uchar cAddress,bit bRegion);
uchar x5045_read_rom(uchar cAddress,bit bRegion);
void watchdog(void);
void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
void delay1 (uint ms);

uchar code tab1[]={"寄存器的值为:"};

/*-------向X5045写数据----------------*/
void x5045_write(uchar a)
{   uchar  i;
     for(i=0;i<8;i++)
     {  if(a&0x80)
         {
           x5045_si=1;
          }
        else
         {
           x5045_si=0;
          }
         x5045_clk=0;      //产生同步时钟上升沿
         x5045_clk=1;
         a<<=1;
      }
   x5045_si=0;
}
/*---------从X5045读出数据--------------*/
uchar x5045_read(void)
{   uchar  i;
    uchar  b=0;
     for(i=0;i<8;i++)
    {
       x5045_clk=1;
       x5045_clk=0;
	   b<<=1;
       if (x5045_so)
        {
          b=b|0x01;
         }
     }
    x5045_so=0;
    //wr_lcd (comm,0x88);
    //wr_lcd (dat,b);
    return(b);
}
/*----读X5045寄存器------*/
uchar  x5045_readSR()
{
	uchar SR_5045;
	x5045_cs=0;
	x5045_write(RDSR);
	SR_5045=x5045_read();
	x5045_cs=1;
	return SR_5045;
}
/*----写X5045寄存器------*/
uchar x5045_writeSR(uchar cData)
{
	x5045_cs=0;
	x5045_write(WREN);
	x5045_cs=1;
	x5045_cs=0;
	x5045_write(WRSR);
	x5045_write(cData);
	x5045_cs=1;
	return 1;
}

/*-------写EEPROM-----*/
void x5045_write_rom(uchar cData,uchar cAddress,bit bRegion)
/* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */
{
	while((x5045_readSR()&0x01)==1)
	{
	 ;
	}
	x5045_cs=0;
	x5045_write(WREN);
	x5045_cs=1;
	x5045_cs=0;
	if(bRegion==0)
	{
		x5045_write(WRITE0);
	}
	else
	{
		x5045_write(WRITE1);
	}
	x5045_write(cAddress);
	x5045_write(cData);
	x5045_clk=0;
	x5045_cs=1;
}
/*-------读EEPROM-----*/
uchar x5045_read_rom(uchar cAddress,bit bRegion)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
	uchar cData;
	while((x5045_readSR()&0x01)==1)
	{
	  ;
	}
	x5045_cs=0;
	if(bRegion==0)
	{
		x5045_write(READ0);
	}
	else
	{
		x5045_write(READ1);
	}
	x5045_write(cAddress);
	cData=x5045_read();
	x5045_cs=1;
	return cData;
}

void watchdog(void)                 //清看门狗
{     x5045_cs = 1;
      x5045_cs = 0;
      x5045_cs = 1;
}

/*------------------初始化液晶-----------------*/
void init_lcd (void)
{


  wr_lcd (comm,0x30);  /*30---基本指令动作*/
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/
  delay (100);
  wr_lcd (comm,0x06);  /*光标的移动方向*/
  wr_lcd (comm,0x0c);  /*开显示,关游标*/
}
/*------------------数据发送-------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (50);
  a=content;
  cs_lcd=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)
  {
    sclk=1;
    sclk=0;
  }
  std=0;
  sclk=1;
  sclk=0;
  if(dat_comm)
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (180);
}
/*-----------------------------------*/
void delay (uint us)   //delay time 微妙
{
  while(us--);
}
void delay1 (uint ms)  //delay time  毫秒
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<15;j++)
  delay(1);
}
/*---------------显示汉字或字符----------------*/
void chn_disp (uchar code *chn)
{
  uchar i;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);

  for (i=0;i<strlen(chn);i++)
  wr_lcd (dat,chn[i]);

}
void  main()
{
    uchar reg,sj_r;
    cs_lcd=1;
    SP=0x5f;
    init_lcd ();                   //初始化液晶
    chn_disp (tab1);               //显示提示字符
    wr_lcd (comm,0x90);            //置显示位置
    while(1)
   {
       watchdog();                 //不保护存储器,禁止看门狗功能并读出状态寄存器值
       reg=x5045_readSR();
       //wr_lcd (dat,reg);
       x5045_write_rom(0x37,0x09,0);         //向指定地址写入数据37H
       sj_r=x5045_read_rom(0x09,0);         //读出指定地址数据
       wr_lcd (dat,sj_r);
	delay1(8000);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -