今天利用前两天学到的流水灯(其实就是个函数的用法哈哈哈)和中断的概念编了一小段代码~
可以实现的效果:
八个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单片机/算法~继续加油哦!