单片机实现定时流水灯+六位数码管轮流显示的效果

今天利用前两天学到的流水灯(其实就是个函数的用法哈哈哈)和中断的概念编了一小段代码~

可以实现的效果:

八个LED灯间隔1s轮流点亮,六位数码管间隔2s轮流依次显示数字1-9.


代码如下:

include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit dula=P2^6;
sbit wela=P2^7;
sbit DIOLA=P2^5;
uchar temp;
uint a,i,we_order;
uchar code table[]={ 0x3f ,0x06 ,0x5b ,0x4f,0x66 ,0x6d, 0x7d ,0x07 ,0x7f, 0x6f};
void delay(uint z);
void main()
{
	a=0;
	i=0;
	DIOLA=1;
	temp=0xfe;//用来控制LED灯点亮顺序
	P1=temp;
	TMOD=0x01;//中断模式,定时器
	TH0=(65535-50000)/256;	//50ms定时器初值设定
	TL0=(65535-50000)%256;
	
	EA=1;	//开启总中断
        ET0=1;  //定时器0
	
        TR0=1;	//定时器0
	
	wela=0;
	dula=0;
  
	 wela=1;
	 we_order=0xfe;//控制显示数字的数码管的顺序
	 P0=we_order;
	 wela=0	 ;
	

	 dula=1;
	 P0=table[i];//显示数字0
	 dula=0;
	 
	 while(1);//注意:要防止主函数循环执行(许多只需要执行一次的赋值语句)
	
	 
}



void timer0() interrupt 1//定时器0
{
	a++;
	if(a%20==0)//间隔1s
	{		
	  temp=_cror_(temp,1);//_cror_&_crol_LED灯轮流点亮
	  P1=temp;			
	}
	if(a==40)//间隔2s
	{
	  we_order=_crol_(we_order,1);
	  if(we_order==0xbf) we_order=0xfe;//***注意we_order令第6个数码管显示时不应改变
          wela=1;
	  P0=we_order;
	  wela=0;
	  dula=1;
	  i++;
	  if(i>9) i=0;
	  dula=1;
	  P0=table[i];
	  dula=0;
	  a=0;		
         }
//判断语句可以放在主函数中,也可放在中断函数中(有时会受到主函数中程序运行时间的影响),注意区别
}

实现效果:

每天学到新的东西真的很开心啊~无论是课本上的知识or舞蹈or厨艺or写作or单片机/算法~继续加油哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章