AT89C52编写定时器中断+按键+数码管显示

         目的是为了熟悉定时器中断程序,使用定时器的中断控制数码管的多位扫描显示数字,通过按键S2和S3来控制数字的加减。欢迎各位指正不足!!!!!!

#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
sbit key_s2 = P3^0;//独立按键S2
sbit key_s3 = P3^1;//独立按键S3
uchar num;//数码管显示的值
uchar ms_50,s;    //记录50ms的个数  20个为1s
//共阴极数码管0-9
uchar  code duanxuan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//位选前三个数码管
uchar  code weixuan[] ={0xfe,0xfd,0xfb,0xf7};
void delay(uint x)		//@12.000MHz  延迟函数1毫秒   
{
	unsigned char i, j;
	while(x--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void display(uchar i)    //数码管显示函数
	
{
	static uchar wei;
	uchar qian,bai, shi, ge;
	qian =i/1000;
	bai = i / 100%10; 
	shi = i /10%10;	
	ge  = i % 10;
	
	P0 = 0XFF;//清除断码
	WE = 1;   //位选打开
	P0 = weixuan[wei];
	WE = 0;   //关闭位选寄存器
	switch(wei)
	{
		case 0:DU = 1;P0 = duanxuan[qian];DU = 0;break;
		case 1:DU = 1;P0 = duanxuan[bai];DU = 0;break;
		case 2:DU = 1;P0 = duanxuan[shi];DU = 0;break;
		case 3:DU = 1;P0 = duanxuan[ge];DU = 0;break;
	}

	wei++;
	if(wei ==4)
		wei =0;	
}

void timer0Init()  //定时器0初始化
{
	EA =1;
	ET0 =1;
	TR0 =1;     
	//TCON中的打开定时器
	TMOD =0x01;      //TMOD不能位寻址 0000 0001中 0 01表示定时器模式  16位定时
	TH0 =0xed;       //(65535-46082)/256;     //定时器 50ms   65536-50000/1.085/256   高8位
	TL0 =0xff;       //(65535-46082)%256;     //低8位
}


void timer0() interrupt 1   //定时器0中断
{
	TH0 =0xed;
	TL0 =0xff;
  display(num);
}


void main()
{
	//uchar ms_50,s;    //记录50ms的个数  20个为1s
	//TR0 =1;
	timer0Init();
	while(1)
	{
		if(key_s2 == 0)//判断S2是否被按下
		{
			delay(20);//按键消抖
			if(key_s2 == 0)
			{
				if(num !=200)//如果值不等于9则+1,功能把值限定为小于99
				num++;
				while(!key_s2);//松手检测
			}	
		}
		if(key_s3 == 0)//判断S3是否被按下
		{
			delay(20);//按键消抖
			if(key_s3 == 0)
			{
				if(num > 0)	//如果大于0则执行减一
					num--;
				while(!key_s3);//松手检测
			}	
		}	
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值