原创 中断方式数码管显示的演示实例

2009-12-12 22:51 3615 15 15 分类: MCU/ 嵌入式

在一个论坛回答别人的提问的时候的回帖,放在这里,程序很简单,需要的就看看,也欢迎多指教。


/***************************************************************************
                   中断方式数码管显示的演示实例


说明:
本演示实例是为论坛上jzzbeyond 提出的如何使用定时器扫描数码管的问题而作
问题连接:http://www.wang1jin.com/bbs/viewthread.php?tid=374&extra=page%3D1


思路:
数码管中断方式显示的方法可有多种,此例思路如下
1、首先确定扫描频率,一般扫描频率不低于50HZ为好,如50HZ,则完整扫描一次为20ms
实验板上有四位数码管,则每个数码管应隔5ms一次。因此设定中断为5ms。
2、本着定时中断中的工作时间尽量短的原则,在扫描中断中每次只是点亮一个LED数码管


演示效果:
本演示效果为在实验板上四位LED数码管上显示'0123'字样。


修改记录:
2009年12月12日上午10:40完成。
******************************************************************************/


#include <REGX51.H>


#define uint unsigned int
#define uchar unsigned char
#define MaxPos  3    //定义数码管位数,对于本网站实验板,数码管为4位



uchar Led_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0X90}; //LED段16进制数据0-9;
uchar Loc_Data[]={0xFE, 0xFD, 0xFB, 0xF7};    //位选数据
uchar DispNum[]={0x06,0x07,0x08,0x09};     //在数码管上显示的数字


uchar Pos="0";           //显示位置变量



void Display(uchar DispPos); //声明显示函数
void SystemInit(void);



void main(void)      //主函数;
{
 SystemInit();
 while(1);
}


/************************************************************************
函数名称:四位7段数码管显示
全局变量:无
参数说明:DispPos为显示位置
返回说明:无
版    本:1.0
作    者:ZHCE
说    明:
************************************************************************/
void Display(uchar DispPos)
{
 P0=Led_Data[DispPos];
 P1 = Loc_Data[DispPos];     //第DispPos位数码管显示;
}



/************************************************************************
函数名称:系统初始化函数
全局变量:无
参数说明:无
返回说明:返回按键键值
版    本:1.0
作    者:ZHCE
说    明:此函数为系统初始化函数,主要是开启定时器中断。
************************************************************************/
void SystemInit(void)
{
 TMOD = 0x01;         //定时器设置
 ET0  = 1;
 TR0  = 1;
 EA   = 1;
 TH0  = 0xEE;         //定时器赋值
 TL0  = 0;


}


/************************************************************************
函数名称:定时器中断函数
全局变量:无
参数说明:无
返回说明:返回按键键值
版    本:1.0
作    者:ZHCE
说    明:此中断函数为每5ms中断一次。
************************************************************************/
void Time_5ms(void) interrupt 1
{
 TH0 =0xEE;        //定时器赋值
 TL0 =0;
 Display(Pos);
 Pos++;
 if (Pos>MaxPos) Pos="0";
}

文章评论0条评论)

登录后参与讨论
我要评论
0
15
关闭 站长推荐上一条 /2 下一条