两个按键移位的程序,实现起来却有不同 孰优孰劣
时间: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++);
}
}
程序一
#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个程序都有各自的用途不能用 那个更好来比较。
程序二中间?的地方为什么又重复一遍? 答: 这是软件消抖的常用方法。 二次采样判断
新手分析 ,赐教!
多谢指点。