初级会员
积分 102
金钱 102
注册时间 2015-5-31
在线时间 7 小时
5 金钱
#ifndef _iic_h_
#define _iic_h_
#include "sys.h"
//IO方向设置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<7;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<7;}
//IO操作函数
#define IIC_SCL   Bout(6) //SCL
#define IIC_SDA   Bout(7) //SDA
#define READ_SDA PBin(7) //输入SDA
/******************************************************************************
外部功能函数
******************************************************************************/
void IIC_GPIO_Init(void); //GPIO初始化
void IIC_Start(void); //IIC启动
void IIC_Stop(void); //IIC停止
void IIC_Ack(u8 a); //主机向从机发送应答信号
u8 IIC_Write_Byte(u8 dat); //向IIC总线发送一个字节数据
u8 IIC_Read_Byte(void); //从IIC总线上读取一个字节数据
#endif /* end iic.h */
#include "iic.h"
#include "delay.h"
void IIC_GPIO_Init(void)
{
RCC->APB2ENR|=1<<3;//先使能外设IO PORTB时钟
GPIOB->CRL&=0X00FFFFFF;//PB6/7 推挽输出
GPIOB->CRL|=0X33000000;
GPIOB->ODR|=3<<6; //PC6,7 输出高
}
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
delay_us(4);
}
void IIC_Stop(void)
{
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}
void IIC_Ack(u8 a)
{
SDA_OUT();
if(a) IIC_SDA=1; //放上应答信号电平
else IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
delay_us(4);
IIC_SCL=0;
delay_us(4);
}
u8 IIC_Write_Byte(u8 dat)
{
u8 i;
u8 iic_ack=0; //iic应答标志
SDA_OUT();//IIC_SDA_OUT(); //设置成输出
for(i = 0;i < 8;i++)
{
if(dat & 0x80) IIC_SDA = 1; //判断发送位,先发送高位
else IIC_SDA = 0;
//#if _USER_DELAY_CLK==1 /* 定义了则使用延时函数来改变通讯频率 */
delay_us(4);//IIC_Delay();
IIC_SCL = 1; //为SCL下降做准备
delay_us(4);//IIC_Delay();
IIC_SCL = 0; //突变,将数据位发送过去
dat<<=1; //数据左移一位
//字节发送完成,开始接收应答信号
}
IIC_SDA = 1; //释放数据线
SDA_IN(); //设置成输入
delay_us(4);//IIC_Delay();
IIC_SCL = 1; //为SCL下降做准备
delay_us(4);//IIC_Delay();
iic_ack |= READ_SDA; //读入应答位
IIC_SCL = 0;
return iic_ack; //返回应答信号
}
u8 IIC_Read_Byte(void)
{
u8 i;
u8 x=0;
IIC_SDA = 1; //首先置数据线为高电平
SDA_IN(); //设置成输入
for(i = 0;i < 8;i++)
{
x <<= 1; //读入数据,高位在前
//#if _USER_DELAY_CLK==1 /* 定义了则使用延时函数来改变通讯频率 */
delay_us(4);//IIC_Delay();
IIC_SCL = 1; //突变
delay_us(4);//IIC_Delay();
if(READ_SDA) x |= 0x01; //收到高电平
IIC_SCL = 0;
delay_us(4);//IIC_Delay();
} //数据接收完成
IIC_SCL = 0;
return x; //返回读取到的数据
}
int main(void)
{
//u8 t;
//u8 len;
char check_flag=2;
u16 times=0;
char buf1[10],buf2[10];//,buf3[10];
char *buf_temp;
float adc_temp1=0;
float adc_temp2=0;
//_PCF8563_Time_Typedef *pppp;
p_Time=(_PCF8563_Time_Typedef *)mymalloc(sizeof(Time_InitStruct));
p_Date=(_PCF8563_Date_Typedef *)mymalloc(sizeof(Date_InitStruct));
p_Time->RTC_Hours = 10;
p_Time->RTC_Minutes = 20;
p_Time->RTC_Seconds = 30;
p_Date->RTC_Years = 15;
p_Date->RTC_Months = 5;
p_Date->RTC_Days = 28;
p_Date->RTC_WeekDays = 4;
//float adc_temp3=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
//uart1_init(72,9600); //串口初始化为9600
uart2_init(36,115200); //串口2初始化为115200
//LCD_Init();//迪文屏初始化
PORTDE_Init();//A/D采集用
//PCF8563_Init();//实时时钟
IIC_GPIO_Init();//实时时钟
delay_ms(2000);
LCD_Init();//迪文屏初始化
PCF8563_SetMode(PCF_Mode_Normal);
PCF8563_Stop();
PCF8563_SetTime(PCF_Format_BIN,p_Time);
PCF8563_SetDate(PCF_Format_BIN,0,p_Date);
PCF8563_Start();
//PCF8563_SetTime(0x01,pppp);
delay_ms(2000);
//check_flag=PCF8563_Check();
//DispChar(140,60,check_flag);
//buf_temp=&check_flag;
//DispString(140,20,buf_temp,1);
PCF8563_GetTime(PCF_Format_BIN,p_Time);
sprintf(buf_temp,"%x",p_Time->RTC_Hours);
DispString(140,20,buf_temp,2);
//DispChar(140,20,pppp->RTC_Hours);
//DispChar(140,40,pppp->RTC_Minutes);
//DispChar(140,60,pppp->RTC_Seconds);
DispString(10,20,"AUTO MENU",9);
DispString(270,20,"95%",3);
DispString(10,40,"MANUAL MENU",11);
DispString(10,60,"MANUAL LOOK BACK",16);
DispString(10,80,"SETTING",7);
DispString(10,100,"AUTO DATA STORE",15);
DispString(10,120,"MANUAL DATA STORE",17);
DispString(10,140,"TIME SETTING",12);
DispString(10,160,"MASTER LINK",11);
DispString(10,180,"AUTO ON/OFF",11);
DispString(10,200,"ID:XXXXXXXXXX GSM/WIRELESS/RS485",32);
//DispString(140,220,"2015-08-23 12:00:00",21);
//DispString(10,10,"AUTO ON/OFF ",24);
while(1)
{
if(times<10)
{
adc_temp1+=ADC1_Data();
adc_temp2+=ADC2_Data();
times+=1;
}else
{
times=0;
sprintf(buf1,"%-10f",adc_temp1/20);
sprintf(buf2,"%-10f",adc_temp2/20);
//buf1=buf;
DispString(170,120,buf1,10);
DispString(170,140,buf2,10);
adc_temp1=0;
adc_temp2=0;
//显示时间
//read_time_ok=read_timer();
//buf_temp=&read_time_ok;
//DispString(100,20,buf_temp,2);
//buf_temp=timer;
//DispString(10,220,buf_temp,20);
sprintf(buf_temp,"%d",timer[0]);
DispString(10,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[1]);
DispString(30,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[2]);
DispString(50,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[3]);
DispString(70,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[4]);
DispString(90,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[5]);
DispString(110,220,buf_temp,2);
sprintf(buf_temp,"%d",timer[6]);
DispString(130,220,buf_temp,2);
//sprintf(buf_temp,"%d",read_time_ok);
//DispString(140,40,buf_temp,2);
}
delay_ms(100);
}
}
//为什么错误?
我来回答