共2条
1/1 1 跳转至页
问
硬件电路描述如下:89S52 单片机的P1 口接有8 个LED,当某一端口输出为“0”时,相应的LED 点亮,P3.2、P3.3、P3.4、P3.5 分别接有四个按钮K1~K4,按下按钮时,相应引脚被接地。现要求编写可键控的流水灯程序,当K1 按下时,开始流动,K2 按下时停止流动,全部灯灭,K3 使灯由上往下流动,K4 使灯由下往上流动。
键控流水灯的程序
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
void mDelay(unsigned int DelayTime)
{ unsigned int j=0;
for(;DelayTime>0;DelayTime--)
{ for(j=0;j<125;j++)
{;} }}
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c;
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
mDelay(10);
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
else
{ for(;;){ tmp=P3;
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
void main()
{ unsigned char OutData=0xfe;
bit UpDown=0;
bit Start=0;
uchar KValue;
for(;;)
{ KValue=Key();
switch (KValue)
{ case 0xfb: //P3.2=0,Start
{ Start=1;
break; }
case 0xf7: //P3.3=0,Stop
{ Start=0;
break; }
case 0xef: //P3.4=0 Up
{ UpDown=1;
break; }
case 0xdf: //P3.5=0 Down
{ UpDown=0;
break; }
}
if(Start)
{ if(UpDown)
OutData=_crol_(OutData,1);
else
OutData=_cror_(OutData,1); P1=OutData;
}
else
P1=0xff;
mDelay(1000);
}
}
其中下面这段程序看不太懂,哪位大哥(大姐)能否帮小弟解释一下?!最好能注释每个语句的功能。
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c;
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
mDelay(10);
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
else
{ for(;;){ tmp=P3;
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
答 1: 是不是写重了?这是我在网上下载的一个程序,是不是下面这段程序重复了?
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
答 2: 这段程序主要是为了消抖 答 3: 这是一个按 键功能的小程序吧这是一个按键功能的小程序吧。 答 4: 关于程序的解释,只是个人见解uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c; //将4个按键口置为1
KeyV=P3; //扫描按键
if((KeyV|0xc3)==0xff) //如果按键没有变化,各口值为1,即0xff,返回0.
return(0); //否则表示有按键按下
mDelay(10); //延时程序,用于软件消抖
KeyV=P3; //再次读取按键状态
if((KeyV|0xc3)==0xff)
return(0);
else //表明有按键按下
{ for(;;){ tmp=P3; //再次读取按键状态,用于消抖,个人感觉没有必要.
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
答 5: 感谢回复谢谢各位大虾指教,小弟不胜感激!!!!1 答 6: 10ms消抖不太可靠,我一般20ms
键控流水灯的程序
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
void mDelay(unsigned int DelayTime)
{ unsigned int j=0;
for(;DelayTime>0;DelayTime--)
{ for(j=0;j<125;j++)
{;} }}
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c;
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
mDelay(10);
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
else
{ for(;;){ tmp=P3;
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
void main()
{ unsigned char OutData=0xfe;
bit UpDown=0;
bit Start=0;
uchar KValue;
for(;;)
{ KValue=Key();
switch (KValue)
{ case 0xfb: //P3.2=0,Start
{ Start=1;
break; }
case 0xf7: //P3.3=0,Stop
{ Start=0;
break; }
case 0xef: //P3.4=0 Up
{ UpDown=1;
break; }
case 0xdf: //P3.5=0 Down
{ UpDown=0;
break; }
}
if(Start)
{ if(UpDown)
OutData=_crol_(OutData,1);
else
OutData=_cror_(OutData,1); P1=OutData;
}
else
P1=0xff;
mDelay(1000);
}
}
其中下面这段程序看不太懂,哪位大哥(大姐)能否帮小弟解释一下?!最好能注释每个语句的功能。
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c;
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
mDelay(10);
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
else
{ for(;;){ tmp=P3;
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
答 1: 是不是写重了?这是我在网上下载的一个程序,是不是下面这段程序重复了?
KeyV=P3;
if((KeyV|0xc3)==0xff)
return(0);
答 2: 这段程序主要是为了消抖 答 3: 这是一个按 键功能的小程序吧这是一个按键功能的小程序吧。 答 4: 关于程序的解释,只是个人见解uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c; //将4个按键口置为1
KeyV=P3; //扫描按键
if((KeyV|0xc3)==0xff) //如果按键没有变化,各口值为1,即0xff,返回0.
return(0); //否则表示有按键按下
mDelay(10); //延时程序,用于软件消抖
KeyV=P3; //再次读取按键状态
if((KeyV|0xc3)==0xff)
return(0);
else //表明有按键按下
{ for(;;){ tmp=P3; //再次读取按键状态,用于消抖,个人感觉没有必要.
if((tmp|0xc3)==0xff)
break;}
return(KeyV);}}
答 5: 感谢回复谢谢各位大虾指教,小弟不胜感激!!!!1 答 6: 10ms消抖不太可靠,我一般20ms
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |