找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机8只数码管滚动显示16个数字的程序 亮度太低,速度太快 请高手支支招

[复制链接]
跳转到指定楼层
楼主
ID:884109 发表于 2021-4-30 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想写个滚动显示数字的程序,8个数码管滚动显示16个数字,虽然程序可以实现,但是亮度太低,速度太快,该怎么修改呢,请高手支支招

单片机源程序如下:
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int

uchar code table[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};
uchar code wei[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

void delay(uint x)
{
        uchar j;
        uint i;
        
        for( i = 0; i < x; i++ )
                for( j = 0; j < 111; j++ );
}

void main(void)
{
         uchar i;
        uint j;
        P1 =P0 = 0x00;
        while(1){
                 for( i = 0; i < 16; i++ ){
                        for( j = 0; j < 8; j++ ){  
                                delay(1);
                                 P1 = table[(i+j)%16];
                                P0 = wei[j];
                                delay(20);
                        }
                        delay(200);
                }
        }
}

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

使用道具 举报

沙发
ID:390416 发表于 2021-5-1 09:36 | 只看该作者
回复

使用道具 举报

板凳
ID:213173 发表于 2021-5-1 10:47 | 只看该作者
  1. #include <REG51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  5. uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  6. void delay(uint x)
  7. {
  8.         uint i,j;
  9.         for(i=0;i<x;i++)
  10.                 for(j=0;j<111;j++);
  11. }

  12. void main(void)
  13. {
  14.         uchar i,k;
  15.         uint j;
  16.         while(1)
  17.         {
  18.                 P1=0x00;//段消隐
  19.                 P0=wei[i];//送位码
  20.                 P1=table[i];//送段码
  21.                 i=++i%8;//8位动态显示计数
  22.                 if(++j>=1000)//约1秒
  23.                 {
  24.                         j=0;
  25.                         table[16]=table[0];
  26.                         for(k=0;k<16;k++)//数组循环排序
  27.                                 table[k]=table[k+1];
  28.                 }
  29.                 delay(1);
  30.         }
  31. }
复制代码


回复

使用道具 举报

地板
ID:89515 发表于 2021-5-1 11:48 | 只看该作者
程序逻辑没错,但是不能那样延时,需要用时时扫描来做延时替换掉delay(200)
回复

使用道具 举报

5#
ID:884109 发表于 2021-5-1 16:30 | 只看该作者
明白了 多谢两位总工 受教了
回复

使用道具 举报

6#
ID:884109 发表于 2021-5-1 16:36 | 只看该作者

多谢多谢 明白了 当时也想给每个数字延时 但是延时一长 就变成一个数字了 就是没想到每轮多次扫描
回复

使用道具 举报

7#
ID:884109 发表于 2021-5-1 16:37 | 只看该作者
mengzhixinheng 发表于 2021-5-1 11:48
程序逻辑没错,但是不能那样延时,需要用时时扫描来做延时替换掉delay(200)

多谢多谢 明白了
回复

使用道具 举报

8#
ID:377210 发表于 2021-5-1 18:44 来自手机 | 只看该作者
亮度低改小限流电阻仍不能满足要求的话,不要用空操作延时。可以把显示放中断,每次中断显示一位,显示完后不要关闭。等到下次进入中断刷新前再关闭显示,然后再显示下一位,这样的亮度很高,每次中断处理的时间也不长。我的中断时间是2.5ms,你可以根据自己的情况调整中断时间。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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