按键-数码管-定时器

1、让数码管前4位以0.5秒的速递从0-F循环,要求利用定时器实现定时。当按下独立键盘S2时数码管停止跑数,当松开S2时数码管继续跑数。

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit duan=P2^6;  //段选锁存端
sbit wei=P2^7;   //位选锁存端
sbit key=P3^0;

uchar num;tt;

uchar code tableduan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};


void delay(uint z){    //延时
	uint x,y;
	for(x=z;x>0;x--)
	  for(y=110;y>0;y--);
}

void init()  //初始化位锁存端,前四位显示0,初始化定时器0
{
	wei=1;
	P0=0xf0;
	wei=0;
	duan=1;
	P0=0x3f;
	duan=0;
	
	TMOD=0x01;
	TH0=(65536-50000)/256;  //50ms
    TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
	
}

void main()
{
	init();
	while(1)
	{
		if(key==0)
		{
			delay(5);  //消抖
			if(key==0) //按键按下
			 {
			   TR0=0;  //关闭定时器0
			 }
		}else{TR0=1;}  //打开定时器0
	}
				
}


void time() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
	tt++;
	if(tt==10)  //50*10=500ms
	{
		tt=0;
		num++;
		duan=1;  //段锁存端打开
		if(num<17)
		 {
		   P0=tableduan[num-1];   //0-F显示
		 }else{num=0;}
		duan=0;
	}
	
}

2、让后四位数码管以0.01秒(利用定时器)的速度从0显示到9999。按下S1开始跑数。按下S2停止跑数。按下S3数码管的数值从1(需要在停止跑数时执行才有效)。按下S4数码管的数值减1(需要在停止跑数时执行才有效)。

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit duan=P2^6;  //段选锁存端
sbit wei=P2^7;   //位选锁存端
sbit key1=P3^0;  
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;

uchar tt;
uint num;

uchar code tableduan[]={  //段数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,};

uchar code tablewei[]={  //位数组
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(uint z){   //延时
	uint x,y;
	for(x=z;x>0;x--)
	  for(y=110;y>0;y--);
}

void display()
{	

	P0=0xff;  //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选  消隐
	wei=1;
	P0=tablewei[4];
	wei=0;
	duan=1;
	P0=tableduan[num/1000];  //千位
	duan=0;
    delay(5);  //视觉暂留
	
	P0=0xff;
	wei=1;
	P0=tablewei[5];
	wei=0;
	duan=1;
	P0=tableduan[num/100%10];  //百位
	duan=0;
    delay(5);
	
	P0=0xff;
	wei=1;
	P0=tablewei[6];
	wei=0;
	duan=1;
	P0=tableduan[num/10%10];  //十位
	duan=0;
    delay(5);
	
	P0=0xff;
	wei=1;
	P0=tablewei[7];
	wei=0;
	duan=1;
	P0=tableduan[num%10];  //个位
	duan=0;
    delay(5);
	
}

void S1()  //按键1
{
	if(key1==0)
		{
			delay(5);  //消抖
			if(key1==0)
			{
				TR0=1;  //定时器0打开数字跳动
				while(!key1)  //判断是否按键抬起
					{
				    display();  //按下时保持显示
				  }
			}
				
		}
}

void S2()  //按键2
{
	if(key2==0)
		{
			delay(5);  
			if(key2==0)
			{
				TR0=0;  //定时器0关闭数字停止跳动
				while(!key2)  
					{
				    display();  
				  }
			}
				
		}
}

void S3()  //按键3
{
	if(key3==0)
		{
			delay(5);
			if(key3==0  && TR0==0)
			{
				num++;  //停止时数字加1
				while(!key3)
					{
				    display();
				  }
			}
				
		}
}

void S4()  //按键4
{
	if(key4==0)
		{
			delay(5);
			if(key4==0  && TR0==0)
			{
				num--;   //停止时数字减一
				while(!key4)
					{
				    display();
				  }
			}
				
		}
}

void init()  //定时器0初始化
{
	TMOD=0x01;
	TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
	EA=1;
	ET0=1;
}

void main()
{
	init();
	while(1)
	{
        S1();
		S2();
		S3();
		S4();	
		display();
	}
				
}
				

void time() interrupt 1
{
	TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
	tt++;
	if(tt==1)  //0.1s
	{
		tt=0;
		num++;
		if(num>9999)
		{
			num=0;
		}
	}
	
	
}

 

  • 1
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

白牙丶

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值