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 + -
显示快捷键?