数码管扫描的基本思想是在间隔比较短的时间内让数码管一个个循环点亮,由于视觉暂留效应,使得看起来好像所有的数码管同时亮一样。
具体代码如下:
#include<reg52.h>
#define T0_INTERRUPT 1 //T0中断向量号
//共阳极数码管7段码
unsigned char seg[] = {0x3F,0x06}; //简化只显示0和1
unsigned char SegScan[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//6个数码管控制
void Init_T0()
{
TMOD &= 0xF0;
TMOD |= 0x01; //16位定时器模式
TH0 = 0xFC;
TL0 = 0x18;
EA = 1; //开全局中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器
}
void Display() //扫描显示
{
static unsigned char i = 0;
P2 = SegScan[i] ; //点亮第i个数码管
P1 = 0xFF - seg[i%2]; //转换成共阴极数码管,seg[i%2]可以在其他函数进行更新
i++;
if(i>5) i = 0;
}
void main(void)
{
Init_T0();
while(1)
{
PCON |= 0x01;
}
}
void T0_Interrupt() interrupt T0_INTERRUPT
{
static unsigned char i = 0;
TH0 = 0xFC;
TL0 = 0x18;
i++;
TF0 = 0;
if(i == 3) //3毫秒扫描一次
{
Display();
i = 0;
}
}
具体代码如下:
#include<reg52.h>
#define T0_INTERRUPT 1 //T0中断向量号
//共阳极数码管7段码
unsigned char seg[] = {0x3F,0x06}; //简化只显示0和1
unsigned char SegScan[] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//6个数码管控制
void Init_T0()
{
TMOD &= 0xF0;
TMOD |= 0x01; //16位定时器模式
TH0 = 0xFC;
TL0 = 0x18;
EA = 1; //开全局中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器
}
void Display() //扫描显示
{
static unsigned char i = 0;
P2 = SegScan[i] ; //点亮第i个数码管
P1 = 0xFF - seg[i%2]; //转换成共阴极数码管,seg[i%2]可以在其他函数进行更新
i++;
if(i>5) i = 0;
}
void main(void)
{
Init_T0();
while(1)
{
PCON |= 0x01;
}
}
void T0_Interrupt() interrupt T0_INTERRUPT
{
static unsigned char i = 0;
TH0 = 0xFC;
TL0 = 0x18;
i++;
TF0 = 0;
if(i == 3) //3毫秒扫描一次
{
Display();
i = 0;
}
}