51单片机004:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。
题目:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。
思路:
1、要用到定时器,进行定时器初始化,配置相关寄存器,并编写中断服务函数
2、“在3位数码管上依次显示……”,属于数码管的动态显示知识,要用到位选和段选
涉及原理图:
代码:
#include "reg52.h"
//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
static unsigned int i;//定义静态变量i
//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void time0_init(void)
{
TMOD|=0X01; //选择为定时器0模式,工作方式1
TH0=(65535-50000)/256; //50ms定时10次
TL0=(65535-50000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void smg_display(unsigned char location,num)
{
P0=0x00;
switch(location)
{
case 8:LSC=0;LSB=0;LSA=0;break;
case 7:LSC=0;LSB=0;LSA=1;break;
case 6:LSC=0;LSB=1;LSA=0;break;
case 5:LSC=0;LSB=1;LSA=1;break;
case 4:LSC=1;LSB=0;LSA=0;break;
case 3:LSC=1;LSB=0;LSA=1;break;
case 2:LSC=1;LSB=1;LSA=0;break;
case 1:LSC=1;LSB=1;LSA=1;break;
}
P0=gsmg_code[num];
}
void main()
{
time0_init();//定时器0中断配置
while(1)
{
}
}
void time0() interrupt 1 //定时器0中断函数
{
static unsigned int location=1,num=0,count;
TH0=(65535-50000)/256; //50ms定时10次
TL0=(65535-50000)%256;
count++;
if(count == 10)
{
count = 0;
smg_display(location,num);
location++;
num++;
if(location>3)
{
location=1;
}
if(num>15)
{
num=0;
}
}
}
其中,smg_display函数是和小蜜蜂老师学的,小蜜蜂老师yyds!location代表要亮的数码管的位置,num代表该数码管要显示的数字,一步到位,不需要每次进行位选和段选,简单快捷。