打印

变量的赋值问题

[复制链接]
855|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abc1724|  楼主 | 2015-1-14 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序中: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;                                  //启动定时器
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

29

帖子

1

粉丝