共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |