找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于单片机数码管消隐问题

查看数: 3070 | 评论数: 22 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2024-9-10 11:12

正文摘要:

应该是关于消隐的内容没有弄好,第七位数码管的数字看不到了,各位大佬能帮忙看看到底应该怎么改代码才能得到稳定的显示呢? 数码管第七位不显示 单片机源程序如下: #include<stc15.h> #define uCha ...

回复

ID:1109793 发表于 2024-9-18 07:26
老董 发表于 2024-9-17 23:27
想请教一下你的stc单片机是怎么加到软件里的 我的软件里没有这个

STC的工具软件里面有个按键
ID:849913 发表于 2024-9-17 23:27
想请教一下你的stc单片机是怎么加到软件里的 我的软件里没有这个
ID:849913 发表于 2024-9-15 20:20

        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
   设置有关系吧
ID:1109793 发表于 2024-9-12 13:05

开来就是被系统删除了
  1. #include <STC89C5xRC.H>//此文件中定义了单片机的一些特殊功能寄存器


  2. typedef unsigned char u8;   //无符号字符形数据类型进行声明定义 定义名称u8 所占位数8位 范围0~255
  3. typedef unsigned int u16;   //无符号整形数据类型进行声明定义 定义名称u16 所占位数16位 范围0~65535

  4. u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字"0123456789-" 共阴
  5. u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位开始点亮 0x7f  0111 1111 .........
  6. u8 wei_num[8]; //存储记录数码管8个段码位的值 要发送数字到哪一位的暂存区

  7. u8 shi,fen,miao; //时 分 秒 变量


  8. /*12T 12M晶振 延时函数 Delay_ms(1)时大约1ms*/
  9. void Delay_ms(u16 ms)
  10. {
  11.     u8 t;
  12.     while(ms--)
  13.     {
  14.         for(t = 0; t < 98; t ++);
  15.     }
  16. }

  17. /*主函数*/
  18. void main()
  19. {
  20.         u8 i;
  21.     while(1)
  22.     {
  23.                   /*数码管显示处理*/
  24.         wei_num[7]=ma[shi%100/10];  //显示 时
  25.         wei_num[6]=ma[shi%10];      //
  26.         wei_num[5]=ma[10];          //显示"-"
  27.         wei_num[4]=ma[fen%100/10];  //显示 分
  28.         wei_num[3]=ma[fen%10];      //
  29.         wei_num[2]=ma[10];          //显示"-"
  30.         wei_num[1]=ma[miao%100/10]; //显示 秒
  31.         wei_num[0]=ma[miao%10];     //
  32.                
  33.                  for(i=0; i<8; i++)
  34.         {
  35.             P0=wei_num[i]; //发送段码
  36.                         P2=wei[i];     //位
  37.             Delay_ms(1); //间隔一段时间扫描
  38.             P0=0x00;//消隐
  39.         }
  40.     }
  41. }
复制代码
ID:1109793 发表于 2024-9-12 07:35
  1. #include <STC89C5xRC.H>//此文件中定义了单片机的一些特殊功能寄存器


  2. typedef unsigned char u8;   //无符号字符形数据类型进行声明定义 定义名称u8 所占位数8位 范围0~255
  3. typedef unsigned int u16;   //无符号整形数据类型进行声明定义 定义名称u16 所占位数16位 范围0~65535

  4. u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字"0123456789-" 共阴
  5. u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位开始点亮 0x7f  0111 1111 .........
  6. u8 wei_num[8]; //存储记录数码管8个段码位的值 要发送数字到哪一位的暂存区

  7. u8 shi,fen,miao; //时 分 秒 变量


  8. /*12T 12M晶振 延时函数 Delay_ms(1)时大约1ms*/
  9. void Delay_ms(u16 ms)
  10. {
  11.     u8 t;
  12.     while(ms--)
  13.     {
  14.         for(t = 0; t < 98; t ++);
  15.     }
  16. }

  17. /*主函数*/
  18. void main()
  19. {
  20.         u8 i;
  21.     while(1)
  22.     {
  23.                   /*数码管显示处理*/
  24.         wei_num[7]=ma[shi%100/10];  //显示 时
  25.         wei_num[6]=ma[shi%10];      //
  26.         wei_num[5]=ma[10];          //显示"-"
  27.         wei_num[4]=ma[fen%100/10];  //显示 分
  28.         wei_num[3]=ma[fen%10];      //
  29.         wei_num[2]=ma[10];          //显示"-"
  30.         wei_num[1]=ma[miao%100/10]; //显示 秒
  31.         wei_num[0]=ma[miao%10];     //
  32.                
  33.                  for(i=0; i<8; i++)
  34.         {
  35.             P0=wei_num; //发送段码
  36.                         P2=wei;     //位
  37.             Delay_ms(1); //间隔一段时间扫描
  38.             P0=0x00;//消隐
  39.         }
  40.     }
  41. }
