数码管实时显示问题,该怎么操作

img


到底该怎么实现实时显示,单片机课程根本不会写,想了好久也是没有思路啊,有没有人提供点思路啊,谢谢。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7688929
  • 你也可以参考下这篇文章:数码管显示实验、按键控制实验
  • 除此之外, 这篇博客: 微机原理问答题中的 什么是变量,变量有哪些属性,如何使用这些属性? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 变量是一个可存放数据的存储单元的名子,即存放数据存储单元的地址符号名。变量有三个属性:
    〈1〉段属性(SEGMENT)变量段基址通常在定义变量的数据段的 DS 寄存器中。在 指令中它们被隐含使用。
    〈2〉偏移属性(OFFSET)是标号或变量所在地址距离段基址的偏移量值。它们在指 令中以显示方式出现。
    〈3〉类型属性(TYPE)指变量是按字节、字或双字操作。字节、字和双字分别用 BYTE、 WORD 和 DWORD 定义。

  • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 运营:才刚开始,站长更重要的工作…小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对问题:如何实现数码管的实时显示?

    首先,需要明确使用的数码管是共阴还是共阳数码管,以及数码管的位数。本文假设使用的是共阴的6位数码管。

    一、硬件设计

    1. 连接数码管:将数码管通过适当的限流电阻连接到单片机的I/O口,其中位选线连接到P2口。例如:

    数码管连接示意图

    1. 连接按键:将按键连接到单片机的外部中断0,例如:

    按键连接示意图

    二、软件设计

    1. 宏定义和数组定义
    #define u8 unsigned char
    u8 code smgduan[]={0xff,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0}; //共阴 段码表 P0
    u8 code smgwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40}; //位码表 P2
    u8 Number1,Number2,Number3,Number4,Number5,Number6; // 用来存储数码管显示的数值
    u8 k = 0; // 记录当前数码管显示的位数
    
    1. 数码管显示函数
    void smg_display()  
    {
        Number1 = P1&0x0f; // 读取P1口的数值并将高四位置0
        if(k >= 1) P0 = smgduan[Number1]; P2 = smgwei[0]; Delay1ms(); P0 = 0xff;
        if(k >= 2) P0 = smgduan[Number2]; P2 = smgwei[1]; Delay1ms(); P0 = 0xff;
        if(k >= 3) P0 = smgduan[Number3]; P2 = smgwei[2]; Delay1ms(); P0 = 0xff;
        if(k >= 4) P0 = smgduan[Number4]; P2 = smgwei[3]; Delay1ms(); P0 = 0xff;
        if(k >= 5) P0 = smgduan[Number5]; P2 = smgwei[4]; Delay1ms(); P0 = 0xff;
        if(k >= 6) P0 = smgduan[Number6]; P2 = smgwei[5]; Delay1ms(); P0 = 0xff; // 依次在各位上显示数值
    }
    

    其中,smgduan数组定义了共阴数码管的段码表,smgwei数组定义了位码表,Number1Number6变量分别存储数码管的6位值,k变量用来记录当前数码管显示的位数。smg_display()函数中,代码通过位选线P2,依次在各个位上显示数值。

    1. 外部中断0函数
    /*外部中断0函数*/
    void exint0() interrupt 0       
    {
        if(!P32) // 检测中断请求
        {
            Delay20ms(); // 延时消抖
            if(!P32) // 如果确定按下
            {
                k++; // k自加
                if(k > 6) k = 1; // 重置k
                Number6=Number5;Number5=Number4;Number4=Number3; // 将数值传递到下一位
                Number3=Number2;Number2=Number1;
            }
            while(!P32); // 等待按键松开
        }
    }
    

    外部中断0函数通过检测按键