黄金会员 
 
主题
回帖0
积分9861
阅读权限40
注册时间2009-11-11
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
#include<reg52.h> 
#define un8 unsigned char 
#define un16 unsigned int 
sbit Press_key = P2^0;//按键的I/O  
sbit Press_key1 = P3^4; 
un8 bdata Control_Port;     // 声明一个可位寻址的字节变量 
sbit     new_value = Control_Port^1;   // 引用该字节变量的某一位 
sbit     old_value = Control_Port^2; 
sbit     new_value1 = Control_Port^3;   // 引用该字节变量的某一位 
sbit     old_value1 = Control_Port^4; 
sbit led=P1^0; 
sbit e= P0^2; 
sbit rs=P0^3; 
un8 code TAB[]={"0123456789"}; 
void lcdinit();    //1602初始化 
void lcdcom(un8 com); //1602写指令 
void lcddata(un8 dat); //1602写数据 
void Delay(un8 xms);   
void Delay1(un16 xus); 
un8 COUTER=0; 
////*********************//// 
main() 
 { 
    
  EA=1; 
  ET0=1; 
  TMOD|=0X01; 
  TH0=(65536-60536)/256; 
  TL0=(65536-60536)%256; 
  TR0=1; 
  //old_value=1; 
 // old_value1=1; 
  lcdinit(); 
      //lcdcom(0X82);//第1行第3位 
      
  while(1) 
   { 
   lcdcom(0X80);//第1行第3位 
  
   lcddata('n'); 
   lcddata(TAB[COUTER/10]); 
   lcddata(TAB[COUTER%10]); 
  } 
  //其他代码 
 } 
/*void P_key() //按下后松开有效 
 {  
    
     new_value =Press_key;  
     if(new_value && !old_value)//识别按键。  
  {  
           
         led=~led;                   
    
  }  
     old_value = new_value;  
 } */ 
////**************************************//// 
void Timer0_interrupt() interrupt 1 using 2  
 {  
     un8    ban,can; 
  TH0=(65536-65500)/256; 
  TL0=(65536-65500)%256; 
  
////////////////////////////////////////////////////   
  new_value =Press_key;  
     if(!new_value && old_value)//识别按键。(按下即有效)  
  {  
           
         COUTER++; 
   if(100==COUTER)  
    { 
    COUTER=0; 
   }                  
    
  }  
     old_value = new_value;  
   
//短按减1,长按按下后先减1,按下超过25X65.5MS后每4x65.5MS减1//                           
     new_value1 =Press_key1;  
     if(!new_value1 && old_value1)//短按立即有效.  
  {  
         COUTER--; 
   can=0; 
   if(255==COUTER) 
    { 
       COUTER=99; 
   } 
     
        } 
  if(!new_value1&&!old_value1)  //按下未松开则每65,5MS can+1 
     { 
   can++; 
   if(can>25) 
    { 
    ban++; 
    if(4==ban) 
     { 
       ban=0; 
    COUTER--; 
    if(255==COUTER) 
      { 
         COUTER=99; 
     } 
    } 
    } 
   } 
   
 old_value1 = new_value1; 
     
 } 
  
////***************Lcd初始化****************************//// 
void lcdinit() 
 { 
  Delay(15); 
   lcdcom(0x33); 
    Delay(5) ; 
     lcdcom(0x32); 
      Delay(2); 
    lcdcom(0x2); //4线模式  
        Delay(1); 
   lcdcom(0x06); //地址增量1,字符不动 
          lcdcom(0x0C); //显示开,光标关,光标不闪 
              lcdcom(0x28);  
      lcdcom(0x01); //清屏 
       Delay(5); 
        lcdcom(0x02); //光标复位 
      
 } 
////*********LCD写指令***********///// 
void lcdcom(un8 com) 
 { 
 //un8 temp; 
 // temp=com; 
   P0=com|0x0f; //不需要前面两条,因为COM的值未变 
    rs=0; 
      Delay1(2); 
       e=1; 
        Delay1(2); 
         e=0;  
     
 //com=temp; 
  P0=(com<<4)|0x0f; 
   rs=0; 
     Delay1(2); 
      e=1; 
       Delay1(2); 
        e=0; 
    } 
////*****************LCD写数据**************//// 
void lcddata(un8 dat) 
 { 
// un8 temp1; 
// temp1=dat; 
 P0=dat|0x0f; 
    rs=1; 
 Delay1(2); 
 e=1; 
 Delay1(2); 
 e=0;  
// dat=temp1; 
 P0=(dat<<4)|0x0f; 
    rs=1; 
 Delay1(2); 
 e=1; 
 Delay1(2); 
 e=0; 
 } 
////************************//// 
void Delay(un8 xms) 
 { 
 un8 i,j; 
 for(i=xms;i>0;i--) 
    for(j=120;j>0;j--); 
 }   
////**********************////    
 void Delay1(un16 xus) 
 { 
 un16 i,j; 
 for(i=xus;i>0;i--) 
    for(j=25;j>0;j--); 
 } 
 
key1好.rar
(53.53 KB, 下载次数: 492)
 |   
 
 
 
 |