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

📄 24c16.txt

📁 24c16液晶显示
💻 TXT
字号:
					/*****************************************/
/* Copyright (c) 2005, 通信工程学院      */
/* All rights reserved.                  */
/* 作    者:戴 佳				  	     */
/*****************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint unsigned int 
/***********24CXX管角定义********************/
sbit SDA = P0^5;			// 串行数据
sbit SCL = P0^6;			// 串行时钟
sbit send_button=P3^7;
uchar SLAdd_w = 0xa0;		// 从器件地址
uchar SLAdd_r = 0xa1;
/************变量定义***************************/
uchar idata SLAdd;    		// 从器件地址
bit   bdata NACK;    		// 器件坏或错误标志位
bit   bdata nackFlag;   	// 非应答标志位
/**********************************************/
extern void _nop_(void);
/******************128*64液晶端口定义*******************/
sbit LCD_RS=P0^0;
sbit LCD_RW=P0^1;
sbit LCD_E =P0^2;
#define LCD_Data P1
/******************24C16端口定义************************/
//sbit EPPOM_SCL=P0^6;
sbit EPPOM_WC =P0^7;
//sbit EPPOM_SDA=P0^5;
/******************DAC0832端口定义********************/
sbit DA_WR1=P3^6;
#define DA_Data P2
/******************遥控口定义***********************/
sbit YaoKong=P3^2;
/*****************通信端口定义*********************/
sbit Recieve=P3^0;
sbit Trasmit=P3^1;
/*****************ADC0832端口定义****************/
sbit AD_DI =P0^4;
sbit AD_DO =P0^4;
sbit AD_CS =P0^3;
sbit AD_CLK=P3^3;
uchar code_1[]="0123456789abcdef";
uchar T_code[]="好久了!!";
/****************函数初始化*********************/
void LCD_Check_Busy(void);
void LCD_Write_I(unsigned char x);
void LCD_Write_Data(unsigned char z);
void delay(unsigned char x);
void LCD_Display(unsigned char x,unsigned char *p,unsigned char y);
/*******************延时************/
void delay(unsigned char x)
{
unsigned char m,n,i;
  for(m=x;m>0;m--)
  for(n=50;n>0;n--)
  for(i=110;i>0;i--);
}


/********************液晶程序******************/
/*************忙信号检测******************/
void LCD_Check_Busy(void)
{
  
  LCD_RS=0;       ///RS=0;
  LCD_RW=1;
  LCD_E =1;
  LCD_Data=0xff;
  while(LCD_Data&0x80);
  LCD_E =0;
}

/**************写指令子程序*************/
/**RS=0,RW=0,E=高脉冲,D0-D7=指令码******/
void LCD_Write_I(unsigned char x)
{
  unsigned char i;
  LCD_Check_Busy();///检测忙信号
  LCD_RS=0; 
  LCD_RW=0;
  LCD_Data=x;
  LCD_E =1;  
  i=10;             //延时
  while(i--);  
  LCD_E=0;
}

/*************写数据子程序***************/
/**RS=1,RW=0,E=高脉冲,D0-D7=数据********/
void LCD_Write_Data(unsigned char k)
{
  unsigned char i;
  LCD_Check_Busy();
  LCD_RS=1;
  LCD_RW=0;
  LCD_Data=k;
  LCD_E =1;
  i=10;             //延时
  while(i--);  
  LCD_E=0;
}
/*************显示****************/
void LCD_Display(unsigned char x,unsigned char *p,unsigned char y)  //X为地址,第1,2,3,4行的起始地址
{                                                                  //为0x80,0x90,0x88,0x98	                                                  
 if((x>=0x80)&&(x<=0x9f))                              //y为要写入的字符个数,*P为写入数据的起始地址
  {
   unsigned int i,k;
   k=x;
   LCD_Write_I(k);                         //写入地址
   for(i=0;i<y;i++)
   { 
    k=*p;		
    LCD_Write_Data(k);	
    p++;
   }
  }	
}
/******************液晶程序结束***************************/

/***************************24XX程序*********************/
/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/

// ============================================================
// SPROM脉冲延时
void Sdelay(void)
{
uchar n;
for(n=4;n>0;n--);
return;
}

