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

📄 test_24c51xxc.c

📁 c51读写24cxx程序模块
💻 C
📖 第 1 页 / 共 2 页
字号:
// TITLE  TEST  24CXX  (CONVERT FROM  24CXX51A.ASM  CPU 89C51)
//对应原理图  K&D2.SCH/AVC.DDB   

//1,CLEAR  CPU  RAM  ADDRESS   STR_ADR TO END_ADR  (30H~7FH)
//2,WRITE  00~FF  TO  CPU   RAM   STR_ADR TO END_ADR  (30H~4FH)
//3,WRITE  TO  EEPROM  24CXX  ADDRESS  E_D_ADDR_R (00H -
//4,READ  EEPROM   TO  CPU   RAM  ADDRESS  C_R_ADR_R  (50H-7FH)
//5,DESPLAY  CPU   RAM  FROM  CPU  ADDRESS  C_R_ADR_R

#include<reg51.h>
#include<stdio.h>
#include<intrins.h>

//#pragma   small


data  char  CPU_S_ADR;   //DATA START  ADDRESS  ON CPU  RAM  FOR  STORE  AFTER READ  BUFFER 
data  char  E_S_ADR;  //EEPROM   DATA  WRITE  ADDRESS    BUFFER
data  char  CHR_LED; 
data  char  CHR_;

//static bdata  char  RD_DATA;
//bdata  char  WR_DATA;
//sbit RD_BIT=RD_DATA^0;
//data  char  E_ D_ADR;  //EEPROM   DATA  READ   ADDRESS   BUFFER
//data  char  CHR_L       ;   //CHARACTER1   BUFFER, BCD  数码字符个位  
//data  char  CHR_D       ;  //CHARACTER1   BUFFER,  BCD  数码字符十位  
//data  char  CHR_H       ;  //CHARACTER2   BUFFER,  BCD  数码字符百位   

#define  DIS_STA  P0   //charactor  status  P0 
#define  DIS_SEL  P1   //charactor  select  P1

//;NUMBER    DEFINE !!!!
#define  COMM_R   0xa1    // 10100001B (=A1)器件物理地址与读命令 EEPROM  PHYSICS  ADDRESS FOR  COMMAND READ
#define  COMM_W   0xa0    // 10100000B (=A0)器件物理地址与写命令 EEPROM  PHYSICS  ADDRESS FOR  COMMAND WRITE 
#define  RD_PAGE_T   3    // 读出页数为 3 页  READ  PAGE   TIMES   IS  3
#define  WR_PAGE_T   3    // 写入页数为 3 页 WRITE   PAGE   TIMES   IS  3

#define  E_D_E_ADR     0x00     //写入数据时器件存放写入数据的首址 DATA  ADDRESS  OF  EEPROM  FOR  WRITE
#define  E_D_R_ADR     0x00     //读出数据时器件的被读出数据的首址 DATA  ADDRESS  OF  EEPROM  FOR  READ   
#define  C_D_W_ADR     0x50     //写入数据时CPU存放要写的数据的首址  ADDRESS OF DATA ON  CPU  RAM   FOR  WRITE TO EEPROM 
#define  C_D_R_ADR     0x40     //读出数据时CPU用于存放读出数据的RAM首址 READ DATA AND STORE TO  CPU  RAM  START  ADDRESS

//;different   crystal   type    different     delay   time
#define   DELAY_R      0x05     //FOR  12mHz  CRYSTAL  DELAYR3~5uS
#define   DELAY_T      0x1f 
   
//;ifferent   eeproml   type    different    page 
#define  T_PAGE   0x08         //一页所含子节数 ST24CXX 系列为8字节 FOR  24C02   PAGE   IS   8

sbit SCL=P3^1;    //P3.1  S  CLOCK  串行数据线
sbit SDA=P3^0;   //P3.0   S  DATA   串行时钟线

sbit WC=P1^5;    //WRITE  CONTROL  选片位

sbit CHR_1_SEL=P1^1;  // SELECT CHANNEL 1  FOR CHARACTOR 1  LED
sbit CHR_2_SEL=P1^0;  // SELECT CHANNEL 2  FOR CHARACTOR 2  NC
sbit CHR_3_SEL=P1^2;  // SELECT CHANNEL 3  FOR CHARACTOR 3  CHR_L
sbit CHR_4_SEL=P1^3;  // SELECT CHANNEL 4  FOR CHARACTOR 3  CHR_H

//sbit RD_BIT=RD_DATA^0;
//sbit WR_BIT=WR_DATA^7;

