找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1727|回复: 5
打印 上一主题 下一主题
收起左侧

单片机动态数码管问题

[复制链接]
跳转到指定楼层
楼主
ID:688769 发表于 2020-2-3 15:59 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
看了普中的教学视频,想显示20.20.720.6
改了一下LSA的值,但是显示变成了如图
以下是代码
小白求答!
#include "REG52.H"
typedef unsigned char u8;
typedef unsigned int u16;

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

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

       
        void delay(u16 i)
        {
                while(i--);
        }
        void DigDisplay()
        {
                u8 i;
                for(i=0;i<8;i++)
                {
                        switch(i)
                        {
                                case(0):
                                        LSA=0;LSB=1;LSC=0;break;
                                case(1):
                                        LSA=0;LSB=0;LSC=0;break;
                                case(2):
                                        LSA=0;LSB=1;LSC=0;break;
                                case(3):
                                        LSA=0;LSB=0;LSC=0;break;
                                case(4):
                                        LSA=1;LSB=1;LSC=1;break;
                                case(5):
                                        LSA=0;LSB=1;LSC=0;break;
                                case(6):
                                        LSA=0;LSB=0;LSC=0;break;
                                case(7):
                                        LSA=0;LSB=1;LSC=1;break;
                        }
                        P0=smgduan[i];
                        delay(100);
                        P0=0x00;
                }
        }
        void main()
        {
                while(1)
                {
                        DigDisplay();
                }
        }

1580716609743.jpg (798.41 KB, 下载次数: 90)

1580716609743.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-2-3 17:29 | 只看该作者
位码不可以随意改动,想改变显示字符只能改段码。
  1. #include "REG52.H"
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. u8 code smgduan[]={0x3f|0x80,/*0+点*/0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8.                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  9. u8 data dis_buf[8]={2,0,2,0,7,2,0,6};//20.20.720.6
  10.         
  11. void delay(u16 i)
  12. {
  13.         while(i--);
  14. }
  15. void DigDisplay()
  16. {
  17.         u8 i;
  18.         for(i=0;i<8;i++)
  19.         {
  20.                 switch(i)
  21.                 {
  22.                         case(0):
  23.                                 LSA=1;LSB=1;LSC=1;break;
  24.                         case(1):
  25.                                 LSA=0;LSB=1;LSC=1;break;
  26.                         case(2):
  27.                                 LSA=1;LSB=0;LSC=1;break;
  28.                         case(3):
  29.                                 LSA=0;LSB=0;LSC=1;break;
  30.                         case(4):
  31.                                 LSA=1;LSB=1;LSC=0;break;
  32.                         case(5):
  33.                                 LSA=0;LSB=1;LSC=0;break;
  34.                         case(6):
  35.                                 LSA=1;LSB=0;LSC=0;break;
  36.                         case(7):
  37.                                 LSA=0;LSB=0;LSC=0;break;
  38.                 }
  39.                 P0=smgduan[dis_buf[i]];
  40.                 delay(100);
  41.                 P0=0x00;
  42.         }
  43. }
  44. void main()
  45. {
  46.         while(1)
  47.         {
  48.                 DigDisplay();
  49.         }
  50. }
复制代码




回复

使用道具 举报

板凳
ID:642838 发表于 2020-2-3 20:20 | 只看该作者
switch的case几种状态都重复了,显示不乱才怪
回复

使用道具 举报

地板
ID:235200 发表于 2020-2-3 20:58 | 只看该作者
把20.20.720.6对应的段码:0x5b,0xbf,0x5b,0xbf,0x07,0x5b,0xbf,0x7d作为数组,
                              case(0):
                                        LSA=0;LSB=0;LSC=0;break;
                                case(1):
                                        LSA=1;LSB=0;LSC=0;break;
                                case(2):
                                        LSA=0;LSB=1;LSC=0;break;
                                case(3):
                                        LSA=1;LSB=1;LSC=0;break;
                                case(4):
                                        LSA=0;LSB=0;LSC=1;break;
                                case(5):
                                        LSA=1;LSB=0;LSC=1;break;
                                case(6):
                                        LSA=0;LSB=1;LSC=1;break;
                                case(7):
                                        LSA=1;LSB=1;LSC=1;break;
                        }
这样改了就可实现
回复

使用道具 举报

5#
ID:375003 发表于 2020-2-3 22:56 | 只看该作者
我帮你弄好了.#include "REG52.H"
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7;//使用八个数进行位置确定

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delay(u16 i)
{
        while(i--);
}
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)
                {
                        case(0):
                                LSA=0;LSB=1;LSC=0;break;
                        case(1):
                                LSA=0;LSB=0;LSC=0;break;
                        case(2):
                                LSA=0;LSB=1;LSC=0;break;
                        case(3):
                                LSA=0;LSB=0;LSC=0;break;
                        case(4):
                                LSA=1;LSB=1;LSC=1;break;
                        case(5):
                                LSA=0;LSB=1;LSC=0;break;
                        case(6):
                                LSA=0;LSB=0;LSC=0;break;
                        case(7):
                                LSA=0;LSB=1;LSC=1;break;
                }
                P0=smgduan[i];
                delay(100);
                P0=0x00;
        }
}

void display()
{
        u8 j;
        for(j=0;j<8;j++)
        {
        switch(j)         //位选,选择点亮的数码管,
        {
            case(0):
                    LSA=0;LSB=0;LSC=0;P0=smgduan[a] ;break;//
            case(1):
                    LSA=1;LSB=0;LSC=0; P0=smgduan[b];break;//
            case(2):
                    LSA=0;LSB=1;LSC=0; P0=smgduan[c];break;
            case(3):
                    LSA=1;LSB=1;LSC=0; P0=smgduan[d];break;//
            case(4):
                    LSA=0;LSB=0;LSC=1; P0=smgduan[e];break;//
            case(5):
                    LSA=1;LSB=0;LSC=1; P0=smgduan[f];break;//
            case(6):
                    LSA=0;LSB=1;LSC=1; P0=smgduan[g];break;//
            case(7):
                    LSA=1;LSB=1;LSC=1; P0=smgduan[h];break;//
        }
                delay(100);
                P0=0x00;
        }
}

void main()
{
        while(1)
        {
             display();
              //  DigDisplay();
        }
}

问题显示.JPG (34.48 KB, 下载次数: 92)

你开发板上的结果

你开发板上的结果

正确的显示.JPG (45.17 KB, 下载次数: 101)

改好后的效果

改好后的效果
回复

使用道具 举报

6#
ID:375003 发表于 2020-2-3 23:12 | 只看该作者
wulin 发表于 2020-2-3 17:29
位码不可以随意改动,想改变显示字符只能改段码。

0加点真是经典,站在初学者的角度,别太搞好了,给他启发就可以了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表