微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 两个按键移位的程序,实现起来却有不同 孰优孰劣

两个按键移位的程序,实现起来却有不同 孰优孰劣

时间:10-02 整理:3721RD 点击:
程序一只要按着不放 LED灯会一直移位 程序2则按一下只移动一位 原因在哪里 两个程序哪个更好?程序二中间?的地方为什么又重复一遍,大侠指点
程序一
#include<reg51.h>
#include<intrins.h>
sbit K1=P0^0; sbit K2=P0^1;
void delay(unsigned int i);
main()
{
   unsigned char LED;
   LED=0xfe;
   P2=LED;
   while(1)
   {
     if(K1==0)
  {
   if(P2==0x7f)
   {
    LED=0xfe;
    P2=LED;
    delay(300);
   }
   else
  {
   LED=LED << 1;
   LED=LED | 0x01;
   P2=LED;
   delay(250);
   }
   }
   if(K2==0)
   {
    if(P2==0xfe)
    {
     LED=0x7f;
  P2=LED;
  delay(300);
    }
    else
   {
   LED=LED>>1;
   LED=LED | 0x80;
   P2=LED;
   delay(250);
   }
   }
   }
}
   /*******延时函数*************/
void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)
        for(j = 255; j > 0; j--);
}
程序二
#include <reg51.h>
#include <intrins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit K1 = P0^0; //对应按钮K1
sbit K2 = P0^1; //对应按钮K2
main()
{
unsigned char key_s,key_v;
key_v = 0x03;
P2 = 0xfe;
while(1)
{
  key_s = scan_key();
  if(key_s != key_v)//等于时都K1K2都没按下  都按下为0x00  
  {
   delayms(10);
   key_s = scan_key();//?
   if(key_s != key_v)  //?
   {
    key_v = key_s;
    proc_key(key_v);     
   }
  }
}
}
unsigned char scan_key() //这个子函数的功能是什么 ? 检验按键情况 0x01 为K2按下 0x10 为K1按下
{
unsigned char key_s;
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return key_s;  
}
void proc_key(unsigned char key_v) // 这个子函数作用是根据按键选择移位。
{
if((key_v & 0x01) == 0)  //K1按下 右移
{
  P2 = _cror_(P2,1);
}
else if((key_v & 0x02) == 0)  // K2 按下左移
{
  P2 = _crol_(P2, 1);
}
}
void delayms(unsigned char ms)  // 延时子程序
{      
unsigned char i;
while(ms--)
{
  for(i = 0; i < 120; i++);
}
}

程序一只要按着不放 LED灯会一直移位 程序2则按一下只移动一位 原因在哪里  答:在程序一中,
     if(K1==0)
  {
   if(P2==0x7f)
   {
    LED=0xfe;
    P2=LED;
    delay(300);
   }    如果按键按下将P2口  0111 1111 重新赋予初值 1111 1110 让其重新依次点亮8个 然后重复重新赋予初值。

两个程序哪个更好?  答;2个程序都有各自的用途不能用 那个更好来比较。
程序二中间?的地方为什么又重复一遍?  答:   这是软件消抖的常用方法。 二次采样判断

新手分析 ,赐教!

多谢指点。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top