数码管移位显示代码。。

51单片机数码管左移循环显示1-8的代码怎么写啊


/*
实验说明:
    
实验接线:
    动态数码管模块-->单片机管脚
    参考动态数码管实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
    矩阵按键模块-->单片机管脚
    参考矩阵按键实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
实验现象:
    按下矩阵按键在数码管上逐个显示对应的键值,键值如下:
    S1-S4:0-3
    S4-S8:4-7
    S9-S12:8-B
    S13-S16:C-F
*/
#include<reg51.h>

#define GPIO_DIG P0
#define GPIO_KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char KeyValue;
//用来存放读取到的键值
unsigned char KeyState;    //记录按键的状态,0没有,1有
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
void Delay10ms();   //延时10ms
void KeyDown();         //检测按键函数
void DigDisplay(); //动态显示函数
/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
    KeyState=0;
    while(1)
    {
        KeyDown();
         if(KeyState==1)
        {
            DisplayData[7]=DisplayData[6];
            DisplayData[6]=DisplayData[5];
            DisplayData[5]=DisplayData[4];
            DisplayData[4]=DisplayData[3];
            DisplayData[3]=DisplayData[2];
            DisplayData[2]=DisplayData[1];
            DisplayData[1]=DisplayData[0];
            DisplayData[0]=DIG_CODE[KeyValue];
            
            KeyState=0;
        }
        DigDisplay();
    }                
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能           : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位    
        }
        GPIO_DIG=DisplayData[i];//发送段码
        j=10;                         //扫描间隔时间设定
        while(j--);    
        GPIO_DIG=0x00;//消隐
    }
}
/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能           : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{
    unsigned int a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)
  {
        Delay10ms();
        a++;    
        a=0;
        if(GPIO_KEY!=0x0f)
        {
            KeyState=1;//有按键按下
            //测试列
            GPIO_KEY=0X0F;
//             Delay10ms();
            switch(GPIO_KEY)
            {
                case(0X07):    KeyValue=0;break;
                case(0X0b):    KeyValue=1;break;
                case(0X0d): KeyValue=2;break;
                case(0X0e):    KeyValue=3;break;
//                default:    KeyValue=17;    //检测出错回复17意思是把数码管全灭掉。
            }
            //测试行
            GPIO_KEY=0XF0;
            Delay10ms();
            switch(GPIO_KEY)
            {
                case(0X70):    KeyValue=KeyValue;break;
                case(0Xb0):    KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0):    KeyValue=KeyValue+12;break;
//                default:    KeyValue=17;
            }
            while((a<500)&&(GPIO_KEY!=0xf0))     //按键松手检测
            {
                Delay10ms();
                a++;
            }
            a=0;
        }
    }
}
/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能           : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}