在一个论坛回答别人的提问的时候的回帖,放在这里,程序很简单,需要的就看看,也欢迎多指教。
/***************************************************************************
中断方式数码管显示的演示实例
说明:
本演示实例是为论坛上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条评论)
登录后参与讨论