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

📄 lcd.i

📁 一款恒温控制器,已用在老化室工作半年多,M16+10K热敏电阻...
💻 I
📖 第 1 页 / 共 2 页
字号:
          written_add_data((unsigned int)i*16,tab_13[(unsigned int)i*2]);
          written(tab_13[(unsigned int)i*2+1]);
          }  

       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+2,tab_14[(unsigned int)i*2]);
          written(tab_14[(unsigned int)i*2+1]);
         } 

       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+4,tab_15[(unsigned int)i*2]);
          written(tab_15[(unsigned int)i*2+1]);
         } 
                
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+256,tab_16[(unsigned int)i*2]);
          written(tab_16[(unsigned int)i*2+1]);
         }  
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+258,tab_17[(unsigned int)i*2]);
          written(tab_17[(unsigned int)i*2+1]);
         } 
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+260,tab_18[(unsigned int)i*2]);
          written(tab_18[(unsigned int)i*2+1]);
         }          
}  

void display_clear(void)    //清除所有显示
{       
  unsigned char i;
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16,0x0);
          written(0x0);
         }  
           
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+2,0x0);
          written(0x0);
         } 
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+4,0x0);
          written(0x0);
         } 
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+256,0x0);
          written(0x0);
         }  
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+258,0x0);
          written(0x0);
         } 
         
       for(i=0;i<16;i++)
         {
          written_add_data((unsigned int)i*16+260,0x0);
          written( 0x0);
         }         
}    
   
void Written_char(unsigned char line,unsigned char row,unsigned char z)
{   
  unsigned char i;
if(row<6)
  { 
    switch(line)
     {
      case 0: 
        for(i=0;i<8;i++) written_add_data((unsigned int)i*16+row,tab_char[z][i]);
        break;  
      case 1: 
        for(i=8;i<16;i++) written_add_data((unsigned int)i*16+row,tab_char[z][i-8]);
        break;
      }
   }
else 
  { 
    switch(line)
     {
      case 0: 
        for(i=0;i<8;i++) written_add_data((unsigned int)i*16+row+250,tab_char[z][i]);
        break;        
      case 1: 
        for(i=8;i<16;i++) written_add_data((unsigned int)i*16+row+250,tab_char[z][i-8]);
        break;
      }
   }
}  

void start_display()
{ 
  //  LCD第1行
  Written_char(0,0,55);
  Written_char(0,1,25);
  Written_char(0,2,63);
  Written_char(0,5,62);
  Written_char(0,7,54);
  Written_char(0,8,63);
  Written_char(0,11,62);
  //  LCD第2行
  Written_char(1,0,58);
  Written_char(1,1,24);
  Written_char(1,2,27);
  Written_char(1,3,20);
  Written_char(1,4,64);
  Written_char(1,9,66);
  //Written_char(1,12,Char_T);
}
flash unsigned int Ntc_tab[70]=
flash unsigned int Ntc_tab[70]=
{
733,724,716,707,698,690,681,672,663,654,     /* 0- 9*/
645,636,628,619,610,600,592,583,574,565,     /*10-19*/
556,547,538,529,521,512,503,495,486,478,     /*20-29*/
470,461,453,445,437,429,421,413,406,399,     /*30-39*/
391,384,376,369,362,355,348,341,335,328,     /*40-49*/
322,315,308,301,295,286,279,273,266,259,     /*50-59*/
253,247,240,232,225,218,210,202,194,186      /*60-69*/
};
void Adc_init(void)
void Adc_init(void)
{
ADMUX=0x40;       //选择模式 
ADCSRA=0X87;      //adc 使能,128分频
}
                                                 
unsigned int  Get_ADC(void) //ADC读函数
{  
        unsigned char  Adc_Count;             //定义ADC的累计次数 
        unsigned int  Adc_Data_Sum=0;         //定义ADC的总数据值 
        unsigned int  ADC_Data;               //定义ADC的平均值 
    //  unsigned int  Voltage;                //定义取样的平均电压 
        
    //   ADMUX=0x40;       //选择模式 
        
      for(Adc_Count=0;Adc_Count<3;Adc_Count++)//累计ADC转换4次,并且将ADC数据累加到adcdata里 
          { 
            ADCSRA|=(1<<6);        //开ADC,进行单次转换 
            delay_ms(1);           //开ADC到读到准确数据件的延时 
            Adc_Data_Sum+=ADCW;    //累加 
            //ADCSRA|=(0<<6);      //关ADC ???
           } 
        ADC_Data=Adc_Data_Sum/3;    //平均 ADC        
     return(ADC_Data);              //将ADC返回
} 

unsigned int Search_tab(void)
//unsigned char Search_tab()
{
//unsigned int  Voltage;
 unsigned char i_temp=0;
 unsigned int Adc_temp;
  Adc_temp=Get_ADC();
//  if(temp>Ntc_tab[i_temp])  {i_temp++;}
 // else  i_temp--;
while((Adc_temp<Ntc_tab[i_temp])&&(i_temp<70)) {i_temp++;}
return(i_temp);
//Voltage=temp*(5000/1024); 
//return(temp);
//return(Voltage);
}