/*****************函数列表**********************/
void  FLASH_ALL();                       //闪烁全部数码和指示灯模块    
void  FLASH(char CHR_LED);               //显示指定LED灯模块 
void  CLR_CPU_RAM(STR_ADR,END_ADR);      //清CPU内存模块  
void  SET_CPU_RAM(STR_ADR,END_ADR);      //写00~FFH 到CPU内存模块 
void  DISPLAY(CHR_,CHR_LED);             //显示单个字符及指示灯模块
void  DSP_SEG(STR_ADR,END_ADR,CHR_LED);  //显示 CPU 内存由地址STR_ADR开始到END_ADR  内容
void  FLASH_ERR(char ERR );              //读写EEPROM错误显示模块 
void  start();                           //启动时序模块子模块  
void  stop();                            //终止时序子模块   
void  ack();                             //产生应答位子模块
void  noack();                           //产生非应答位子模块,用于数据写入结束
void  chkack();                          //检测应答位子模块
void  shift_out8(WR_DATA);               //8位数据移出子模块   
static unsigned char shift_in8();        //8位数据移入子模块
void CALL_24CXX();                       //唤醒EEPROM子模块
W_1_PAGE(CPU_S_ADR,E_S_ADR);             //写入一页子模块
W_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N);      //写入数页主模块
R_1_PAGE(CPU_S_ADR,E_S_ADR);             //读入一页子模块
RD_N_PAGE(CPU_S_ADR,E_S_ADR,PAGE_N);     //读入数页主模块                                         
delaytms(t);                             //延时1mS模块


char code  SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0X92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
        //共阳;=  0     1    2    3    4     5    6    7    8   9    A    b    C    d    E    F   
        //用共阳LED  显示状态  0-->选通笔划  ,字符选择 0-->选通该字符,请参阅原理图 K&D2.SCH/AVC.DDB  //

delaytms(t){             //延时1mS模块 for  12mHz crystal delay 1ms=0xff x 0x02
		 unsigned  char i,tmp;
	      for(i=0;i<t;i++)
	     	{
	        // tmp=0xff;         //
	       //  while(tmp--);  
             tmp=0xff;         //
	         while(tmp--);
          }}

void  FLASH_ALL(){                       //闪烁全部数码和指示灯模块    
        unsigned  char i,t; //DIS_SEL,DIS_STA,
        DIS_STA=0x00;
        DIS_SEL=0xff;
        for(i=0;i<5;i++)
		{
        CHR_1_SEL=0;
        CHR_2_SEL=0;
        CHR_3_SEL=0;
        CHR_4_SEL=0;
         t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
        CHR_1_SEL=1;
        CHR_2_SEL=1;
        CHR_3_SEL=1;
        CHR_4_SEL=1; 
         t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
         _nop_();
   	    }  
        DIS_STA=0xff;
        DIS_SEL=0xff;
        }

 void  FLASH(char CHR_LED ){         //显示指定LED灯模块
        unsigned  char i,t;   //DIS_SEL,DIS_STA,
        DIS_STA=CHR_LED;
        DIS_SEL=0xff;
        for(i=0;i<5;i++)
		{
        CHR_1_SEL=0;
        CHR_2_SEL=0;
        t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
        CHR_1_SEL=1;
        CHR_2_SEL=1;
        t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
         _nop_();
   	    }  
        DIS_STA=0xff;
        DIS_SEL=0xff;
        }

 void  CLR_CPU_RAM(STR_ADR,END_ADR) {          //清CPU内存模块  CLEAR  CPU  RAM
	     unsigned  char  i,s_adr,e_adr;
         static unsigned  char data *ram;
         s_adr=STR_ADR;
	     ram=STR_ADR;
         e_adr=END_ADR;
		 for (i=s_adr;i<e_adr;i++)     //!! i=0x30;i<0x7e;i++
	       {
	          *ram=0x00;
	          ++ram;
	        }}
	     
 void  SET_CPU_RAM(STR_ADR,END_ADR){          //写00~FFH 到CPU内存模块 WRITE    00H~FFH  TO  CPU  RAM          
	     unsigned  char  i,s_adr,e_adr,d;
	    static  unsigned  char data *ram;
          s_adr=STR_ADR;
		  ram=STR_ADR;
          e_adr=END_ADR;
	      d=0x00;
	     for(i=s_adr;i<e_adr;i++) {
	          *ram=d;
	          ++ram;
	          ++d;
	        }}
  

   void  DISPLAY(CHR_,CHR_LED){        //显示单个字符及指示灯模块
          unsigned  char i,t,CHR_L,CHR_D,CHR_H,R;//CHR_LED, DIS_SEL;
	//HEX  TO   BCD   十六进制转化为十进制模块
            _nop_();
           CHR_H=CHR_/0x64;    //bit hundred,0x64=100d  商为百位
           R=CHR_%0x64;
           CHR_D=R/0x0a;        //bit ten  商为十位
           CHR_L=R%0x0a;    //bit literal  余数为个为个位
           _nop_();
     //HEX  TO  BCD   END 
          for(i=0;i<0x40;i++)       //显示数码时间0x7d为1/2秒  1/4SEC=2ms*125times(0x7d)
           {
          DIS_SEL=0xff;       //display  charactor LED
          CHR_1_SEL=0;          //open LED channel
          DIS_STA=CHR_LED;      //
          t=0x02;               //2ms        
          delaytms(t);
            _nop_(); 
          DIS_SEL=0xff;    //display  charactor CHR_LOW
          CHR_1_SEL=1;       //close  LED channel
          CHR_3_SEL=0;       //open   CHR_L channel
          DIS_STA=SEG[CHR_L];           //DSP(CHR_L); 
          t=0x02;               //2ms        
          delaytms(t);       
            _nop_();
          DIS_SEL=0xff;    //display  charactor CHR_HIGH
          CHR_3_SEL=1;       //close  CHR_L channel
          CHR_4_SEL=0;       //open   CHR_H channel
          DIS_STA=SEG[CHR_D];       //DSP(CHR_H);
          t=0x02;               //2ms        
          delaytms(t);      
          CHR_4_SEL=1;
          _nop_();
          DIS_STA=0xff;
          DIS_SEL=0xff;
          _nop_();
	      }
          DIS_STA=0xff;     //close  LED and  CHR  for 1/4 sec
          DIS_SEL=0xff;
          t=0xff;         //delay  256ms  (1/4  sec)
          delaytms(t); 
          _nop_();
          }

     void  DSP_SEG(STR_ADR,END_ADR,CHR_LED)       //显示 CPU 内存由地址STR_ADR开始到END_ADR  内容
          //unsigned  char  STR_ADR,END_ADR;
          {
           unsigned  char i;
           unsigned  char data *a;
           a=STR_ADR;
           for(i=STR_ADR;i<END_ADR;++i)
            {
              CHR_=*a;
                ++a;  
              DISPLAY(CHR_,CHR_LED);       //调用显示单个字符
             }}            
     
 
         
        
