高级会员 
 
主题
回帖0
积分2906
阅读权限30
注册时间2012-2-1
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
我看实例是4行扫描用4段重复代码,太浪费,我喜欢精简,改成了4循环,并且用反回值,方便引用键值。 
 
 
//============ 
#include<reg52.h> 
#define uint unsigned int 
#define uchar unsigned char 
//uchar code dig[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管0~F 码表 
uchar code dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0-F的码表 
sbit dula=P2^6; 
sbit wela=P2^7; 
sbit beep=P2^3; 
 
/*--------------------ms延时函数-----------------------*/ 
void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 11.0592MHz) 
{ 
 unsigned int i; 
 unsigned char j; 
 for(i=0;i<ms_number;i++) 
 { 
 for(j=0;j<200;j++); 
 for(j=0;j<102;j++); 
 }  
} 
uchar keyscan() 
{ 
 uchar p,k,i,key[]={0xfe,0xfd,0xfb,0xf7}; 
 for(i=0;i<4;i++) 
 { 
  P3=key[i]; 
  p=P3; 
     p&=0xf0; 
  if(p!=0xf0) 
  { 
   delay_ms(20); 
   p=P3; 
   p&=0xf0; 
   if(p!=0xf0) 
   { 
    switch(p)       
    { 
     case(0xe0): 
     k=0;   
     break; 
     case(0xd0): 
     k=1;   
     break; 
     case(0xb0): 
     k=2;   
     break; 
     case(0x70): 
     k=3;   
     break; 
    } 
    //beep=0; //按键声音 
    while(p!=0xf0)     //等待释放按键 
    { 
    p=P3; 
    p&=0xf0; 
    } 
    delay_ms(100); 
    //beep=1;  
    k+=4*i; 
    return k; 
   } 
  
  }  
 } 
 return 0xff; 
} 
 
void main() 
{ 
 uchar i,k; 
 P0=0xff; 
 wela=1; 
 wela=0; 
  for(i=0;i<16;i++) 
  { 
  P0=dig[i]; 
  dula=1; 
  dula=0; 
  delay_ms(500); 
  } 
  P0=dig[0]; 
  dula=1; 
  dula=0; 
  
  while(1) 
  { 
 k=keyscan(); 
 while(k==0xff)k=keyscan(); 
 P0=dig[k];  //数码管显示按键值。 
 dula=1; 
 dula=0; 
 } 
 
} |   
 
 
 
 |