|
----------------------------------------------------------------主函數(shù)
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
extern void Int_Lcd();
extern void Lcd_Show(u8 x,u8 y,u8 *set);
extern void EE_Read(u8 *buf,u8 addr,u8 len);
extern void EE_Write(u8 *buf,u8 addr,u8 len);
void Str_Convert(u8 *str,u8 *src,u8 len);
void main()
{
u8 buf[5]={5,2,8,6,1};
u8 str[20];
Int_Lcd();
// EE_Write(buf,0x00,sizeof(buf)); //EEPROM寫(xiě)入
EE_Read(buf,0x00,sizeof(buf)); //EEPROM讀取
Str_Convert(str,buf,sizeof(buf)); //字符串轉(zhuǎn)化函數(shù)
Lcd_Show(0,0,str); //1cd1602顯示
while(1);
}
void Str_Convert(u8 *str,u8 *src,u8 len)
{
u8 tem;
while(len--)
{
tem=*src>>4;
if(tem<=9)
*str++=tem+'0';
else
*str++=tem-10+'a';
tem=*src&0x0f;
if(tem<=9)
*str++=tem+'0';
else
*str++=tem-10+'a';
*str++=' ';
src++;
}
}
----------------------------------------------------------------LCD1602
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
#define LCD_DB P0
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void LCD_Wait_Ready()
{
u8 sta;
LCD_DB=0xff;
LCD_RS=0;
LCD_RW=1;
do
{
LCD_E=1;
sta=LCD_DB;
LCD_E=0;
}
while(sta & 0x80);
}
void LCD_Write_Cmd(u8 cmd)
{
LCD_Wait_Ready();
LCD_RS=0;
LCD_RW=0;
LCD_DB=cmd;
LCD_E=1;
LCD_E=0;
}
void LCD_Write_Dat(u8 dat)
{
LCD_Wait_Ready();
LCD_RS=1;
LCD_RW=0;
LCD_DB=dat;
LCD_E=1;
LCD_E=0;
}
void Lcd_Set_Cursor(u8 x,u8 y)
{
u8 addr;
if(y==0)
addr=0x00+x;
else
addr=0x40+x;
LCD_Write_Cmd(addr | 0x80);
}
void Lcd_Show(u8 x,u8 y,u8 *str)
{
Lcd_Set_Cursor(x,y);
while(*str!='\0')
{
LCD_Write_Dat(*str++);
}
}
void Int_Lcd()
{
LCD_Write_Cmd(0x38);
LCD_Write_Cmd(0x0c);
LCD_Write_Cmd(0x06);
LCD_Write_Cmd(0x01);
}
----------------------------------------------------------------I2C
#include <reg52.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
sbit SCL=P2^1;
sbit SDA=P2^0;
sbit LED1=P0^0;
sbit LED2=P0^1;
void Dealy()
{
u8 i;
for(i=0;i<10;i++)
_nop_();
}
void I2C_Start()
{
SDA=1;
SCL=1;
Dealy();
SDA=0;
Dealy();
SCL=0;
Dealy();
}
void I2C_Stop()
{
SCL=0;
SDA=0;
Dealy();
SCL=1;
Dealy();
SDA=1;
Dealy();
}
bit I2C_Write(u8 dat) //I2C寫(xiě)入
{
bit ack;
u8 mask;
for(mask=0x80;mask>0;mask>>=1)
{
if((mask & dat)==0)
SDA=0;
else
SDA=1;
Dealy();
SCL=1;
Dealy();
SCL=0;
Dealy();
}
SDA=1;
Dealy();
SCL=1;
ack=SDA;
Dealy();
SCL=0;
Dealy();
return (~ack);
}
u8 I2C_Read(bit ack) //I2C讀取
{
u8 dat,i;
SDA=1;
Dealy(); //延時(shí)10us
for(i=0;i<8;i++)
{
SCL=1;
Dealy();
dat<<=1;
dat |= SDA;
Dealy();
SCL=0;
Dealy();
}
SDA=ack; //SDA由形參ack控制
Dealy();
SCL=1;
Dealy();
SCL=0;
Dealy();
return dat;
}
u8 I2C_ReadACK()
{
u8 dat,i;
SDA=1;
Dealy(); //延時(shí)10us
for(i=0;i<8;i++)
{
SCL=1;
Dealy();
dat<<=1;
dat |= SDA;
Dealy();
SCL=0;
Dealy();
}
SDA=0; //SDA直接置0
Dealy();
SCL=1;
Dealy();
SCL=0;
Dealy();
return dat;
}
u8 I2C_ReadNAK()
{
u8 dat,i;
SDA=1;
Dealy();
for(i=0;i<8;i++)
{
SCL=1;
Dealy();
dat<<=1;
dat |= SDA;
Dealy();
SCL=0;
Dealy();
}
SDA=1; //SDA直接置1
Dealy();
SCL=1;
Dealy();
SCL=0;
Dealy();
return dat;
}
----------------------------------------------------------------EEPROM
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
extern void I2C_Start();
extern void I2C_Stop();
extern bit I2C_Write(u8 dat);
extern bit I2C_Read(bit ack);
extern u8 I2C_ReadACK();
extern u8 I2C_ReadNAK();
void EE_Read(u8 *buf,u8 addr,u8 len) //EEPROM讀取,len讀取長(zhǎng)度
{
do
{
I2C_Start();
if(I2C_Write(0x50<<1))
break;
I2C_Stop();
}
while(1);
I2C_Write(addr); //寫(xiě)入讀取的起始地址
I2C_Start();
I2C_Write((0x50<<1)|0x01);
while(len>1)
{
*buf++=I2C_Read(0); //應(yīng)答位置0
// *buf++=I2C_ReadACK();
len--;
}
*buf=I2C_Read(1); //應(yīng)答位置1
// *buf=I2C_ReadNAK();
I2C_Stop();
}
void EE_Write(u8 *buf,u8 addr,u8 len) //EEPROM寫(xiě)入
{
while(len>0)
{
do
{
I2C_Start();
if(I2C_Write(0x50<<1))
break;
I2C_Stop();
}
while(1);
I2C_Write(addr);
while(len>0)
{
I2C_Write(*buf++);
len--;
addr++;
if((addr&0x07)==0)
break;
}
I2C_Stop();
}
} |
|