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

📄 diaodianbaohu.c

📁 51单片机下的eeprom24c16的读写程序
💻 C
字号:
#include<reg52.h>//已经在24c16通过测试

//24c01-24c16读写驱动程序,
sbit a0=ACC^0;   //定义ACC的位,利用ACC操作速度最快
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
#define scl P2_3
#define sda P2_4 

sbit dc=0xa0; /*P2.0 LCD 的RS 21*/
sbit rw=0xa1; /*P2.1 LCD 的R/W 22*/
sbit cs=0xa2; /*P2.2 LCD 的E 25*/
sfr lcdbus=0x90; /*p1LCD 数据 D0=P1.0*/

int dat[10];
unsigned char i;	  //掉电实验变量

void soft_nop(){}
void soft_10ms()//12MHZ 提供10MS 软件延时
{ register int i;
for(i=0;i<711;i++);
}


unsigned char data lcdcounter;
bit lcdusing1,lcdusing2;

bit lcd_checkbusy()/*检查LCD 忙*/
{ register lcdstate;
dc=0; /*dc=1为数据,=0 为命令.*/
rw=1; /*rw=1为读,=0为写.*/
cs=1; /*cs=1选通.*/
soft_nop();
lcdstate=lcdbus;
cs=0;
return((bit)(lcdstate&0x80));
}


void lcd_wrcmd(unsigned char lcdcmd) /*写LCD命令*/
{ lcdusing1=1;
while(lcd_checkbusy());
lcdbus=lcdcmd;
dc=0; /*dc=1为数据,=0 为命令.*/
rw=0; /*rw=1为读,=0为写.*/
cs=1; /*cs=1选通.*/
soft_nop();
cs=0;
lcdbus=0xff;
lcdusing1=0;
}


void lcd_moveto(char position) /*移动光标到指定位.0-79*/
{ register cmd=0x80;
lcdcounter=position;
if (position > 59)
position += 0x18;
else
{ if (position > 39)position -= 0x14;
else
{ if (position > 19)position += 0x2c;
}
}
cmd=cmd|position;
lcd_wrcmd(cmd);
}


void lcd_wrdata(char lcddata) /*在当前显示位置显示字符*/
{ //char i;
lcdusing2=1;
while(lcd_checkbusy());
if(lcdcounter==20){
lcd_moveto(20);
while(lcd_checkbusy());
}
if(lcdcounter==40){
lcd_moveto(40);
while(lcd_checkbusy());
}
if(lcdcounter==60){
lcd_moveto(60);
while(lcd_checkbusy());
}
if(lcdcounter==80){
lcd_moveto(0);
while(lcd_checkbusy());
lcdcounter=0;
} /*为通用而如此*/
lcdcounter++;
lcdbus=lcddata;
dc=1; /*dc=1为数据,=0 为命令.*/
rw=0; /*rw=1为读,=0为写.*/
cs=1; /*cs=1选通.*/
soft_nop();
cs=0;
lcdbus=0xff;
lcdusing2=0;
}


void lcd_string(char *strpoint) /*在当前显示位置显示LCD 字符串*/
{ register i=0;
while(strpoint[i]!=0){
lcd_wrdata(strpoint[i]);
i++;
}
}


void lcd_init()/*初始化*/
{ lcd_wrcmd(0x38); /*设置8 位格式,2行,5*7*/
lcd_wrcmd(0x0c); /*整体显示,关光标,不闪烁*/
lcd_wrcmd(0x06); /*设定输入方式,增量不移位*/
lcd_wrcmd(0x01); /*清除显示*/
lcdcounter=0;
}


void lcd_cls()/*清除显示*/
{ lcd_wrcmd(0x01);
lcdcounter=0;
}