void display_temp(void)
{
 Written_char(0,3,((Search_tab()-1)/10));
 Written_char(0,4,((Search_tab()-1)%10));  
//Written_char(0,3,(Search_tab()/1000));
//Written_char(0,4,(Search_tab()%1000/100));
//Written_char(0,5,(Search_tab()%1000%100/10));
//Written_char(0,6,(Search_tab()%1000%100%10));
//Written_char(0,3,Search_tab()/10);
//Written_char(0,4,Search_tab()%10);  
} 
bit time_Adc_ok=0;
bit time_Adc_ok=0;
unsigned int time_Adc;

bit  time_1s_ok=0;
unsigned int time_count;

interrupt [20] void time0_comp_isr(void)
{
 if(++time_Adc>=150)
    {
    time_Adc=0;
    time_Adc_ok=1;
    }
    
 if(++time_count>=500)
    {
     time_count=0;
     time_1s_ok=1;
    }
}

Time_init()
{
TCCR0=0X0b;
TCNT0=0x00;
OCR0 =0x7C;
TIMSK=0X02;
}

unsigned int Seconds=0;
unsigned int Minuts=0;

void tone(unsigned int Buzzer_time)  //X定义为报警时间的长短
{
unsigned int i;
  for(i=0;i<Buzzer_time;i++)
   {      
     PORTB.6               =~PORTB.6               ;
     delay_us(250);
     }
}  

void Set_temp_display(unsigned char Set_temp_view)
{
Written_char(0,9,(Set_temp_view/10));
Written_char(0,10,(Set_temp_view%10));
}


unsigned char Set_temp=40; 

void Key_scan(void)
{ 
 if(PIND.0==0) 
   {
   delay_ms(35);     //加
   if(PIND.0==0)
     {
     tone(200);       //报警
     Set_temp=Set_temp+1;
       if(Set_temp>70) Set_temp=0;
      }
   }
   
  if((PIND.1==0)&&(Set_temp>0)) 
    {
    delay_ms(35); 
    if(PIND.1==0)    //减
     {
     tone(200);        //报警
     Set_temp--;
       if(Set_temp<=0) Set_temp=0;
      }
    }
    
 if(PIND.2==0) 
   {
    delay_ms(35);
    if(PIND.2==0)
     { 
      tone(1500);       //报警
     //delay_stop();
      }
    }
      
 Set_temp_display(Set_temp);
}
 
void time_to_display(unsigned int Work_time)   //运行时间
{
Written_char(1,5,(Work_time/1000));
Written_char(1,6,(Work_time%1000/100));
Written_char(1,7,(Work_time%1000%100/10));
Written_char(1,8,(Work_time%1000%100%10));
}


unsigned char state_delay=0;

void Set_temp_compare(void)
{
  if((Set_temp+1)>Search_tab()&&(state_delay==0))
    { 
     delay_ms(100);  //防止继电器的抖动
     PORTB.7 =0;
     delay_ms(300);  //防止继电器的抖动
     state_delay=1;
     }
  else if((Set_temp+1)<=Search_tab()&&(state_delay==1))
    { 
     delay_ms(100);  //防止继电器的抖动
     PORTB.7 =1;
     delay_ms(300);  //防止继电器的抖动
     state_delay=0;
     }
}

void Display_juck(void)
{ 
if(PIND.0==0) 
 {
   delay_ms(30);      
   if(PIND.0==0)
     {
     start_3();       //显示设计者名字
     tone(200);       //报警
     delay_ms(1000);
      }
  }
}

void main(void)   //主函数
{
DDRA=0xFE;  
PORTA=0xFE;       //PORT初始化

DDRB=0xff; 
PORTB=0x10;

DDRC=0xff;
PORTC=0x00;        

DDRD=0xf8;       // PIND.0 PIND.1 PIND.2输入
PORTD=0xff;      //内部上拉无效 

Time_init();     //定时器初始化

Adc_init();      //ADC初始化

#asm("sei")      //使能全局中断

PORTB.3    =1;      //stand moudle,all output to gnd level
PORTB.3    =0;      //OPEN POWER FOR IC

PORTB.4=1;         //LCD's light open   

Lcd_inint();     //LCD ininteally

tone(400);       //报警
delay_ms(1000);
 
display_clear();

start_1();          //开机字幕1,"恒温控制器"
delay_ms(1000); 
//display_clear();  //清除LCD的所有显示

start_2();          //开机字幕2,"厦门顶尖电子"
delay_ms(1000);

Display_juck();
//delay_ms(2000);

display_clear();  //清除LCD的所有显示
start_display();  //固定LCD某些不变字符的显示
//delay_ms(1000);

while(1)          
 { 
 if(time_Adc_ok)    //ADC转换
  {
   time_Adc_ok=0;   
   display_temp();
  }
 if( time_1s_ok)    //计时器
    { 
     time_1s_ok=0;
     Seconds++;
     if(Seconds>=60) 
      {
       Seconds=0;
       Minuts++;
       }
     time_to_display(Minuts);
    }
 Key_scan();
 Set_temp_compare();
  }  
}

⌨️ 快捷键说明

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