STC单片机跑马灯

我用的板子是一个电机驱动版,上面有四个LED,接在P1.0,P1.1,P1.2,P1.3脚上,拉低就点亮。

用定时器1ms触发一次,1000次就是1秒,每个灯亮一秒,形成跑马灯。

/*----------------------------------------------------
	名称:用定时器控制led亮灭
	单片机:stc12c2052
	晶振:12M
	说明:四个led,一个亮一秒,跑马灯。
------------------------------------------------------*/
#include
    
    
     
     		//头文件

sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;

#define LED1_ON	{LED1 = 0;}
#define LED2_ON	{LED2 = 0;}
#define LED3_ON	{LED3 = 0;}
#define LED4_ON	{LED4 = 0;}
#define ALL_OFF {LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;}


void Init_Timer0(void)	//初始化定时器0
{
	TMOD=0x01;				//定时器0,使用模式1,16位定时器
	TH0=(65536-1000)/256;	//给定初值
	TL0=(65536-1000)%256;
	EA=1;		//打开总中断
	ET0=1;	//打开定时器中断
	TR0=1;	//开定时器
}

void main()	//主函数
{
	Init_Timer0();
	LED1 = 0;
	while(1)
	{
	}
}

void Timer0_isr(void) interrupt 1
{
	static unsigned short int count = 0;
	static char index = 0;

	TH0=(65536-1000)/256;//重新赋值 1ms
	TL0=(65536-1000)%256;

	EA = 0;
	++count;
	if(count == 1000)
	{
		++index;
		index &= 0x03;
		ALL_OFF;
		switch(index){
			case 0:
				LED1_ON;
				break;
			case 1:
				LED2_ON;
				break;
			case 2:
				LED3_ON;
				break;
			case 3:
				LED4_ON;
				break;
			default:
				break;
		}
		count = 0;
	}
	EA = 1;
}
    
    

觉得switch语句太丑了,想改成根据序号,点亮不同的灯,但点灯的变量是sbit ,C51不支持sbit数组。

想了想,把点灯动作写成函数,四个灯四个函数,函数指针数组,这个支持。

/*----------------------------------------------------
	名称:用定时器控制led亮灭
	单片机:stc12c2052
	晶振:12M
	说明:四个led,一个亮一秒,跑马灯。
------------------------------------------------------*/
#include
    
    
     
     		//头文件
typedef void (*pFun)(void);


sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;

#define LED1_ON	{LED1 = 0;}
#define LED2_ON	{LED2 = 0;}
#define LED3_ON	{LED3 = 0;}
#define LED4_ON	{LED4 = 0;}
#define ALL_OFF {LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;}

void set_led1_on(void)
{
	LED1_ON;
}
void set_led2_on(void)
{
	LED2_ON;
}
void set_led3_on(void)
{
	LED3_ON;
}
void set_led4_on(void)
{
	LED4_ON;
}

const pFun led_on[4] = {set_led1_on,set_led2_on,set_led3_on,set_led4_on};
//const void (*led_on[4])(void) = {set_led1_on,set_led2_on,set_led3_on,set_led4_on};

void Init_Timer0(void)	//初始化定时器0
{
	TMOD=0x01;				//定时器0,使用模式1,16位定时器
	TH0=(65536-1000)/256;	//给定初值
	TL0=(65536-1000)%256;
	EA=1;		//打开总中断
	ET0=1;	//打开定时器中断
	TR0=1;	//开定时器
}

void main()	//主函数
{
	Init_Timer0();//初始化定时器0
	LED1 = 0;		//开第一个灯
	while(1)
	{
	}
}

//定时器中断函数,1ms 定时。
void Timer0_isr(void) interrupt 1
{
	static unsigned short int count = 0;
	static char index = 0;

	TH0=(65536-1000)/256;//重新赋值 1ms
	TL0=(65536-1000)%256;

	EA = 0;
	++count;
	if(count == 1000)	//到 1 秒了
	{
		++index;		//点灯序号
		index &= 0x03;	//四个灯,序号0~3
		ALL_OFF;		//全关灯
		(*led_on[index])();		//打开序号对应灯
		count = 0;				// 1秒计数开始。1s = 1000ms。
	}
	EA = 1;
}

    
    

后来想到虽然sbit数组不支持,但是我可以不单个控制灯,而是四个灯一起控制,P1口可以用char赋值,char数组是支持的,改成下面这样:

/*----------------------------------------------------
	名称:用定时器控制led亮灭
	单片机:stc12c2052
	晶振:12M
	说明:四个led,一个亮一秒,跑马灯。
------------------------------------------------------*/
#include
     
     
      
      		//头文件
typedef void (*pFun)(void);

const unsigned char led_port[4] = {0xFE,0xFD,0xFB,0xF7};

void Init_Timer0(void)	//初始化定时器0
{
	TMOD=0x01;				//定时器0,使用模式1,16位定时器
	TH0=(65536-1000)/256;	//给定初值
	TL0=(65536-1000)%256;
	EA=1;		//打开总中断
	ET0=1;	//打开定时器中断
	TR0=1;	//开定时器
}

void main()	//主函数
{
	Init_Timer0();//初始化定时器0
	P1 = 0xFE;		//开第一个灯
	while(1)
	{
	}
}

//定时器中断函数,1ms 定时。
void Timer0_isr(void) interrupt 1
{
	static unsigned short int count = 0;
	static char index = 0;

	TH0=(65536-1000)/256;//重新赋值 1ms
	TL0=(65536-1000)%256;

	EA = 0;
	++count;
	if(count == 1000)	//到 1 秒了
	{
		++index;		//点灯序号
		index &= 0x03;	//四个灯,序号0~3
		P1 = led_port[index];
		count = 0;				// 1秒计数开始。1s = 1000ms。
	}
	EA = 1;
}

     
     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值