程序中:1、当key不赋值时,当有按键按下,函数的返回值能发生变化,
2、当key=0时,当有按键按下,函数的返回值一值为key=0x00,一值不会改变
为什么会这样,大师求解啊。
/**本程序:在主函数中利用定时器循环次数来实现独立按键的检测***/
#include<reg52.h>
#include"button.h"
uint keyzeroflag,keyoneflag,keytwoflag,keythreeflag;//按键启动标志位
uint key0counttime,key1counttime,key2counttime,key3counttime ; //按键延时计数位
/*****************键盘扫描***********************/
uchar scan()
{
uchar keyzerolock,keyonelock,keytwolock,keythreelock; //按键1、2、3、4自锁标志位
uchar key=0;
/***************第一个按键********************/
if(key0==1) //按键没有按下
{
key0counttime=0; //按键延时计数器清0
keyzerolock=0; //自锁标志位清0
keyzeroflag=0; //停止按键启动
}
else if(keyzerolock==0) //按键按下
{
keyzeroflag=1; //启动计数器
if(key0counttime>counttime) // 延时计数值大于设置的时间,执行以下的程序
{
key0counttime=0; //延时计数器清0
keyzeroflag=0; //停止按键计数
keyzerolock=1; //自锁按键置位1,被免一直在触发状态
key=0xff; //触发1号键
led0=~led0;
beep=0;
}
}
/********************第二个按键**********************************/
if(key1==1) //按键没有按下
{
key1counttime=0; //按键延时计数清0
keyonelock=0; //自锁标志位清0
keyoneflag=0; //停止延时计数
}
else if(keyonelock==0) //按键按下
{
keyoneflag=1; //启动延时计数器
if(key1counttime>counttime) //
{
key1counttime=0; //延时计数清0
keyoneflag=0; //停止按键计数
keyonelock=1; //自锁按键置位,被免一直在触发状态
key=0x01; //触发1号键
led1=~led1;
}
}
/************************第3个按键**************************/
if(key2==1) //按键没有按下
{
key2counttime=0; //按键延时清0
keytwolock=0; //自锁标志位清0
keytwoflag=0; //按键标志清0
}
else if(keytwolock==0) //按键按下
{
keytwoflag=1; //允许中断按键计数
if(key2counttime>counttime) //
{
key2counttime=0;
keytwoflag=0; //停止按键计数
keytwolock=1; //自锁按键置位,被免一直在触发状态
key=0x02; //触发1号键
led2=~led2;
}
}
/*********************第4个按键**************************/
if(key3==1) //按键没有按下
{
key3counttime=0; //按键延时清0
keythreelock=0; //自锁标志位清0
keythreeflag=0; //按键标志清0
}
else if(keythreelock==0) //按键按下
{
keythreeflag=1; //允许中断按键计数
if(key3counttime>counttime) //
{
key3counttime=0;
keythreeflag=0; //停止按键计数
keythreelock=1; //自锁按键置位,被免一直在触发状态
key=0x03; //触发1号键
led3=~led3;
}
}
return key;
}
/***********************定时器0初始化****************************/
void time0_init()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TR0=1;
}
/*******************定时器0中断服务函数***********************/
void time0_fw()interrupt 1
{
TF0=0;
TR0=0;
/***************按键计数标志位1**********************************/
if(keyzeroflag==1) //启动计数器
{
if(key0counttime<0xffff) //防止计数超了范围
{
key0counttime++; //计数自加
}
}
/***************按键计数标志位2**********************************/
if(keyoneflag==1) //启动计数器
{
if(key1counttime<0xffff) //防止计数超了范围
{
key1counttime++; //计数自加
}
}
/***************按键计数标志位3**********************************/
if(keytwoflag==1) //启动计数器
{
if(key2counttime<0xffff) //防止计数超了范围
{
key2counttime++; //计数自加
}
}
/***************按键计数标志位4**********************************/
if(keythreeflag==1) //启动计数器
{
if(key3counttime<0xffff) //防止计数超了范围
{
key3counttime++; //计数自加
}
}
TH0=(65536-2000)/256;// 重装定时值
TL0=(65536-2000)%256;
TR0=1; //启动定时器
}
|