void datadisplay(long  a)//显示变量数值(两位小数)
{int i;
 unsigned char b;
 if(a>=0)
 {for(i=9;i>=0;i--)
 {b=a%10; 
 if(i==7)
  {i--;
   dat[7]='.';
   }
 dat[i]=b+48;
  a/=10;
  }
  for(i=0;i<=9;i++)
  lcd_wrdata(dat[i]);
 }
 else
 {a=-a;
 for(i=9;i>=0;i--)
 {b=a%10; 
 if(i==7)
  {i--;
   dat[7]='.';
   }
 dat[i]=b+48;
  a/=10;
  }
  dat[0]='-';
 for(i=0;i<=9;i++)
  lcd_wrdata(dat[i]); 

 }

}




void nop()
{;}
//------------------------------------------------------------------------------


void s24(void)           //起始函数
{
  nop();
  scl=0; 
  sda=1;
  scl=1;
  nop();
  sda=0;
  nop();
  nop();
  scl=0;
  nop();
  nop();
  sda=1;///?
}

//------------------------------------------------------------------------------


void p24(void)           //停止函数
{
  sda=0;
  scl=1;
  nop();
  nop();
  sda=1;
}

//------------------------------------------------------------------------------


unsigned char rd24(void) /////////////////从24c16读一字节数据
{    ACC=0x00;
     sda=1;
scl=1;a7=sda;nop();scl=0;
scl=1;a6=sda;nop();scl=0;
scl=1;a5=sda;nop();scl=0;
scl=1;a4=sda;nop();scl=0;
scl=1;a3=sda;nop();scl=0;
scl=1;a2=sda;nop();scl=0;
scl=1;a1=sda;nop();scl=0;
scl=1;a0=sda;nop();scl=0;
sda=1;//ziji修改 原为0
nop();//zijia
scl=1;nop();nop();nop();
scl=0;
 /// ///////////////24c16的一位回答位。
sda=0;//zijia
return(ACC);
}
//------------------------------------------------------------------------------


void wd24(unsigned char dd) ////////////////向24c16写一字节数据
{   sda=1;
    ACC=dd;
sda=a7;scl=1;nop();scl=0;
sda=a6;scl=1;nop();scl=0;
sda=a5;scl=1;nop();scl=0;
sda=a4;scl=1;nop();scl=0;
sda=a3;scl=1;nop();scl=0;
sda=a2;scl=1;nop();scl=0;
sda=a1;scl=1;nop();scl=0;
sda=a0;scl=1;nop();scl=0;
sda=1;//ziji修改 原为0
scl=1;
//scl=0;(在下面程序中)
}
//---------------------------------------------------------------------------

unsigned char read(unsigned int address)
{
  unsigned char dd;
  s24();                 ////////////////////////开始条件
  wd24(0xa0);           /////////////////////////写器件地址(写命令)
  nop(); 
  scl=0;                 ///////////////////////////////////接收器件地址确认信号
  wd24(address);           //////////////////////////// 写数据地址
  nop();
  scl=0;
  s24();                   ///////////////////////////////////开始条件
  wd24(0xa1);           /////////////////////////////写器件地址(读命令)
  scl=0;
  dd=rd24();         //////////////////////////////////读 一字节
  p24();             ////////////////////////////////////停止条件
  return(dd);
}
//------------------------------------------------------------------------------


void write(unsigned int address,unsigned char dd)
{ s24();                 /////////////////开始条件
  wd24(0xa0);         ////////////////////////写器件地址;
  scl=0; 
  wd24(address);         /////////////////////写数据地址
  scl=0;
  wd24(dd);             //////////////////////////写dd数据
  scl=0;
  p24();               /////////////////////////停止条件;
    

}


 void main()
 {//unsigned char i=10;
 unsigned int j;

 EA=1;
 EX0=1;
 IT0=1;

 i=read(0x44);
 //i=2;
 //write(0x01,i);	
 lcd_init();
 //while(1)
 datadisplay(i*100);
 for(j=250;j>0;j--)
 { soft_10ms();}

  //lcd_wrdata(i);


}


void diaodian() interrupt 0
{ write(0x00,i);
}

⌨️ 快捷键说明

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