本帖最后由 szliychlw 于 2010-12-21 22:44 编辑  
 
#include<iom16v.h> 
#include<macros.h> 
 
#define uchar unsigned char 
#define uint  unsigned int 
 
#include"DELAY.C"  //延时函数文件 
#include"LED.C" //LED显示值函数文件 
 
uchar flag=0; 
uchar keydata=0; 
/******************************************************************** 
按键是否存在的扫描函数,按键时为低电平有效 
*******************************************************************/ 
KeyScan() 
{ 
  uchar key; 
  key=PINC; //从PC口读取按键 
  if(!(key&0X40))   //有按键按下 
  { 
    Delayms(80);//延时10 MS,去抖动 
        key=PINC; 
        if(!(key&0X40)) 
         { 
           flag=1; 
          } 
        else 
     { 
       flag=0; 
     } 
   } 
   else 
   { 
     flag=0; 
    } 
  return flag; 
} 
/********************************************************************* 
键值取得函数 
**********************************************************************/ 
KeyGet() 
{ 
     
        if(KeyScan()) 
        { 
          keydata++;    //单键累加,每按一次累加1 
          if(keydata==8)//键值累加到8归零 
          keydata=0; 
         } 
        return keydata; 
  } 
/********************************************************************** 
  主函数 
***********************************************************************/ 
void main() 
{ 
   uchar buffer[]={0,0,0,0}; 
   uchar keyv; 
   DDRC|=(1<<PC6); 
   PORTC|=(1<<PC6); //PC6带上拉 
   DDRC&=(~(1<<PC6)); //配置PC6为键输入口 
   while(1) 
   { 
   keyv=KeyGet();//获取键值 
   switch(keyv) 
   { 
     case 0: buffer[0]=0;break;  //根据键值累加值送显示 
     case 1: buffer[0]=1;break; 
     case 2: buffer[0]=2;break; 
     case 3: buffer[0]=3;break; 
     case 4: buffer[0]=4;break; 
     case 5: buffer[0]=5;break; 
     case 6: buffer[0]=6;break; 
     case 7: buffer[0]=7;break; 
         default:break; 
         } 
          
         LEDdispayer(buffer);//显示 
         Delayms(100); 
        } 
} 
 
 
//以上是简单的单键累加程序,按键低电平有效。如果我选用的是PC6,按键一次LED显示累加1,但是如果我选用PC5,LED的值一直在累加跳动,根本就不用按键,说明PC5一直处于低电平。换了一个M16 IC还是一样,不知为何?各位大哥帮帮忙,还有我这样写程序风格妥不妥?
 |