各位大哥帮帮忙....问些小问题~
这是一个七段数码管显示的程序(共阴极),有些地方不太明白,烦各位说一下
#include <reg51.h>
#include <stdio.h>
#include <math.h>
#include <absacc.h>
#define DIGPORT XBYTE[0x0200] /*定义字位口*/
#define WORDPORT XBYTE[0x0100] /*定义字型口*/
#define fosc 11.0592 /*晶振频率*/
#define time0 2000 /*定时2000us*/
#define uchar unsigned char
uchar digbit; //字位
uchar wordbuf[4]; //字型码缓冲区
uchar idata time0_tmp; //临时变量,用于计算定时
uchar getcode(uchar i); //根据共阴极字型码表获取字型码
void display(void); //显示函数
/*Ö÷º¯Êý*/
void main()
{
DIGPORT=0; //关闭显示(不是为高电平才不亮的吗?)
TMOD=0x01; //T0工作方式1
/*2ms定时设置*/
time0_tmp=65535-time0*fosc/12;
TH0=(time0_tmp/256);
TL0=(time0_tmp%256);
TR0=1; //定时器0为运行状态
ET0=1; //??(这里设为允许中断后就去执行中断函数吗?) 定时器0中断允许
EA=1; //所有中断允许
digbit=0x01; //从第一位数码管开始.??不太明白.第一位具体是哪位a段?
wordbuf[3]=4;
wordbuf[2]=3;
wordbuf[1]=2;
wordbuf[0]=1;
while(1);
}
/*定时器0中断服务子程序,定时动态扫描*/
void time0_int(void) interrupt 1 //?这个关键字跟后面的值的作用是什么啊?
{
TH0=(time0_tmp/256);//?这里只是设置TH0,TL0.具体定时的时间是怎么算的呢?
TL0=(time0_tmp%256);
display();
}
/*根据表获取字型码*/
uchar getcode(uchar i)
{
uchar p;
switch(i)
{
case 0: p=0x3f; break;
case 1: p=0x06; break;
case 2: p=0x5B; break;
case 3: p=0x4F; break;
case 4: p=0x66; break;
case 5: p=0x6D; break;
case 6: p=0x7D; break;
case 7: p=0x07; break;
case 8: p=0x7F; break;
case 9: p=0x67; break;
case 10: p=0x77; break;
case 11: p=0x7C; break;
case 12: p=0x39; break;
case 13: p=0x5E; break;
case 14: p=0x79; break;
case 15: p=0x71; break;
default: break;
}
return (p);
}
/*显示函数*/
void display(void)
{
uchar i;
switch(digbit) //这个值是为1吗?
{
case 1: i=0; break;
case 2: i=1; break;
case 4: i=2; break;
case 8: i=3; break;
default : break;
}
DIGPORT=0; //关闭显示
WORDPORT=getcode(wordbuf[i]); //送字型码
DIGPORT=digbit; //??程序运行时为1,即Ue为1(高电平)
//那此时不是所有的数码管都不亮的吗?
if(digbit <0x08) //不太明白这段代码的作用
digbit=digbit*2;
else
digbit=0x01;
}
万分感谢!!!
[解决办法]
ET0=1; //??(这里设为允许中断后就去执行中断函数吗?) 定时器0中断允许
这里只是打开定时器0中断,需要定时到了才去执行中断函数!
void time0_int(void) interrupt 1 //?这个关键字跟后面的值的作用是什么啊?
interrupt n n表示中断矢量,即表示该段程序放在中断入口地址处,入口地址=8×n+3
程序使用定时动态扫描的方式显示,先熟悉工作原理,再集合硬件接线来读程序吧!
[解决办法]
1.DIGPORT=digbit; //??程序运行时为1,即Ue为1(高电平),那此时不是所有的数码管都不亮的?
答:因为七段数码管显示是共阴极,所以高电平时是亮不是不亮.
2.定时到了才执行这个函数,是根据主函数中的定时设定的时间的吗?那中断函数中的定时时间设定又起到什么作用呢?
答:是根据主函数设定的时间,时间一到就中断响应;由于定时器工作在方式1不是方式2(自动生装载),所以中断函数里要重新设定时初值,这样每次中断完了还能重新定时.
3.if(digbit <0x08) //不太明白这段代码的作用
digbit=digbit*2;
else
digbit=0x01;
因为乘2相当于左移一位,所以里相当于把LED逐次点亮,产生跑马灯的效果.