利用C51自带的库函数_crol_和_cror_来实现向左和向右流水的问题

P3.0~P3.2接3个按键,P1口接8个发光二极管。现要求编程实现:
(1)按下K1,8个二级管亮灭交替,间隔时间为100ms;
(2)按下K2,发光二级管从左向右流动,间隔时间为200ms;
(3)按下K3,发光二级管从右向左流动,间隔时间为200ms。

这是我写的单片机代码,只是实现了K1的循环亮灭交替,K2和K3实现不了,不知函数_crol_和_cror_是否正确使用,希望大家可以指点我改进代码。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit LED=P1;
static bit flag=0;
static bit kp=0;
    
void delayms(uchar ms)
    {
        uchar i;
        while(ms--)
            for(i=0;i<123;i++);
    }
    
uchar key_scan(void)
    {
        static bit kp=0;
        if((P3&0x07)!=0x07)
            {
                delayms(10);
                if(((P3&0x07)!=0x07)&&(kp==0))
                    {
                        kp=1;
                        if((P3&0x07)==0x06)return 1;
                        if((P3&0x07)==0x05)return 2;
                        if((P3&0x07)==0x03)return 3;
                    }
            }
                    else kp=0;
            return 0;
    }
    
void main(void)
    {
        uchar key_val;
        while(1)
            {
                key_val=key_scan();
                if(key_val==1)
                    {
                        do
                            {
                                P1=~P1;
                                delayms(100);
                            }
                            while(1);
                        }    
                if(key_val==2)
                    {
                        LED=0xfe;
                        P1=LED;
                        delayms(200);
                        while(1)
                        {
                            delayms(200);
                            LED=_crol_(LED,1);
                            //P1=((P1<<1)|(P1>>7));
                        }
                    }
                    if(key_val==3)
                    {
                        LED=0xfe;
                        P1=LED;
                        delayms(200);
                        while(1)
                        {
                            delayms(200);    
                            LED=_cror_(LED,1);
                            //P1=((P1<<7)|(P1>>1));
                        }
                    }
                }
            }

1,你这种左右移动肯定有问题的。举个例子。0100<<1为1000。那么1000<<1为0000。而0000<<1依旧是0000。
2,你按键消抖建议延时20ms,因为根据按键不同,抖动时间不同。但一般是5-20ms。所以我建议延时20ms而不是10ms