#include "stm32f10x.h"
#include "led.h"
#include "Lcd1602.h"
#include "myiic.h"
#include "delay.h"
#include<stdio.h>
#include<string.h>
#include "data_ex.h"
#include "24cxx.h"
#define delay_iic 400
#define SDA_IN() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); }
#define SDA_OUT() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); }
//IO操作函数
//#define IIC_SCL PCout(12) //SCL
//#define IIC_SDA PCout(11) //SDA
//#define READ_SDA PCin(11) //输入SDA
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin (7) //输入SDA
unsigned char a0,a1,a2,a3,a4;
unsigned char t0,t1,t2,t3,t4;
unsigned char Page_Temp=0;
unsigned char Flag_L=0;
unsigned char Flag_H=0;
void delay_us(u32 nus)
{
u32 temp=100;
while(temp--);
}
//初始化IIC
void IIC_Init1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB10,PB11 输出高
}
//产生IIC起始信号
void IIC_Start1(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1;
delay_us(delay_iic);
IIC_SCL=1;
delay_us(400);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(delay_iic);
}
//产生IIC停止信号
void IIC_Stop1(void)
{
SDA_OUT();//sda线输出
IIC_SCL=1;
delay_us(delay_iic);
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(delay_iic);
IIC_SCL=1;
delay_us(delay_iic);
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte1(u8 txd)
{
u8 t;
SDA_OUT();
for(t=0;t<8;t++)
{
IIC_SCL=0;//拉低时钟开始数据传输
delay_us(delay_iic);
IIC_SDA=(txd&0x80)>>7;
delay_us(delay_iic); //对TEA5767这三个延时都是必须的
//2us
IIC_SCL=1;
delay_us(delay_iic);
IIC_SCL=0;
delay_us(delay_iic);
txd<<=1;
}
IIC_SDA=0;
delay_us(delay_iic);
IIC_SCL=1;//拉低时钟开始数据传输
delay_us(delay_iic);
IIC_SCL=0;
}
//初始化1602
void Init_Lcd1602(void)
{
IIC_Init1();
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x38); //Function set
// IIC_Send_Byte1(0x08); //
IIC_Send_Byte1(0x01); //Clear display
IIC_Send_Byte1(0x06); // entry mode set
IIC_Send_Byte1(0x0c); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
//没有下光标
void SetCursorPos_Off(void)
{
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x0C); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
//CLEAR 1602
void Clear_Lcd1602(void)
{
IIC_Init1();
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
//IIC_Send_Byte1(0x38); //Function set
IIC_Send_Byte1(0x01); //Clear display
//IIC_Send_Byte1(0x06); // entry mode set
//IIC_Send_Byte1(0x0C); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
/*在指定行和列位置显示指定的字母,数字(5*7)*/
void disp_char1(int line,int column, unsigned char *pp)
{
IIC_Init1();
IIC_Start1();
IIC_Send_Byte1(0x78);//send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(line-1)*0x40+(column-1));// 设置地址
IIC_Send_Byte1(0x40); //控制字节:CO=1,A0=0,表示以下传输的n个字节是数据
IIC_Send_Byte1(*pp);
IIC_Stop1();
}
void disp_char2(int line,int column, unsigned char pp)
{
IIC_Init1();
IIC_Start1();
IIC_Send_Byte1(0x78);//send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(line-1)*0x40+(column-1));// 设置地址
IIC_Send_Byte1(0x40); //控制字节:CO=1,A0=0,表示以下传输的n个字节是数据
IIC_Send_Byte1(pp);
IIC_Stop1();
}
void SetCursorPos(unsigned char y, unsigned char column,unsigned char onoff)//1 有光标,0 没有光标
{
IIC_Init1();
if(onoff) //有光标
{
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(y-1)*0x40+(column-1));// 设置地址
IIC_Stop1();
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x0D); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
else
{
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x0C); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
}
void Focus(unsigned char onoff)//1 有光标,0 没有光标
{
IIC_Init1();
if(onoff) //有光标
{
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x0D); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
else
{
IIC_Start1();
IIC_Send_Byte1(0x78); //send address
IIC_Send_Byte1(0x00); //控制字节:CO=0,A0=0,表示以下传输的N个字节是指令
IIC_Send_Byte1(0x0C); // 0x0D 字符闪烁,没有下光标,OC= 没有字符闪烁,没有下光标,
IIC_Stop1();
}
}
void disp_num1(int line,int column, unsigned int num)
{
unsigned int a5;
IIC_Init1();
a5=num;
a0=num%10; //个位
a1=num%100/10; //十位
a2=num%1000/100; //百位
a3=num%10000/1000; //千位
a4=num/10000; //万位
IIC_Start1();
IIC_Send_Byte1(0x78);//send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(line-1)*0x40+(column-1));// 设置地址
IIC_Send_Byte1(0x40); //控制字节:CO=1,A0=0,表示以下传输的n个字节是数据
if(a5<10)
{
IIC_Start1();
IIC_Send_Byte1(0x78);//send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(line-1)*0x40+(column-1));// 设置地址
IIC_Send_Byte1(0x40); //控制字节:CO=1,A0=0,表示以下传输的n个字节是数据
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x30+a0);
IIC_Stop1();
return;
}
if(100>a5&&a5>=10)
{
IIC_Start1();
IIC_Send_Byte1(0x78);//send address
IIC_Send_Byte1(0x80); //控制字节:CO=1,A0=0,表示以下传输的1个字节是指令
IIC_Send_Byte1(0x80+(line-1)*0x40+(column-1));// 设置地址
IIC_Send_Byte1(0x40); //控制字节:CO=1,A0=0,表示以下传输的n个字节是数据
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x30+a1);
IIC_Send_Byte1(0x30+a0);
IIC_Stop1();
return;
}
if(1000>a5&&a5>=100)
{
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x30+a2);
IIC_Send_Byte1(0x30+a1);
IIC_Send_Byte1(0x30+a0);
IIC_Stop1();
return;
}
if(10000>a5&&a5>=1000)
{
IIC_Send_Byte1(0x20);
IIC_Send_Byte1(0x30+a3);
IIC_Sen