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

📄 x25045.c

📁 C51 DOS/WINDOWS下的MCS51系列串行EEPROM(X25045)的C驱动程序
💻 C
字号:
TAN:DO;/* 糖尿病治疗仪  SENSOR FOR TMP04 2001/8/25*/
$INCLUDE (REG52.DCL)
  DECLARE VAR LITERALLY 'DECLARE';
  VAR BUF(120) BYTE PUBLIC AT(80H) IDATA;    /* 中文显示缓冲区 */
  VAR ZBUF(8) WORD PUBLIC;/* 数据显示缓冲区 */
  VAR DI WORD PUBLIC;     /* 传感器缓冲T2 sensor value buf */
  VAR DIH BYTE PUBLIC AT(.DI);
  VAR DIL BYTE PUBLIC AT(.DI+1);
  VAR (ADR,TT,CI)WORD PUBLIC AT(0FAH) IDATA;  /* 显示指针,传感器缓冲T1     */
  VAR (INA,INB,GUNWEI,RUN,DD,RUNM,BP,ER,AM,AP) BYTE PUBLIC;
/*50毫秒计数,脉冲计数,光标位置,运行标置,运行:秒-分单元, 脉冲输出标记,运行脉冲间隔(调制脉冲) */
  VAR ADRH BYTE PUBLIC AT(.ADR) IDATA;
  VAR ADRL BYTE PUBLIC AT(.ADR+1) IDATA;
  VAR CIH BYTE PUBLIC AT(.CI) IDATA;
  VAR CIL BYTE PUBLIC AT(.CI+1) IDATA;
  VAR TTH BYTE PUBLIC AT(.TT) IDATA;
  VAR TTL BYTE PUBLIC AT(.TT+1) IDATA;
  VAR (AA,BB,CC,DAT1,DAT2,COM) BYTE PUBLIC;/* 键值,第一参数,第二参数,指令 */
  VAR (SWEND,STIME,SFREQ,SMODE,RESET,WORK) BYTE PUBLIC;/*温度、时间、频率、模式标记*/
  VAR OLED BYTE PUBLIC;                       /* LED灯输出缓冲 */
  VAR KEYPORT BYTE PUBLIC AT(9C00H) AUXILIARY;/* 键盘输入口        */
  VAR OULED BYTE PUBLIC AT(9400H) AUXILIARY;  /* LED灯输出口,高有效 */
  VAR OULCD BYTE PUBLIC AT(9000H) AUXILIARY;  /* LCD输出数据口  */ 
  VAR IND BYTE PUBLIC AT(9100H) AUXILIARY;    /* LCD输出命令口  */ 
  VAR EEBUF BYTE PUBLIC;  /* EEPROM用缓冲区  */
  VAR EE(20) BYTE PUBLIC; /* EEPROM:EE(0)写或读字节数,EE(1...)数据 */
  VAR RE BIT PUBLIC;


EEPROMIN:PROCEDURE;      /*从EEPROM输入一个字节,结果在EEBUF中 */
    VAR III BYTE;         /*假定开始时,/CS=0,SCK=0*/
    III=0;                /*SCK下降沿后,EEPROM输出数据*/
    DO III=0 TO 7;        /*P1.4--/CS, P1.6--SCK,P1.5--SO/SI* / 
        P1_5=1;           /* 置P1.5为输入口 */
        P1_6=1;
        P1_6=0;
        CY=P1_5;
        EEBUF=SCL(EEBUF,1);
    END;
  END EEPROMIN;

  EEPROMOUT:PROCEDURE;          /*向EEPROM输出一个字节,EEBUF的内容输出*/
    DECLARE (III,JJJ,KKK) BYTE; /* P1.6--SCK,P1.4--/CS,P1.5-SI/SO */
    KKK=EEBUF;                  /* SCK上升沿锁入数据  */
        DO III=0 TO 7;
           P1_6=0;
           EEBUF=SCL(EEBUF,1);
           P1_5=CY;
           P1_6=1;
        END;
      P1_5=1;  
  END EEPROMOUT;

  EEPROMR_S:PROCEDURE; /*读EEPROM状态寄存器*/
        P1_6=0;       /* SCK=0 */
        P1_4=0;       /* /CS=0 */
        EEBUF=05H;    /* 输出读命令*/
        CALL EEPROMOUT;
        CALL EEPROMIN;
        P1_6=0;       /* SCK=0 */
        P1_4=1;       /* CS=1  */
  END EEPROMR_S;

  EEPROMR:PROCEDURE;   /*读EEPROM 从00H ADDR开始,X25045为512BYTE*/
    DECLARE III BYTE;/* EE(0)为读字节数 !!! 调用本程序,先置EE(0)=字节数 */
    III=0;                      /* EE(1)开始放读出的数据*/
     P1_6=0;             /* SCK=0 */
     P1_4=0;             /* /CS=0 */
     EEBUF=03H;          /* ACC=03H;A_3=A8;EEBUF=ACC; 输出读指令 */
     CALL EEPROMOUT;     /* 调输出程序 */
     EEBUF=00H;          /* 输出低8位地址  EEBUF=ADDR*/
     CALL EEPROMOUT;     /* 调输出程序 */
       DO III=1 TO  EE(0);
          CALL EEPROMIN; /* 调输入程序 */
          EE(III)=EEBUF; /* 保存读出结果 */
        END;
     P1_6=0;             /* SCK=0 */
     P1_4=1;             /* /CS=1 */
  END EEPROMR;

