黄金会员 
 
主题
回帖0
积分9861
阅读权限40
注册时间2009-11-11
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
///*2011/10/10*/// 
///*WOSS1001*/// 
#include<reg52.h> 
#define un8 unsigned char 
#define un16 unsigned int 
sbit e= P0^2; 
sbit rs=P0^3; 
un8 code TAB[]={"0123456789abcdef"}; 
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-65000)/256; 
  TL0=(65536-65000)%256; 
  TR0=1; 
  lcdinit(); 
       
        
  while(1) 
   { 
   lcdcom(0X80);//第1行第1位 
   if(255==COUTER) 
    { 
    COUTER=99; 
   } 
   if(100==COUTER) 
      { 
    COUTER=0; 
   } 
   //lcddata('n'); 
  
   lcddata(TAB[COUTER/10]); 
   lcddata(TAB[COUTER%10]); 
   
   
  } 
  //其他代码 
 } 
 
////*********每65MS扫描一次键盘*******************//// 
void Timer0_interrupt() interrupt 1 using 2  
 {  
     un8 row,col,value,temp,n; 
  TH0=(65536-65000)/256; 
  TL0=(65536-65000)%256; 
    
     P3=0x0f; 
  row=P3&0x0f; 
  row=row&0x0f; 
     if((row!=0x0f)&&(temp=0x0f)) 
   { 
   n++;                 //有按钮按下后N+1,65MS后再次检测按钮是否按着相当于按下消抖 
  } 
  else  
      { 
          n=0; 
       temp=row; 
         } 
  if(2==n)           //稳定后 
   { 
   P3=0xf0; 
      col=P3&0xf0; 
      col=col&0xf0; 
   if(col!=0xf0) 
    { 
       value=row|col; //键值 
    switch (value) 
     { 
            case 0x77:COUTER++; //只作示范,按自己需要修改 
              break; 
            case 0x7b:COUTER++; 
              break; 
            case 0x7d:COUTER++; 
              break; 
         case 0x7e:COUTER++; 
              break; 
          case 0xb7:COUTER++; 
              break; 
            case 0xbb:COUTER++; 
              break; 
         case 0xbd:COUTER++; 
              break; 
         case 0xbe:COUTER++; 
              break; 
            case 0xd7:COUTER--; 
              break; 
          case 0xdb:COUTER--; 
              break; 
          case 0xdd:COUTER--; 
              break; 
          case 0xde:COUTER--; 
              break; 
          case 0xe7:COUTER--; 
              break; 
          case 0xeb:COUTER--; 
              break; 
          case 0xed:COUTER--; 
              break; 
          case 0xee:COUTER--; 
              break; 
     default:   break; 
    } 
   temp=row; 
      } 
  }   
    
  } 
 
 
 
////***************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--); 
 } 
 
矩阵键盘.rar
(81.71 KB, 下载次数: 318)
 |   
 
 
 
 |