复制代码
ID:1109793 发表于 2024-9-12 07:22
1860774xxxx 发表于 2024-9-11 22:20
我也不知道为什么 后面的i看不到

可能需要使用代码功能吧
我发的第二行也有括弧的,实际上是没有的
ID:468209 发表于 2024-9-11 22:20
xiaobendan001 发表于 2024-9-11 19:49
P0=wei_num; //发送段码
P0=wei_num; //发送段码

我也不知道为什么 后面的i看不到

IMG_20240911_221824.jpg (643.84 KB, 下载次数: 11)

IMG_20240911_221824.jpg
ID:1109793 发表于 2024-9-11 19:49
1860774xxxx 发表于 2024-9-11 19:19
#include //此文件中定义了单片机的一些特殊功能寄存器

P0=wei_num; //发送段码
P0=wei_num; //发送段码
ID:468209 发表于 2024-9-11 19:45
1860774xxxx 发表于 2024-9-11 19:19
#include //此文件中定义了单片机的一些特殊功能寄存器



P0=wei_num; //发送段码
P2=wei;// 位
这里写漏了
ID:468209 发表于 2024-9-11 19:19
qiuqiubuyao 发表于 2024-9-11 08:18
感谢回复,虽然刚开始我也觉得用for会更加好,但是因为我的数据是分时分秒来着的,如果单单用for来表示b ...

#include <STC89C5xRC.H>//此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned char u8;   //无符号字符形数据类型进行声明定义 定义名称u8 所占位数8位 范围0~255
typedef unsigned int u16;   //无符号整形数据类型进行声明定义 定义名称u16 所占位数16位 范围0~65535

u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字"0123456789-" 共阴
u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位开始点亮 0x7f  0111 1111 .........
u8 wei_num[8]; //存储记录数码管8个段码位的值 要发送数字到哪一位的暂存区

u8 shi,fen,miao; //时 分 秒 变量


/*12T 12M晶振 延时函数 Delay_ms(1)时大约1ms*/
void Delay_ms(u16 ms)
{
    u8 t;
    while(ms--)
    {
        for(t = 0; t < 98; t ++);
    }
}

/*主函数*/
void main()
{
        u8 i;
    while(1)
    {
                  /*数码管显示处理*/
        wei_num[7]=ma[shi%100/10];  //显示 时
        wei_num[6]=ma[shi%10];      //
        wei_num[5]=ma[10];          //显示"-"
        wei_num[4]=ma[fen%100/10];  //显示 分
        wei_num[3]=ma[fen%10];      //
        wei_num[2]=ma[10];          //显示"-"
        wei_num[1]=ma[miao%100/10]; //显示 秒
        wei_num[0]=ma[miao%10];     //
               
                 for(i=0; i<8; i++)
        {
            P0=wei_num; //发送段码
                        P2=wei;     //位
            Delay_ms(1); //间隔一段时间扫描
            P0=0x00;//消隐
        }
    }
}

