Keil51单片机解决数字显示不稳的问题

数字显示不稳,就是我们人眼的特点决定的,0.1秒的残留现象,低于这个值人眼发现不了其中变化,大于这个值就会出现同一个数字闪烁的现象。解决的方法就是所有数字,第一个的显示到最后一个的显示刷新总值低于0.1秒,即100ms。这里包括程序本身的运行时间。所以比较稳妥的办法是,计算与显示分开;显示用中断来做,如下:

#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;

sbit ENLED = P1^4;
sbit ENLCD = P1^5;

sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;

unsigned char code LedChar[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char LedBuff[7] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
unsigned int cnt = 0; //中断计时器

//数字计算部分
void main()
{

unsigned char j=0 ;
unsigned long Sec =0;

ENLCD = 1;
ENLED = 0; //使能 U3

EA = 1; //打开中断总开关
ADDR3 = 1; //设置固定位,即数码管处于开放状态

TMOD = 0x01; //计时器运行在模式1下

TH0 = 0xFC; //FC67  1ms时长 
TL0 = 0x67;

ET0 = 1; //使能T0中断
TR0 = 1; //开始T0计时器

while(1)
{
if (cnt >= 100)
{
cnt = 0; //time length control
Sec++;  //1x1000ms=1 second

switch (j)
{
case 0:
{
if (Sec>9)
{
j++;
 
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = 0xFF;
LedBuff[2] = 0xFF;
LedBuff[3] = 0xFF;
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
};
};break;
case 1:
{
if (Sec>99)
{
j++;
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = LedChar[Sec/10%10];
LedBuff[2] = 0xFF;
LedBuff[3] = 0xFF;
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
};
};break;
case 2:
{
if (Sec>999)
{
j++;
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = LedChar[Sec/10%10];
LedBuff[2] = LedChar[Sec/100%10];
LedBuff[3] = 0xFF;
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
};
};break;
case 3:
{
if (Sec>9999)
{
j++;
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = LedChar[Sec/10%10];
LedBuff[2] = LedChar[Sec/100%10];
LedBuff[3] = LedChar[Sec/1000%10];
LedBuff[4] = 0xFF;
LedBuff[5] = 0xFF;
};
};break;
case 4:
{
if (Sec>99999)
{
j++;
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = LedChar[Sec/10%10];
LedBuff[2] = LedChar[Sec/100%10];
LedBuff[3] = LedChar[Sec/1000%10];
LedBuff[4] = LedChar[Sec/10000%10];
LedBuff[5] = 0xFF;
};
};break;
case 5:
{
if (Sec>999999)
{
j=0;
Sec = 0;
}
else
{
LedBuff[0] = LedChar[Sec%10];
LedBuff[1] = LedChar[Sec/10%10];
LedBuff[2] = LedChar[Sec/100%10];
LedBuff[3] = LedChar[Sec/1000%10];
LedBuff[4] = LedChar[Sec/10000%10];
LedBuff[5] = LedChar[Sec/100000%10];
};
};break;
default: break;

};

};

};

}

//中断程序,用于显示部分,这样运算不会影响显示,保持显示的稳定性

//Timer 0 interrupt 1

void InterruptTimer0() interrupt 3
{
static unsigned char i = 0;   //这个放第一行
TH0 = 0xFC; //reload initiation setting
TL0 = 0x67;
cnt++; // 加1,这个全局变量很重要,因为它是与主程序运算部分关联

ENLED = 1;  //关闭LED显示,后面赋值,再开放显示

switch (i)

{
case 0: {ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; }; break;  //LedBuff[0]这个也是全局数组变量,用于传递运算与显示之间的值
case 1: {ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; }; break;
case 2: {ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; }; break;
case 3: {ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; }; break;
case 4: {ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; }; break;
case 5: {ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i=0; P0 = LedBuff[5]; }; break;
default: break;
};

ENLED = 0; //瞬间打开LED显示

}

Keil51单片机解决数字显示不稳的问题的更多相关文章

  1. AVR单片机教程——示波器

    本文隶属于AVR单片机教程系列.   在用DAC做了一个稍大的项目之后,我们来拿ADC开开刀.在本讲中,我们将了解0.96寸OLED屏,移植著名的U8g2库到我们的开发板上,学习在屏幕上画直线的算法, ...

  2. Qcon会议之所见所想

    作为普通码农一枚,Qcon是俺参与过的最高级的技术大会了.大会共历时三天,因为俺第二天就得赶火车休个五一大长假,所以只参加了第一天4/25号的会议(其他俩天自然有其他同事会去观摩),不过第一天的会议有 ...

  3. js执行问题

    金三银四搞事季,前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下. 以下是我一个朋友的故事,真的不是我. f ...

  4. raspi串口、python串口模块pyserial

    一.安装 1.下载软件包pyserial-2.7.tar.gz   网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...

  5. Excuse me?这个前端面试在搞事!

    金三银四搞事季,前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下. 以下是我一个朋友的故事,真的不是我. f ...

  6. JavaScript面试核心考点(精华)

    引言 Javascript是前端面试的重点,本文重点梳理下 Javascript 中的常考基础知识点,然后就一些容易出现的题目进行解析.限于文章的篇幅,无法将知识点讲解的面面俱到,本文只罗列了一些重难 ...

  7. Macrotask Queue和Microtask Quque

    from:http://www.jianshu.com/p/3ed992529cfc setImmediate(function(){ console.log(1); },0); setTimeout ...

  8. 龙邱STM32单片机用J-LINK下载无法被识别的解决方法

    问题如下: 按照正常步骤使用keil5给龙邱的stm32下载程序,SWD下载方式提示no cortex-m sw device found,JTAG方式提示no cortex-m device fou ...

  9. 宏晶STC单片机使用STC-ISP串口烧录失败的原因与解决方法汇总

    官方网址: http://www.stcisp.com/q_and_a_stcisp.html 个人小结 芯片:STC12C5A60S2 封装:LQFP-48 晶振大小:SD22.1184M 最小系统 ...

  10. 关于单片机编程里面调用sprintf死机的解决方法及原因分析

    好久之前的做的笔记,这里贴出. char String[100];//直接用数组代替指针即可解决 下面代代码下载至单片机中,发现会出现单片机死机问题 #include "stdio.h&qu ...

随机推荐

  1. 9.【go-kit教程】go-kit集成Prometheus

    在 Go kit 中集成 Prometheus 进行 API 监控可以帮助开发人员更好地了解系统的性能和行为,提高系统的可观察性和可靠性.下面是一个简单的示例,演示如何在 Go kit 中集成 Pro ...

  2. [EULAR文摘] 新证据: NSAID对AS放射学进展的影响

    新证据: NSAID对AS放射学进展的影响 Sieper J, et al. EULAR 2015. Present ID: OP0145. 背景: 既往有研究显示持续给予NSAID相较于按需给药能在 ...

  3. day05-mybatis配置文件和SQL映射文件

    Mybatis配置文件&SQL映射文件 1.配置文件-mybatis-config.xml 1.1基本说明 mybatis的核心配置文件(mybatis-config.xml),它的作用如配置 ...

  4. Vue 组件VueComponent中_ _proto_ _ 原型对象的指向(指向Vue的原型对象 _ _proto_ _)

    1.VueComponent.prototype.__proto__ === Vue.prototype 2.让组件实例对象(vc)可以访问到Vue原型上的属性.方法 图片如下: 案例: Vue.pr ...

  5. vue - 开发必须知道的 36 个技巧

    来源于:https://juejin.im/post/6844903959266590728  

  6. Tensorflow1.0版本与以前函数不同之处

    大部分是Api版本问题: AttributeError: 'module' object has no attribute 'SummaryWriter' tf.train.SummaryWriter ...

  7. ts(keyof,typeof)

    ts(keyof,typeof) keyof 获取某类型的键,返回联合类型 interface Person { hair: string; eyesColor: string; } let P1 = ...

  8. c++获取类型信息

    获取类型信息 typeid typeid运算符用来获取一个表达式的类型信息. 对于基本类型数据, 类型信息比较简单, 主要指数据的类型; 对于对象(类类型的数据), 类型信息指: 对象所属的类, 所包 ...

  9. 解决多行文本超出显示省略号webpack打包后失效的问题

    开发环境没问题: 但是在打包部署后就失效了: 经过对比后发现是因为: 缺少了 -webkit-box-orient: vertical;  导致 解决方案 : /* ! autoprefixer: o ...

  10. Software_programming_tools_IDEA

    13:45:55 key promtoer 快捷键提示插件