// ============================================================ 
// SPROM开始位
void i2c_start(void)
{
SDA=1;SCL=1;                        //启动总线
Sdelay();
SDA=0; // Tsu:start=4.7uS
Sdelay();
SCL=0; // Thd:start=4uS

}

// ============================================================
// SPROM停止位
void i2c_stop(void)
{
SDA=0;			                 //释放总线
Sdelay();SCL=1;
Sdelay();SDA=1; // Tsu:stop=4uS
}

/*=======================================================
i2c_write(地址,数据),写一个字节
=======================================================*/

//发送接收确认信号

bit  i2c_ack(void)

{
       bit  ack;
       SDA = 1;
       SCL = 1;
       if(SDA==1)	     //如果SDA为高电平表示从器件无应答
           ack = 1;
       else
           ack = 0;      //如果SDA为低电平表示从器件有应答
       SCL = 0;
       return  (ack);	  //返回应答标志
}

//送八位数据

void i2c_send8bit(uchar ch)

{
      uchar i;
       for(i=0;i<8;i++)
          {
             SDA=(bit)(ch&0x80);
			 _nop_();
             ch<<=1;
            SCL=1;_nop_();
            SCL=0;_nop_();
          }
       return;
}

/*接收八位数据 */
uchar i2c_receive8bit(void)
{
       unsigned  char a;
       uchar b=0;
       for(a=0;a<8;a++)
            {
              SCL = 1;
              b=b<<1;
              if (SDA==1)
              b=b|0x01;       //按位或
              SCL = 0;
            }
       return(b);
}
/**写入数据*/
void i2c_write(uchar Address,uchar Data)
{
       do{				  // 启动总线
          i2c_start();
          i2c_send8bit(0xA0);  //主器件向从器件发送地址(R/W=0为写)
         }while(i2c_ack());  //从器件若无应答一直循环
       i2c_send8bit(Address);    //发送从器件内部存储的地址
       i2c_ack();				//主器件发送应答信号
       i2c_send8bit(Data);	    //主器件向从器件发送数据
       i2c_ack();				//主器件发送应答信号
       i2c_stop();				//释放总线
       return;
}

/*=======================================================
i2c_read(地址,数据),写一个字节
=======================================================*/
uchar i2c_read(uchar Address)

{
       uchar c;
       do{
           i2c_start();				   // 启动总线 
           i2c_send8bit(0xA0);			//主器件向从器件发送地址(R/W=0为写)
       }while(i2c_ack());                //i2c_ack()=1,表示无确认,再次发送
       i2c_send8bit(Address);       	 //发送从器件内部存储的地址
       i2c_ack();						 //发送应答信号

       do{
           i2c_start();			      // 再次启动总线
           i2c_send8bit(0xA1);		   //主器件向从器件发送地址(R/W=1为读)
       }while(i2c_ack());				//从器件若无应答一直循环
       c=i2c_receive8bit();			  //从器件数据输出
       i2c_ack();					  //发送应答信号
       i2c_stop();					//释放总线
       return(c);
}
/*******************24CXX程序结束******************/

/* 主函数,模拟实现I2C总线的数据收发 */
void main(void)
{
	uchar temp=1,i;
	EPPOM_WC=0;  
	send_button=1;
	LCD_Write_I(0x30);     // 基本操作指令
    LCD_Write_I(0x0c);     //开显示,关光标,不闪烁
    LCD_Write_I(0x01);     //清除显示
    LCD_Write_I(0x06);     //指定在资料写入或读取时,光标的移动方向
    LCD_Write_I(0x0c);  	
	while(1)
	{  		
			LCD_Display(0x80,code_1,16); //显示
/********* 需发送的2字节数据***********/	   		   
	      if(send_button==0)
		   {
		      delay(1);
			 if(send_button==0)
			 {
			  uchar i;
		      while(send_button==0);
			  for(i=0;i<8;i++)
			  i2c_write(0x00+i,T_code[i]);	// 向从器件发送存放在sbuf中的2字节数据
			 }
		    }		  
/****************接收数据******************/
		   for(i=0;i<8;i++)
			  code_1[i]=i2c_read(0x00+i);
   } 
}
















⌨️ 快捷键说明

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