难道这样还不够明朗吗 加上定时器加上按键就可以了  再说你那按键用while(!xx); 按键按下是会卡死 数码管消灭
ID:57657 发表于 2024-9-11 18:27
是否需要消隐看IO口并行位宽,51单片机为8位并行IO,段码和位码做不到并行发送,所以需要消影处理(先关闭前一位再打开下一位),是否显示正常以实物验证为准。
用74HC595或273并行锁存发送、FPGA、16位并行IO的单片机驱动 8位8段数码管或8*8点阵不需要消影。
ID:619259 发表于 2024-9-11 15:56
数码管动态显示程序中没有消隐程序行,在proteus仿真中会出现一些无序的乱码或意想不到的显示错误。
程序中8个数码管的程序段最后都要加上消隐,以第一个数码管为例:
原程序为:
P1=b[0];
P0=a[hour/10];
Delay(10);
加上消隐后程序应为(增加一行):
P1=b[0];
P0=a[hour/10];
Delay(10);
P0=0x00;

另外8个数码管的总延时时间不要超过20ms,所以每一个数码管的延时建议选用1ms-2ms为宜。
ID:1109793 发表于 2024-9-11 11:46
qiuqiubuyao 发表于 2024-9-11 08:13
感谢回复,我按照您的修改之后显示确实好了,之后秒数的时间又延长了,之后在定时器那里修改之后,时间问 ...

时间的操作还有用定时器吧,显示方面还好一些,建议使用专用的显示芯片
ID:1131713 发表于 2024-9-11 09:51
数码管的显示,要遵循先关闭,然后驱动segment,然后驱动com,所有共享segment的管都要先关闭,比如4个数字的,6个数字一起的,全部都先关闭com,最后所有数字配完再开com
ID:1131511 发表于 2024-9-11 08:18
1860774xxxx 发表于 2024-9-10 19:38
数码管应该用for循环显示 如:  for(i=0;i

感谢回复,虽然刚开始我也觉得用for会更加好,但是因为我的数据是分时分秒来着的,如果单单用for来表示b【i】的位置的话,代码长度也没有办法变短,反而看起来也不够直观,所以就直接这样显示了,或者您会有更好的使用方法。
ID:1131511 发表于 2024-9-11 08:13
xiaobendan001 发表于 2024-9-10 19:11
在delay(10)之后要换下一位显示之前要先消隐,比如在移位前先把段驱动P0=0;
要么delay(10)要么delay(10000 ...

感谢回复,我按照您的修改之后显示确实好了,之后秒数的时间又延长了,之后在定时器那里修改之后,时间问题也基本没有了,又或者有没有更好确定时间精度的办法呢
ID:462827 发表于 2024-9-10 23:34
你的数码管显示代码里根本就没有消影,还有,扫描的间隔/延时太短了
ID:344848 发表于 2024-9-10 21:02
qiuqiubuyao 发表于 2024-9-10 11:49
我后面发现应该是延时的问题,但是当我把延时增加到10000后,屏幕闪烁,这样它的频率在肉眼上就不够快且看 ...

视觉暂留时间,它的长短因人而异,一般在50~200ms。
若数码管为N位,驱动位选的信号频率应大于N*50Hz。
ID:468209 发表于 2024-9-10 19:38
数码管应该用for循环显示 如:  for(i=0;i<8;i++) {      
ID:468209 发表于 2024-9-10 19:38
数码管应该用for循环显示 如:  for(i=0;i<8;i++) {      
ID:1109793 发表于 2024-9-10 19:11
在delay(10)之后要换下一位显示之前要先消隐,比如在移位前先把段驱动P0=0;
要么delay(10)要么delay(10000),搞代码不要这极端。你还可以试试比如delay(100);
又或者使用定时器获得更好的效果。
ID:1131511 发表于 2024-9-10 11:49
我后面发现应该是延时的问题,但是当我把延时增加到10000后,屏幕闪烁,这样它的频率在肉眼上就不够快且看着很难受,各位大佬有没有其他更加好的办法呢

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

Powered by 单片机教程网

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