⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 realmain.c

📁 用pic单片机做的一个温度计 实现实时时钟显示和存储
💻 C
📖 第 1 页 / 共 3 页
字号:

#include<p18f452.h>
#include"delays.h"
#include"pwm_sound.h"
#include"ds1302.h"
#include"i2c.h"
#include"lcd.h"
#include"ds18b20.h"



#define  zlg7290                0x70                            // zlg7290的器件地址
#define  zlgchildaddr           0x01                            // zlg7290的键值寄存器地址


#define  at2416                0xA0                            // eeprom at2408的器件地址

 
#define  uprestrctflag         0x01                            // 温度上限符号位地址  
#define  downrestrctflag       0x06                            // 温度下限符号位地址 
   
    
#define  at2416temup           0x02                            // 温度上限数据地址 
#define  at2416temdown         0x07                            // 温度上限数据地址 

#define      enter           32                                //确认键
#define      escape          38                                //推出键
#define      just            22                                //+
#define      bear            23                                //-                
#define      lift            36                                //左
#define      right           34                                //右   
#define      up              27                                //上 
#define      down            35                                //下
#define      key0            0                                 // 0
#define      key9            9                                 // 8
#define      key_m           10                                // 小数点



char choose;                                                    //菜单选择变量           

char keyflag=0;                                                  //按键标志

char key=0;                                                      //键值


extern char year;    //年
extern char month;   //月
extern char date;    //日
extern char day;     //星期
extern char hour;    //小时
extern char minute;  //分钟
extern char second;  //秒 

extern  char y;                                                   //十位
extern  char z;                                                   //各位


void int1(void);            
void int1_initial(void);
void initial_sys(void);
void int1_initial(void);
void displaywelcome(void);
void displaymainpage(void);
void displaymainpage_cursor(char);
void readkey(void);
void applydisplay(void);
void timesset(void);
void timesettemp(void);
void temperaturerestrct(void);
void temperaturerestrcttemp(void);
void replaytemperature(void);


#pragma code  InterruptVectorHigh=0x08

void InterruptVectorHigh(void)
  {
    _asm
     
     goto  int1
   
    _endasm
  }
#pragma code

#pragma interrupt int1
void int1(void)
  {   
     
      keyflag=1;
      key=read_i2c_date(zlg7290,zlgchildaddr )-1;            //读取键值
      INTCON3bits.INT1IF=0;                         //清中断标志
  }