//  EEPROM  IIC  PROGRAM     START    读写  IIC   程序模块  
  
void  FLASH_ERR(char ERR ){               //读写EEPROM错误显示模块
        unsigned  char t;   //DIS_SEL,DIS_STA,
        DIS_STA=ERR;
        DIS_SEL=0xff;
        _nop_();
        CHR_1_SEL=0;
        CHR_2_SEL=0;
        t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
        CHR_1_SEL=1;
        CHR_2_SEL=1;
        t=0xff;         //delay  256ms  (1/4  sec
        delaytms(t);  
         _nop_();      
        DIS_STA=0xff;
        DIS_SEL=0xff;
        }

	  void  start()                        //启动时序模块子模块
		 {
                  unsigned  char  t;
		   //unsigned   char  DELAY_R;
		   SDA=1;         //
		   _nop_();
		   SCL=1;         //
		   t=0;while(t<=DELAY_R){t++;}_nop_();
                 t=0;while(t<=DELAY_R){t++;}_nop_();
                 _nop_();
		   SDA=0;        //
                 t=0;while(t<=DELAY_R){t++;} _nop_();
		   t=0;while(t<=DELAY_R){t++;}_nop_();
		   SCL=0; 
		    _nop_();_nop_();//
		  }

	void  stop()
           {                    //终止时序子模块      
          unsigned  char  t;
          SDA=0;         //
		    _nop_();
		   SCL=0;
		   t=0;while(t<=DELAY_R){t++;}_nop_();
		   t=0;while(t<=DELAY_R){t++;} _nop_();
                 SCL=1;         //
		   t=0;while(t<=DELAY_R){t++;}_nop_();
		   t=0;while(t<=DELAY_R){t++;} _nop_();
                 SDA=1;        //
                _nop_();
		  }

	void  ack()                        //产生应答位子模块  
		 {
                  unsigned  char  t;
		    SDA=0;  
		    _nop_();               //
		    SCL=1;         //
		    _nop_();
		    t=0;while(t<=DELAY_R){t++;}_nop_();               //
		    _nop_();               //
		    SCL=0;         //
		    _nop_();
		  }
	

⌨️ 快捷键说明

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