导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→初学者:感谢各位的帮助,我的学C51后的第一个小程序出来了,

* 7798: 初学者:感谢各位的帮助,我的学C51后的第一个小程序出来了,贴出来,大家帮我看看还有什么可以改进的地方。

   红蚂蚁 
红蚂蚁发表的帖子 

 初学者:感谢各位的帮助,我的学C51后的第一个小程序出来了,贴出来,大家帮我看看还有什么可以改进的地方。
/*p1.0~p1.3 接按键,低电平有效,防抖40ms。按一次亮,再按一次灭。
  四个键不可同时按下。按一个键超过30s,开始闪烁,直到松开为止。
  p2.0~p2.3 接led, 低电平有效
  p3.7      工作灯,低电平有效。周期0.4s
  key 为键值积存器
  _tt1为防抖使用时间积存器
  _tt2为工作灯使用时间积存器
  _tt3为3秒后闪烁计数器
  p1reg为p1口上次值积存器
  
*/


#include <reg51.h>

unsigned char key=0xff;
unsigned int _tt1=0;
unsigned char _tt2=0;
unsigned char _tt3=0;
unsigned char p1reg=0xff;  

sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;

sbit p37=P3^7;

/*TO中断服务子程序 */

void  timer0(void) interrupt 1 using 2
{   
   TH0=-2000/256;
   TL0=-2000%256;
   _tt2++;
   _tt3++;
   if((P1^p1reg)&&(P1!=0xff))  /*下降沿*/ 
     {  
        _tt1++;
        key=P1;
        key=~key;
            if(_tt1>10000)
               {  _tt1=10000;                
                  if((P1^p1reg)&&(P1!=0xff))                  
                   { if (_tt3>50)
                    { switch(key)
                      {   case 1:p20=!p20;break;
                          case 2:p21=!p21;break; 
                          case 4:p22=!p22;break;
                          case 8:p23=!p23;break;
                          default :break;
                      }
                      _tt3=0;
                    } 
                   }                  
                    
               }
               
            else if(_tt1==20)   
                 { _tt1=20;
                   switch(key)
                   { case 1:p20=!p20;break;
                     case 2:p21=!p21;break; 
                     case 4:p22=!p22;break;
                     case 8:p23=!p23;break;
                     default :break;
                   }
                                        
                 }                           
     }
    else _tt1=0;
    if (P1==0xff) p1reg=P1;
}

/*T0中断设置  2ms*/
void sett0()

  TH0=-2000/256;
  TL0=-2000%256;
  TMOD=0x01;  /*T0方式1*/ 
  EA=1;
  ET0=1;  
  TR0=1;      /*启动订时器T0*/
}  

/*指示灯子程序*/
void led()

 
  if(_tt2>100) 
       { p37=!p37;
         _tt2=0;         
       }
  
}


/* 调用子程序*/
void main()

   P1=0xff;
   P2=0xff;
   p37=1 ;
   sett0();
   while(1) led();
}

   

发表时间:2002年5月24日12:57:00

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:C51编程:am29lv160db芯片烧写/擦除判断位d7不够可靠?! 我现在正在用am29
[下一篇帖子]:铂热电阻