找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我用数码管静态显示来点亮LED却是这样子?附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:1089508 发表于 2023-7-24 17:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX52.H>
unsigned char nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组内的每一个数据都用逗号隔开,(数组)数据依旧用中括号括起来
//为什么用的函数名和下面不一样?
void nixietable ( unsigned int LO,num)
{        
        switch(LO)    //所有函数名的括号后都不用加符号
        {
                case 1:  P2_4=0; P2_3=0; P2_2=1;break;
                case 2:  P2_4=0; P2_3=1; P2_2=0;break;
                case 3:  P2_4=0; P2_3=1; P2_2=1;break;
                case 4:  P2_4=1; P2_3=0; P2_2=1;break;
                case 5:  P2_4=1; P2_3=0; P2_2=1;break;
                case 6:  P2_4=1; P2_3=1; P2_2=0;break;
                case 7:  P2_4=1; P2_3=1; P2_2=1;break;
                }
        P0=nixie[num];  //switch是选数码第几个管来点量(用的P2) P0是提供想点亮的数
        }
void main ()
{  
         nixietable(3,5);
}
求大佬解答
运行成功后板子只会亮第一个与第五个灯 且显示数字8  
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:116103 发表于 2023-7-24 21:47 | 只看该作者
程序缺少主循环WHILE(1)
回复

使用道具 举报

板凳
ID:1010435 发表于 2023-7-24 22:58 | 只看该作者
因为没有电路图,是不是第一个和第五个灯的位选线连起来了?P2后面应该接了个138之类的译码器,而且你的数码管是共阴的, P0=nixie[num]; 之后需要消隐,delay个几毫秒后让P0=0;
另外你的case的值驱动138或238都不会让第一个和第五个灯亮,
你试试这个:
case1 :P2_4=1;P2_3=1;P2_2=0;break;
case2 :P2_4=1;P2_3=0;P2_2=1;break;
case3 :P2_4=1;P2_3=0;P2_2=0;break;
case4 :P2_4=0;P2_3=1;P2_2=1;break;
case5 :P2_4=0;P2_3=1;P2_2=0;break;
case6 :P2_4=0;P2_3=0;P2_2=1;break;
case7 :P2_4=0;P2_3=0;P2_2=0;break;
回复

使用道具 举报

地板
ID:213173 发表于 2023-7-25 07:09 | 只看该作者
nixietable(3,5);要约束在main函数内运行,否则程序跑飞。
#include <REGX52.H>
unsigned char nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组内的每一个数据都用逗号隔开,(数组)数据依旧用中括号括起来
//为什么用的函数名和下面不一样?
void nixietable ( unsigned int LO,num)
{        
        switch(LO)    //所有函数名的括号后都不用加符号
        {
                case 0:  P2_4=0; P2_3=0; P2_2=0;break;
                case 1:  P2_4=0; P2_3=0; P2_2=1;break;
                case 2:  P2_4=0; P2_3=1; P2_2=0;break;
                case 3:  P2_4=0; P2_3=1; P2_2=1;break;
                case 4:  P2_4=1; P2_3=0; P2_2=1;break;
                case 5:  P2_4=1; P2_3=0; P2_2=1;break;
                case 6:  P2_4=1; P2_3=1; P2_2=0;break;
                case 7:  P2_4=1; P2_3=1; P2_2=1;break;
        }
        P0=nixie[num];  //switch是选数码第几个管来点量(用的P2) P0是提供想点亮的数
}
void main ()
{  
        while(1)
        {
                nixietable(3,5);
        }
}
回复

使用道具 举报

5#
ID:1089508 发表于 2023-7-25 10:11 | 只看该作者
wys91203 发表于 2023-7-24 21:47
程序缺少主循环WHILE(1)

您好,尝试过您的代码之后确实能正常运行了,不过想请教一下,这个while(1)不是一个空循环吗?其里面也无其它语句,为何加上while循环才可以执行成功呢?
回复

使用道具 举报

6#
ID:1089508 发表于 2023-7-25 10:14 | 只看该作者
mtt661 发表于 2023-7-24 22:58
因为没有电路图,是不是第一个和第五个灯的位选线连起来了?P2后面应该接了个138之类的译码器,而且你的数 ...

谢谢你的解答
回复

使用道具 举报

7#
ID:1089508 发表于 2023-7-25 10:17 | 只看该作者
wulin 发表于 2023-7-25 07:09
nixietable(3,5);要约束在main函数内运行,否则程序跑飞。
#include
unsigned char nixie[]={0x3F,0x06, ...

好的,谢谢大佬的解答,我想请教一下,num作为函数nixietable的形参,为什么还能调用另一个函数nixie的实参呢?
回复

使用道具 举报

8#
ID:116103 发表于 2023-7-25 10:42 | 只看该作者
num是形参,在nixietable(3,5);语句中,num的实参是5,通过数组函数 P0=nixie[num]; 得到数码管显示的段码。
回复

使用道具 举报

9#
ID:320306 发表于 2023-7-25 16:10 | 只看该作者
是不是延时不够,导致每个数码管都亮了?我只是猜测哈!
回复

使用道具 举报

10#
ID:1089508 发表于 2023-7-29 14:37 | 只看该作者
zsyzdx 发表于 2023-7-25 16:10
是不是延时不够,导致每个数码管都亮了?我只是猜测哈!

已排除该问题 谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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