本帖最后由 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还是一样,不知为何?各位大哥帮帮忙,还有我这样写程序风格妥不妥?
|