/*功能:实现按下K1按键led灯左移,按下K2键led灯右移。
时间:2023年8月15日19:07:45
看了江科的视频用的方式是自加自减形式的,但是在单片机中有位移用的函数_cror_和_crol_右移和左移函数个人感觉会比较容易,不用去想一下加减法*/
#include<regx52.h>
#include<intrins.h>
#define led P2 //使用宏定义,将P2口定义为led
void delay(xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{ int i;
led=0xfe; //1111 1110
while(1)
{
if(P3_1==0) //实现led左移,虽然是右移函数库,看下面的注释,二进制低电位右移,led灯左移。
{
delay(20);
while(P3_1==0);
delay(20); //加个延时函数,不然在松开的时候抖动,程序可能误判按键下了两次甚至多次,出现跳过一个led灯的现象。
led=_cror_(led,1);
}
if(P3_0==0)//判断k2是否按下
{
delay(20);
while(P3_0==0);//判断k2是否松开
delay(20);//加个延时函数,不然在松开的时候抖动,程序可能误判按键下了两次甚至多次,出现跳过一个led灯的现象。
led=_crol_(led,1);//此函数虽然实现了led的右移,但是有时会跳过一个led灯。同时影响到了上面led的左移函数。
}
}
}
/*通过对位移按键的测试,发现右移和实验现象相反。具体如下
1111 1110,0111 1111, 1011 1111,1101 1111,1110 1111, 1111 0111, 1111 1011, 1111 1101,1111 1110下面对应相应的P2口
P2_0, P2_7 P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
这也似乎明确了,问什么有时会会跳过一个led灯,直接亮下一个。
加了第二个if判断语句,led的实验结果不是想象中的,造成不管K1还是k2按下,都会偶然出现跳过一个led灯的现象。然后再while
循环后加了一个延时函数,程序的执行和想象中的一样了。
*/
该博客介绍了如何使用51单片机和C语言,通过_cror_和_crol_位移函数实现LED灯的左移和右移。博主探讨了在按键检测和位移操作中遇到的问题,如按键抖动和位移方向错误,并提供了解决方案,通过延时函数解决了LED灯跳过现象。
&spm=1001.2101.3001.5002&articleId=132308178&d=1&t=3&u=c26e606dafd74b059b2a964ea2463812)
1872

被折叠的 条评论
为什么被折叠?



