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

📄 仿进口温控器的按键程序.txt

📁 说明:这个程序与温控仪设置方式一样。SET选择设置模式;LEFT键选择需要设置的位;UP键加置数
💻 TXT
字号:
程序主要代码如下:(只涉及按键部分,其它略) 

#include <iom8535v.h> 
#include <macros.h> 
#include <eeprom.h> 

#define uchar unsigned char 
#define uint unsigned int 

uchar n=0; 
uchar set=0; 
uchar left=0;                // set、left是为了判断模式设定及左移 
uchar disp_flash=0; 
uint num_set1=0;               // 设置上升测试计数值 
uint num_set2=0;               // 设置下降测试计数值 
uint disp_count=0;               // 显示测试计数值 
uchar write_flag=0; 

uchar INT0_flag=0; 

uint delay_k; 
uchar delay_i=0,delay_j=0; 

uchar *disp; 

uchar disp_small1[4]={1,1,1,10};    // 10 显示加号 
uchar disp_small2[4]={2,2,2,11};    // 11显示减号 
uchar big_buf[4]={0,0,0,0}; 
uchar small_buf[4]={0,0,0,0}; 

const uchar disp_table[]= 
              {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x1c,0x54};  
const uchar calc[3]={1,10,100};             

#pragma interrupt_handler timer1_ovf_isr:9 

void port_init(void); 
void timer1_init(void); 
void init_devices(void); 
void display(void); 
void init_data(void); 


void port_init(void) 
{ 
 PORTA = 0x00; 
 DDRA  = 0xFF; 
 PORTB = 0x0F; 
 DDRB  = 0x70; 
 PORTC = 0xF0;  
 DDRC  = 0x0F; 
 PORTD = 0x04; 
 DDRD  = 0x00; 
} 

//TIMER1 initialize - prescale:64 
// WGM: 0) Normal, TOP=0xFFFF 
// desired value: 10mSec 
// actual value: 10.000mSec (0.0%) 
void timer1_init(void) 
{ 
 TCCR1B = 0x00; //stop 
 TCNT1H = 0xFB; //setup 
 TCNT1L = 0x1E; 
 OCR1AH = 0x97; 
 OCR1AL = 0x5E; 
 OCR1BH = 0x97; 
 OCR1BL = 0x5E; 
 ICR1H  = 0x97; 
 ICR1L  = 0x5E; 
 TCCR1A = 0x00; 
 TCCR1B = 0x03; //start Timer 
} 

void timer1_ovf_isr(void) 
{  
 uint temp1; 
 uchar i,j; 
 //TIMER1 has overflowed 
 TCNT1H = 0xFB; //reload counter high value 
 TCNT1L = 0x1E; //reload counter low value 
//................... 
//................... 
/*****************处理设定按键************************/ 
 n++; 
 if(n>=20)n=0; 
 if((PINC&0xF0)!=0xF0)           // 如果PB口有键按下 
 {    
   if(n==2)        // 延迟一个中断周期(10ms),用作键消抖 
    {               //  进入具体判断按键语句范围 
      if((PINC|0xEF)==0xEF)           // SET键按下 
     {   set++;left=0;if(set>4)set=1;             

     if(set==1){for(i=0;i<4;i++)small_buf[i]=disp_small1[i];}                   
     else if(set==2) 
     { for(i=0;i<4;i++)small_buf[i]=disp_small2[i];} 
     else if(set==3){for(i=0;i<4;i++){big_buf[i]=0;small_buf[i]=disp_small1[i];}big_buf[3]=10;write_flag=1;} 
     else if(set==4){for(i=0;i<4;i++)big_buf[i]=small_buf[i]=disp_small2[i];write_flag=1;} 
     } 
      if((PINC|0xDF)==0xDF)left++;   // LEFT 键按下 
      if(left>=3)left=0;              
          
      if((PINC|0xBF)==0xBF)        // UP键按下 
      {                                              
          if(set==1) 
       {   
          num_set1+=calc[left]; if(num_set1>999)num_set1=999;          
          disp_small1[0]=small_buf[0]=(num_set1%10);    // 实时将计数值分解用于LED显示 
         temp1=num_set1/10; 
            disp_small1[1]=small_buf[1]=temp1%10; 
            disp_small1[2]=small_buf[2]=temp1/10; 
       } 
       else if(set==2) 
       {          
          num_set2+=calc[left]; if(num_set2>999)num_set2=999;          
          disp_small2[0]=small_buf[0]=(num_set2%10);    // 实时将计数值分解用于LED显示 
         temp1=num_set2/10; 
            disp_small2[1]=small_buf[1]=temp1%10; 
            disp_small2[2]=small_buf[2]=temp1/10;    
       }                                                
      } 
       
      if((PINC|0x7F)==0x7F)          // DOWN键按下 
      {                                     
        if(set==1) 
       {   
          num_set1-=calc[left];if(num_set1>999)num_set1=0; 
         disp_small1[0]=small_buf[0]=(num_set1%10);    // 实时将计数值分解用于LED显示 
         temp1=num_set1/10; 
            disp_small1[1]=small_buf[1]=temp1%10; 
            disp_small1[2]=small_buf[2]=temp1/10;             
       } 
       else if(set==2) 
       {  
         num_set2-=calc[left];if(num_set2>999)num_set2=0;        
         disp_small2[0]=small_buf[0]=(num_set2%10);    // 实时将计数值分解用于LED显示 
         temp1=num_set2/10; 
           disp_small2[1]=small_buf[1]=temp1%10; 
           disp_small2[2]=small_buf[2]=temp1/10;    
       }                                    
      } 
                    
      /*************设定按键处理完毕***********************************/          
      if(set==3) 
        disp_count=0; 
      else if(set==4) 
        disp_count=num_set2; 
   }       
  } 
//................... 
//................... 
//call this routine to initialize all peripherals 
void init_devices(void) 
{ 
 //stop errant interrupts until set up 
 CLI(); //disable all interrupts 
 port_init(); 
 timer1_init(); 

 MCUCR = 0x00; 
 GICR  = 0x40; // 使用外部中断IN0 
 TIMSK = 0x04; //timer interrupt sources 
 SEI(); //re-enable interrupts 
 //all peripherals are now initialized 
} 

void init_data()    //  开机时读出存入EEPROM的数用于显示 
{ 
  uchar i; 
  CLI(); 
  for(i=0;i<4;i++) 
    disp_small1[i]=EEPROMread(i); 
  for(i=4;i<8;i++) 
    disp_small2[i-4]=EEPROMread(i); 
  SEI(); 
  disp_small1[3]=10; 
  disp_small2[3]=11;   
  set=3; 
  for(i=0;i<4;i++) 
    small_buf[i]=disp_small1[i]; 
  big_buf[3]=10; 
  /*转换为数值用于设置过程中的加减计算*/ 
  num_set1=(disp_small1[2]*100)+(disp_small1[1]*10)+disp_small1[0]; 
  num_set2=(disp_small2[2]*100)+(disp_small2[1]*10)+disp_small2[0]; 
} 
void display(void) 
{ 
  uchar i,j; 
  uchar disp_buf[8]; 
   
  disp_flash++; 
  if(disp_flash>200)disp_flash=0; 
   
  for(i=0;i<8;i++) 
  {    
   PORTA=0x00; 
   PORTC&=0xF8; 
   PORTC|=i;   
   if(i<4) 
   { 
    disp_buf[i]=big_buf[i]; 
   for(j=0;j<10;j++)  
      PORTA=disp_table[disp_buf[i]]; 
   } 
   else 
   { 
    disp_buf[i]=small_buf[i-4]; 
   if((set==0)||(set==3)||(set==4)) 
     { for(j=0;j<10;j++)  
       PORTA=disp_table[disp_buf[i]]; 
   } 
   else  
   {  
       if(i==left+4) 
      for(j=0;j<10;j++) 
        PORTA=disp_table[disp_buf[i]]; 
      else if((disp_flash%5)==0) 
      for(j=0;j<10;j++) 
       PORTA=disp_table[disp_buf[i]];     
   }    
   }         
  }    
} 
/*-----------------主程序--------------------*/ 
void main(void) 
{  
 uchar i; 

 init_devices();  
 init_data(); 
 delay_k=0; 
 for(;;) 
 { 
  display(); 
  if(write_flag==1) 
  { 
    if((set==3)||(set==4))        // 进行了设置并且进入工作状态才允许写EEPROM 
   {                             // 这是因为写EEPROM需要很长的时间       
     CLI();                      // 禁止中断,保证写EEPROM不被干扰 
     for(i=0;i<4;i++) 
       EEPROMwrite(i,disp_small1[i]); 
     for(i=4;i<8;i++) 
       EEPROMwrite(i,disp_small2[i-4]); 
   } 
   write_flag=0;    // 数据保存后清除“写标志” 
   SEI();           // 写完后开中断 
  }     
 } 
}  

⌨️ 快捷键说明

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