利用左右循环_cror和_crol_实现led的循环。(按下k1led左移一位,按下K2led右移一位)

该博客介绍了如何使用51单片机和C语言,通过_cror_和_crol_位移函数实现LED灯的左移和右移。博主探讨了在按键检测和位移操作中遇到的问题,如按键抖动和位移方向错误,并提供了解决方案,通过延时函数解决了LED灯跳过现象。

/*功能:实现按下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
     循环后加了一个延时函数,程序的执行和想象中的一样了。
*/     

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值