📄 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 + -