void main()
{   
     
   initial_sys();
   
   int1_initial();

   lcd_initial();
   
   pwm_initial();

   displaywelcome();                                    //显示欢迎界面面
  
   initial_i2c();

   readkey();
   while(key!=enter);                                    //等待按键

   choose=2;    

  while(1)
 {
   clearlcd();                                          //清屏
   clearlcd();  
   displaymainpage();                                   //显示主菜单

   displaymainpage_cursor(choose);
   while(1)
    {   
        
         readkey();
 
         if(key==up)
           { if (choose==1) { choose=4;  displaymainpage_cursor(choose);}
             else {   --choose;          displaymainpage_cursor(choose);}
           }
       
         if(key==down)
           { if (choose==4) { choose=1;  displaymainpage_cursor(choose);}
             else {   ++choose;          displaymainpage_cursor(choose);}
           }
         if(key==enter) break;
     }
   switch(choose)
    {
       case 1: applydisplay();          break;
       case 2: timesset();              break;
       case 3: temperaturerestrct();    break;
       case 4: replaytemperature();     break;
    } 
 
 }
  writecmdlcd(0x0f);                                           // 光标开 
}
/*****************************************************************************
 ******函 数 名 称 : initial_sys()
 ******函 数 功 能 : 系统初始化
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
void initial_sys()
{

  INTCON=0x00;                                              //关中断
  ADCON1=0b00000110;                                        //RA端口设定为数字                                
  PIE1=0;
  PIE2=0;

}
/*****************************************************************************
 ******函 数 名 称 : initial_sys()
 ******函 数 功 能 : int1电平变化中断
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
void int1_initial()
 {     
   INTCON2 &=0xDF;                    // INT1=0 下降沿的时候中断
       
   RCONbits.IPEN=1;                  // 使能中断优先级
      
   INTCON=0XC0;                      //  GIE=1,PEIE=1   
   
   INTCON3bits.INT1IP=1;             //高优先级
   INTCON3bits.INT1IF=0;             //未发生int1中断
   INTCON3bits.INT1IE=1;             //使能int1外部引脚中断
        
   TRISBbits.TRISB1=1;               // INT1 (RB1)设置为输入
  }
/*****************************************************************************
 ******函 数 名 称 : readkey(void)
 ******函 数 功 能 : 读键值函数
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
void readkey(void)
{ 
  while(!keyflag);
  keyflag=0;
  
}

/*****************************************************************************
 ******函 数 名 称 : displaywelcome(void)
 ******函 数 功 能 : 进入欢迎界面
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/
void displaywelcome(void)
{ 
                        

   char welcome1[]="数字温度计";
   char welcome2[]="制作:";
   char welcome3[]="陈强";
   char welcome4[]="董向远";
   char welcome5[]="张宁";
   char welcome6[]="2008年 6月";
   
   clearlcd();
  
   lcd_set_cursor(1,3);
   putslcd(welcome1);
  
   lcd_set_cursor(2,1);
   putslcd(welcome2);

   lcd_set_cursor(2,6);
   putslcd(welcome3);

   lcd_set_cursor(3,6);
   putslcd(welcome4);

   lcd_set_cursor(3,3);
   putslcd(welcome5);
   
   lcd_set_cursor(4,1);
   putslcd(welcome6);

}
/*****************************************************************************
 ******函 数 名 称 : displaymainpage()
 ******函 数 功 能 : 
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
void displaymainpage()
{
   char mainpage1[]="数字时间显示";
   char mainpage2[]="系统时间设定";
   char mainpage3[]="温度限制设定";
   char mainpage4[]="历史温度回显";

  lcd_set_cursor(1,2);
  putslcd(mainpage1);
  
  lcd_set_cursor(2,2);
  putslcd(mainpage2);
 
  lcd_set_cursor(3,2);
  putslcd(mainpage3);

  lcd_set_cursor(4,2);
  putslcd(mainpage4);

}
/*****************************************************************************
 ******函 数 名 称 : displaymainpage_cursor(unsigned x)
 ******函 数 功 能 : 
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
void displaymainpage_cursor(char x)
{  
   char cursorblock[]="  ";
   switch(x)
   {
    case 1:{ 
              lcd_set_cursor(1,1); writedatalcd( 0x10);
              lcd_set_cursor(2,1); putslcd(cursorblock);
              lcd_set_cursor(3,1); putslcd(cursorblock);
              lcd_set_cursor(4,1); putslcd(cursorblock);
              break;
           }

    case 2:{ 
              lcd_set_cursor(1,1); putslcd(cursorblock);
              lcd_set_cursor(2,1); writedatalcd( 0x10);
              lcd_set_cursor(3,1); putslcd(cursorblock);
              lcd_set_cursor(4,1); putslcd(cursorblock);
              break;
           }
    case 3:{ 
              lcd_set_cursor(1,1); putslcd(cursorblock);
              lcd_set_cursor(2,1); putslcd(cursorblock);
              lcd_set_cursor(3,1); writedatalcd( 0x10);
              lcd_set_cursor(4,1); putslcd(cursorblock);
              break;
           }

    case 4:{ 
              lcd_set_cursor(1,1); putslcd(cursorblock);
              lcd_set_cursor(2,1); putslcd(cursorblock);
              lcd_set_cursor(3,1); putslcd(cursorblock);
              lcd_set_cursor(4,1); writedatalcd( 0x10);
              break;
           }
   }

}


/*****************************************************************************
 ******函 数 名 称 : applydisplay()
 ******函 数 功 能 : 进入应用界面
 ******输       入 :  
 ******输       出 :  
 ******************************************************************************/ 
 void applydisplay(void)
{  

   char k=0;                                                 //存储总数设定变量
   int  i=0;                                                 //存储时间间隔控制
   char tempdisplay1[]="数字温度显示";

   char tempdisplay2[]="温度";
   char tempdisplay3[]="时刻:";
   
   clearlcd();                                              //清屏   


   lcd_set_cursor(1,2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -