一、数码管为什么要放定时器中刷新?
数字管的显示需要周期性地进行刷新,以保证数字能够持续地显示在数码管上,并且刷新需要按照一定的时间间隔进行。为了实现周期性的刷新,需要使用定时器对刷新时间进行控制,定时器能够定时产生中断,中断时触发刷新操作,从而实现数字管的周期性刷新。同时,将刷新操作放在定时器中可以提高程序的实时性和精度,因为定时器的中断响应时间比较精确,可以提高数字管显示的稳定性和准确性。
二、使用步骤
首先我们将固定部分,像断码表,定时器初始化以及要定义的变量等写出,然后再在中断函数里面写入逻辑,程序还是比较简单,很容易理解。
#include <STC15F2K60S2.H>
code unsigned char Duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//0123456789-
code unsigned char Duanmadot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//0123456789(带小数点)
unsigned char Smgnum[8]; //定义一个数组接受段码表
unsigned char i_smg,count_smg; //放定时器中刷新的轮询值,计数值
//定时器初始化这里我们直接在ISP中复制就可
void Timer1Init() //100微秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x9C; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1=1;
EA=1;
}
//这里锁存器我们进行先打开后关闭的过程,这样我们在给端口赋值后就不会影响其他地方了
void hc138(unsigned char n) //锁存器选择
{
switch(n)
{
case 4:P2 = ( P2 & 0x1f ) | 0x80; break;
case 5:P2 = ( P2 & 0x1f ) | 0xa0; break;
case 6:P2 = ( P2 & 0x1f ) | 0xc0; break;
case 7:P2 = ( P2 & 0x1f ) | 0xe0; break;
}
P2 = ( P2 & 0x1f ) | 0x00;
}
void SMGbit(unsigned char n,unsigned char m) //数码管位选
{
P0=0xff;hc138(7);
P0=0x01<<n;hc138(6);
P0=m;hc138(7);
}
//在这里可以定义一个函数对数码管接收到的值改变,然后将其放入while里面
void Smg_GetDuanma()
{
//2023-614
Smgnum[0]=Duanma[2];Smgnum[1]=Duanma[0];Smgnum[2]=Duanma[2];Smgnum[3]=Duanma[3];
Smgnum[4]=Duanma[10];Smgnum[5]=Duanma[6];Smgnum[6]=Duanma[1];Smgnum[7]=Duanma[4];
}
//然后就是中断服务函数
void T1Service() interrupt 3 //100us
{
count_smg++;
if(count_smg==20) //一般每2ms刷新一次就够了
{
count_smg=0;
SMGbit(i_smg,Smgnum[i_smg]); //下面三行代码就是轮询的过程了
i_smg++;
if(i_smg==8) i_smg=0;
P0=0xff;
}
}
void main()
{
Timer1Init();
while(1)
{
Smg_GetDuanma();
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了数码管放定时器中刷新的使用,采用传统的方法会有大量的延时以阻塞我们在while中不断循环,导致程序效率较低,同时数码管也会因为外设延时的影响导致数码管不亮,偏暗,或者数码管最后一位过亮等。采取放定时器中刷新的方法简单高效,稳定,建议大家都可以采用这种方法,定时器作为一个宝贵的资源我们一定要高效的利用起来。