数码管动态显示 + 中断 消除闪烁

/********************************************************************************
         数码管动态显示 + 中断  消除闪烁
     定时器定时1ms,数码管以秒表计时
     加上中断可消除数码管刷新时的闪烁问题
     闪烁问题是由while语句中分离数字时计算造成的
     因为每次1s时间到,在数码管刷新前都要进行计算,耽误了时间,所以闪烁
     加了中断以后则是先刷新数码管再分离数字
********************************************************************************/
#include<reg52.h>
unsigned char code LedChar[] = {
 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E   //0到的F十六进制
 };
unsigned char LedBuff[4] = {
 0xFF,0xFF,0xFF,0xFF      //4个数码管的显示缓冲区
 };
unsigned int cnt = 0;
unsigned char i = 0;
void main()
{   
 unsigned long sec = 0;
 TMOD = 0x01;  //定时器模式寄存器TMOD选择模式1
 TH0 = 0xFC;   //高8位
 TL0 = 0x18;   //低8位   //定时器0定时1ms
 TR0 = 1;   //定时器0运行控制位置1,开定时器0
 EA = 1;      //打开总中断
 ET0 = 1;     //打开定时器0的中断
 while(1)
 {
  if (cnt>=1000) //1s到
  {
   cnt = 0;
   sec++;    //总时间加1s
   LedBuff[0] = LedChar[sec%10]; //分离每一位上的数字
   LedBuff[1] = LedChar[sec/10%10];
   LedBuff[2] = LedChar[sec/100%10];
   LedBuff[3] = LedChar[sec/1000%10];
  }
 }
}
//定时器0中断函数
void InterruptTimer0() interrupt 1  /*关键字interrupt代表这是一个中断函数,1是定时器0的中断入口号。
            中断入口号计算方法:中断入口号*8+3=中断向量地址(把十六进制换算为十进制)*/  
{
 TH0 = 0xFC;
 TL0 = 0x18;
 cnt++;
 
 P2 = 0xFF;   /*此句为消除瞬间错误,例如case1下,P0已刷新而P2暂留在case0状态瞬间,
        会造成case0下数码管瞬间显示错误数值,在每次进入开关语句前关闭所有数码管即可消除该错误*/
 switch(i)   //使四位数码管以1ms间隔轮流刷新,即每个数码管隔3ms刷新一次
 {
  case 0: P0 = LedBuff[0]; P2 = 0x7F; i++; break;  //段选P0,位选P2  ,P0、P2已在<reg52.h>中sfr
  case 1: P0 = LedBuff[1]; P2 = 0xBF; i++; break;
  case 2: P0 = LedBuff[2]; P2 = 0xDF; i++; break;
  case 3: P0 = LedBuff[3]; P2 = 0xEF; i=0; break;
  default : break; 
 }
  
}
51单片机是一种基于Intel 8051微控制器架构的单片机,广泛应用于嵌入式系统和微控制器教学。数码管动态显示是指通过单片机控制数码管的显示内容,使得多个数码管可以轮流显示不同的数字或字符,从而在视觉上形成多个数码管显示的错觉。 实现51单片机数码管动态显示的原理是利用人眼的视觉暂留特性,通过快速地切换显示各个数码管,使每个数码管在短间内依次显示不同的内容。这种技术被称为多路复用技术,即在多个数码管中交替显示数据,每个数码管轮流点亮。 具体实现步骤如下: 1. 初始化:设置定中断,用于控制数码管的刷新频率。同配置好I/O口,选择是共阴极还是共阳极数码管,以便于控制数码管的亮灭。 2. 编写显示函数:编写一个函数用于控制数码管显示特定数字或字符。在这个函数中,根据输入的数字,选择对应的数码管显示编码,并输出到数码管上。 3. 主循环控制:在主循环中,通过循环遍历每个数码管的位置,并调用显示函数,以实现动态显示。在每个数码管显示的间隔中,需要加入短暂的延,以避免数码管之间的干扰。 4. 刷新显示:定中断会周期性地触发,每次中断更新数码管的显示内容,按照预定的顺序切换到下一个数码管显示,实现动态刷新。 实现动态显示的关键点在于控制刷新频率和延,确保刷新频率足够高,人眼看不到闪烁,同不宜过长,以免造成数码管显示断续。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值