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

数码管移位显示代码。。

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

  • 写回答

1条回答 默认 最新

  • soar3033 2022-01-05 02: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--);
    }
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    Zon.e 2022-01-05 03:16

    可以去掉按键吗

    回复
编辑
预览

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 Mask Attention中的一段代码问题
  • ¥20 如何用Python删除单元格内连续出现的重复词?
  • ¥15 WangEditor嵌入到geeker-admin中,回车没有办法换行
  • ¥30 stm32f103c8t6制作万能红外遥控器
  • ¥15 有人会fastcrud写前端页面吗
  • ¥15 如何解除Uniaccess管控
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部