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日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