EEPROMW:PROCEDURE;         /*写EEPROM 从A8+ADDR地址开始,X25045为512BYTE*/
  DECLARE (III,KKK) BYTE;  /*EE(0)为写字节数 !!! 调用本程序,先置EE(0)=字节数 */
    KKK=EE(0)-1;           /* P1.6--SCK,P1.4--/CS,P1.5-SO/SI */
    DO III=0 to KKK;
      P1_6=0;              /* SCK=0 */
      P1_4=0;              /* /CS=0 */
      EEBUF=06H;           /* 开锁指令 */
      CALL EEPROMOUT;      /* 调开锁指令输出程序 */
      P1_4=1;              /* /CS=1 */
      P1_4=0;              /* /CS=0 */
      EEBUF=02H;           /*ACC=02H;A_3=A8;EEBUF=ACC; 写指令 */
      CALL EEPROMOUT;      /* 调输出程序,输出写指令 */
      EEBUF=III;           /* ADDR;*/
      CALL EEPROMOUT;      /* 输出地址 */
      EEBUF=EE(III+1);     /*取写入的数据 */
      CALL EEPROMOUT;      /* 输出数据 */
      P1_6=0;              /* SCK=0 */
      P1_4=1;              /* /CS=1 */
 EEPP:CALL EEPROMR_S;      /* 读状态寄存器 */
      EEBUF=EEBUF AND 01H; /* 判写数据忙*/
      IF EEBUF>0 THEN GOTO EEPP; /*ADDR=ADDR+1;*/
    END;
  END EEPROMW;

  
DOG:PROCEDURE;
    P1_4=1; /* EEPROM /CS=1 */
    P1_4=0; /* /CS=0        */
    P1_4=1; /* /CS=1        */
END DOG;

ST:SP=60H;
  P1=0FFH;
  TMOD=0001$0001B;   /* T0定时, T1定时中断*/
  TH1=3CH;   /* 定时系数高8位,3CAFH=50毫秒,在12M时钟;EC78H=10毫秒在6M时钟 */ 
  TL1=0AFH;  /* 定时系数低8位 */ 
  TH0=0;
  TL0=0;
  RCAP2H=0FEH; /* 65135D=0FE6FH */
  RCAP2L=6FH;  /* T2 INITIAL */
  T2CON=0;
  PT1=1; /* T1:HIGH INTERUPT LEVEL */
  PT2=0; /* T2:LOW  INTERUPT LEVEL */
  EA=1;
  ET0=0; /* 开定时器0中断 */
  ET1=1; /* 开定时器1中断 */
  ET2=1;
  TR0=0; /* =1开定时器0,=0关定时器T0 */
  TR1=0; /* =1开定时器1,=0关定时器T1 */
  TR2=0;
  RE=0;
  TT=0;AA=0;BB=0;RUN=0;RUNM=0;BP=0;AM=0;AP=0;   /*  */
  B

GOTO ST;
GOTO ST;
GOTO ST;
GOTO ST;
   AA=33;
END TAN;

⌨️ 快捷键说明

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