Zon.e 2022-01-05 10:02 采纳率: 100%
浏览 35
已结题

数码管移位显示代码。。

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

  • 写回答

1条回答 默认 最新

  • soar3033 2022-01-05 10:37
    关注
    
    /*
    实验说明:
        
    实验接线:
        动态数码管模块-->单片机管脚
        参考动态数码管实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
        矩阵按键模块-->单片机管脚
        参考矩阵按键实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
    实验现象:
        按下矩阵按键在数码管上逐个显示对应的键值,键值如下:
        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--);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月5日
  • 已采纳回答 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥20 关于php录入完成后,批量更新数据库
  • ¥15 请教往复密封润滑问题
  • ¥15 cocos creator发布ios包
  • ¥15 comsol压电材料数据
  • ¥35 用python实现除法算法中goldschmidt算法
  • ¥15 汇编代码转换成C代码
  • ¥15 除法算法中的归一化具体是怎么变的?
  • ¥20 集成电路的逻辑电路和晶体管简化图
  • ¥15 下载windows builder后的问题
  • ¥15 端口连接数为什么会有限制