uvsensor.c
来自「基于pic1687x 的UVSensor 源程序,带128*64 LCD显示,以」· C语言 代码 · 共 1,665 行 · 第 1/4 页
C
1,665 行
#include<pic1687x.h>
#define uchar unsigned char
#define uint unsigned int
//for LCD
#define SID RD7
#define SCLK RD6
//for PCF8563
#define WRADDR 0x00 //定义写单元首地址
#define RDADDR 0x02 //定义读单元首地址
/*
#define SecADDR 0x02 //second
#define MinADDR 0x03 //minute
#define HourADDR 0x04 //Hour
#define DayADDR 0x05 //Day
#define WeekADDR 0x06 //Week
#define MonADDR 0x07 //Month
#define YearADDR 0x08 //Year
*/
//for EEPROM
#define EepDataAdd 0x0B
#define FlashPic 8//闪烁的图标
//#define AD_VREF 500//5.00V
//#define AD_VREF 330 ///3.30V
#define AD_VREF 252 ///2.52V
#define ADCount 10
bank1 struct
{
unsigned char Mea_Switch; //测量开关
unsigned char Time; //测量时间间隔,10--60分钟
unsigned int StartTime; //开始测量时间08:30
unsigned int EndTime; //结束测量时间17:30
} Eep_MeaData;
bank1 unsigned char NowTime[13]={0};///年、月、日、星期、时、分、秒
bank1 unsigned char P8563Data[7] = {0};///BCD码格式的时间数据:秒、分、时、日、星期、月、年
bit FlashFlag;//闪烁的标志
bit MainMenuFlag;//主菜单显示标志
unsigned char const Menu1[] = "浏览数据 ";
unsigned char const Menu2[] = "设置系统时间 ";
unsigned char const Menu3[] = "设置测试状态 ";
unsigned char const MenuPic[] = "★☆";
/*****************************************************/
/********** 延时函数 *****************/
/*****************************************************/
void delay(unsigned int time)
{
while(time--);
}
void DelayMs(unsigned int time)
{
while(time--)
delay(100);
}
/*****************************************************/
/********** LCD 串行接口 ********************/
/*****************************************************/
void LCD_Send_Byte(unsigned char bbyte) //发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK = 1;
SID = (bbyte&0x80)>>7; //取出最高位
SCLK = 0;
bbyte<<=1; //左移
}
}
//写命令
void LCD_Write_Command(unsigned char Data)
{
LCD_Send_Byte(0xf8);//串口控制 1111,1000 //1111,1(RW)(RS)0
DelayMs(5); //延时是必须的
LCD_Send_Byte(Data&0xf0);//高4位数据 DDDD,0000
Data <<= 4;
DelayMs(1); //延时是必须的
LCD_Send_Byte(Data&0xf0);//低4位数据 DDDD,0000
DelayMs(1); //延时是必须的
}
//写数据
void LCD_Write_Data(unsigned char Data)
{
LCD_Send_Byte(0xfa);//串口控制 1111,1010 //1111,1(RW)(RS)0
DelayMs(5); //延时是必须的
LCD_Send_Byte(Data&0xf0);//高4位数据 DDDD,0000
Data <<= 4;
DelayMs(1); //延时是必须的
LCD_Send_Byte(Data&0xf0);//低4位数据 0000,DDDD
DelayMs(1); //延时是必须的
}
void LCD_ClearRam(void) //清屏
{
unsigned char i,j;
for(i=0;i<32;i++)
{
LCD_Write_Command(0x80+i);
LCD_Write_Command(0x80);
for(j=0;j<32;j++)
{
LCD_Write_Data(0x00);
}
}
}
//LCD初始化
void LCD_Init(void)
{
// LCD_Write_Command(0x36); //图形方式
// LCD_ClearRam();
LCD_Write_Command(0x30);//基本指令模式
LCD_Write_Command(0x01);//清除显示
LCD_Write_Command(0x06);//指定在资料写入或读取时,光标的移动方向;DDRAM 的地址计数器(AC)加1
LCD_Write_Command(0x0c);//开显示,关光标,不闪烁
// LCD_Write_Command(0x0f);//开显示,开光标,闪烁
}
/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{ //设置LCD显示的起始位置,X为行的位置(0--7),Y为列的位置(0--3)
unsigned char address;
switch(y)
{
case 0: address = 0x80 + x; break;
case 1: address = 0x90 + x; break;
case 2: address = 0x88 + x; break;
case 3: address = 0x98 + x; break;
default:address = 0x80 + x; break;
}
LCD_Write_Command(address);
}
/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{ // 中英文字符串显示函数 X为行的位置(0--7),Y为列的位置(0--3)
LCD_set_xy( X, Y );
while (*s)
{
LCD_Write_Data(*s );
s ++;
DelayMs(1);
}
}
/******************************************************************************/
/************** For IIC **********************************/
/********************************************************************
* 名称: mssp_initi
* 说明:
* 功能: MSSP模块初始化函数
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void MSSP_initi(void)
{
TRISC3 =1; //设置SCL 为输入口,需要,否则会出现意外情况
TRISC4 =1; //设置SDA 为输入口
INTCON = 0;
SSPSTAT = 0x80; //传输数率设为100KHZ,在下降沿发送数据
SSPCON = 0x08;
SSPCON2 = 0x00;
SSPADD = 2; //设定I2C时钟频率
SSPIF = 0; //清SSP中断标志
SSPEN = 1; // 启用SSP模块 ,iic
}
/********************************************************************
*
* 名称: eep_start
* 说明:
* 功能: 产生一个起使位
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void I2C_start (void)
{
SSPIF=0;
SEN=1;
RSEN=1;
while(SSPIF==0);
SSPIF=0;
}
/********************************************************************
* 名称: eep_stop
* 说明:
* 功能: 产生一个停止位
* 调用: 无
* 输入: 无
* 返回值: 无
***********************************************************************/
void I2C_stop(void)
{
PEN=1;
while(SSPIF==0);
SSPIF=0;
}
/********************************************************************
* 名称: Eep_read_byte
* 说明:
* 功能: 读24C512指定1 byte数
* 调用: I2C_start,I2C_stop
* 输入: uint eep_addr 要读的地址,uchar*p 缓存单元
* 返回值: data
***********************************************************************/
uchar Eep_read_byte(uint eep_addr)
{
uchar data;
union addr_r
{
uint i;
uchar addr_eep[2];
}eeprom_addr;
eeprom_addr.i=eep_addr;
I2C_start();
SSPBUF=0xa0; ////24C512硬件写地址
while(SSPIF==0);
SSPIF=0;
SSPBUF = eeprom_addr.addr_eep[0];//24C512存储空间地址
while(SSPIF==0);
SSPIF=0;
SSPBUF = eeprom_addr.addr_eep[1];
while(SSPIF==0);
SSPIF=0;
I2C_stop();
I2C_start();
SSPBUF = 0xa1; //24C512硬件读地址
while(SSPIF==0);
SSPIF = 0;
RCEN=1; //使能接收模式
while(SSPIF==0);
SSPIF=0;
data=SSPBUF;
I2C_stop();
return(data);
}
/********************************************************************
* 名称: Eep_write_byte
* 说明:
* 功能: 写24C512指定1 byte数
* 调用: I2C_start,I2C_stop
* 输入: uint eep_addr 要写的地址,uchar 写缓存
* 返回值:
***********************************************************************/
void Eep_write_byte(uint eep_addr,uchar *p)
{
union addr_w
{
uint i;
uchar addr[2];
}eep_addr_w;
eep_addr_w.i=eep_addr;
I2C_start();
SSPBUF=0xa0; ////24C512硬件写地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=eep_addr_w.addr[0];//24C512存储空间地址
while(SSPIF==0);
SSPIF=0;
SSPBUF=eep_addr_w.addr[1];
while(SSPIF==0);
SSPIF=0;
SSPBUF=*p;
while(SSPIF==0);
SSPIF=0;
I2C_stop();
DelayMs(50);//如果24C512电压低,侧要延长时间
return;
}
/********************************************************************
* 名称: Read_24C512
* 说明:
* 功能: 读24C512
* 调用: I2C_read_byte
* 输入: uint read_address 要读的起使地址,uchar read_length 读段长度,uchar*point 指向读缓冲区
* 返回值: 无
***********************************************************************/
void Read_24C512(uint read_address,uchar read_length,uchar *point)
{
do{
*point=Eep_read_byte(read_address);
read_address++;
*point++;
read_length--;
}while(read_length);
}
/********************************************************************
* 名称: Write_24C512
* 说明:
* 功能: 写24C512
* 调用: I2C_write_byte
* 输入: uint read_address 要写的起始地址,uchar read_length 写段长度,uchar*point 指向写缓冲区
* 返回值: 无
***********************************************************************/
void Write_24C512(uint write_address,uchar write_length,uchar *point)
{
do{
Eep_write_byte(write_address,point);
write_address++;
*point++;
write_length--;
}while(write_length);
}
/********************************************************************
*
* 名称: P8563_WriteData
* 说明:
* 功能: 往8563写入数据
* 输入: uint eep_addr 要读的地址,uchar*p 缓存单元
***********************************************************************/
void P8563_WriteData(uchar P8563_addr,uchar *Time,uchar Num)
{
uchar i;
I2C_start();
SSPBUF = 0xA2; ////PCF8563硬件写地址
while(SSPIF==0);
SSPIF = 0;
SSPBUF = P8563_addr;//PCF8563寄存器地址
while(SSPIF==0);
SSPIF=0;
for(i=0;i<Num;i++)
{
SSPBUF = *Time;
while(SSPIF==0);
SSPIF = 0;
Time++;
}
I2C_stop();
}
/********************************************************************
*
* 名称: P8563_ReadData
* 说明:
* 功能: 读8563的时间
* 输入: uchar P8563_addr 要写的地址,uchar 写缓存
* 返回值:
***********************************************************************/
void P8563_ReadData(uchar P8563_addr,uchar *Time,uchar Num)
{
uchar i;
I2C_start();
SSPBUF = 0xA2; ////PCF8563硬件写地址
while(SSPIF==0);
SSPIF = 0;
SSPBUF = P8563_addr;//PCF8563寄存器地址
while(SSPIF==0);
SSPIF=0;
I2C_stop();
I2C_start();
SSPBUF = 0xA3; ////PCF8563硬件读地址
while(SSPIF==0);
SSPIF = 0;
for(i=0;i<Num;i++)
{
RCEN = 1; //使能接收模式
while(SSPIF==0);
SSPIF = 0;
*Time = SSPBUF;
Time++;
ACKEN = 1; //认可使能
RCEN = 0;
while(SSPIF==0);
SSPIF = 0;
}
I2C_stop();
}
/******************************************************************************/
/**************** PCF8563 BCD转换成十进制 ***************************/
/******************************************************************************/
void PData_To_Time(unsigned char *P8563Data)
{
P8563Data[0] &= 0x7F; //秒
P8563Data[1] &= 0x7F; //分
P8563Data[2] &= 0x3F; //时
P8563Data[3] &= 0x3F; //日
P8563Data[4] &= 0x07; //星期
P8563Data[5] &= 0x1F; //月
NowTime[0] = P8563Data[6]/16;//年
NowTime[1] = P8563Data[6]%16;
NowTime[2] = P8563Data[5]/16;//月
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?