单片机实验9:独立按键

本文介绍了一个使用单片机实现数码管显示数字的实验,通过四个独立按键实现数字的加减、清零和自动计数功能。程序中采用中断系统进行50ms的时间间隔计数,并在按键检测到有效操作后更新数码管的显示。实验对可能出现的num值负数情况进行了处理,确保了程序的稳定性。
摘要由CSDN通过智能技术生成

使用独立按键来控制数码管显示数字
第一颗按键,计数加1
第二颗按键,计数减1
第三颗按键,计数清零
第四颗按键,自动计数

#include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int

sbit dlkey1 = P3^1;		 	//独立按键位控制
sbit dlkey2 = P3^0;
sbit dlkey3 = P3^2;
sbit dlkey4 = P3^3;
sbit led2 = P2^2;			//控制数码管位选的位
sbit led3 = P2^3;
sbit led4 = P2^4;
uchar code duanxuan[] = {0x3f,0x06,0x5b,0x4f,	  //0,1,2,3
						 0x66,0x6d,0x7d,0x07,	  //4,5,6,7
					 	 0x7f,0x6f,0x77,0x7c,	  //8,9,A,B
						 0x39,0x5e,0x79,0x71};	  //C,D,E,F		段选
uint numt0;int num;

void delay_xms(uint m)	    //延时ms操作
{
	int i;
	for(;m>0;m--)
		for(i=110;i>0;i--);
}

void Init()					//初始化内容
{
	TMOD = 0X01;			//定时器工作模式设置为01
	TH0 = (65536-45872)/256;//计数器高八位赋初值
	TL0 = (65536-45872)%256;//计数器低八位赋初值
	EA = 1;					//中断总开关
	ET0 = 1;				//定时器T0中断开关
 } 
 
void keyscan()				//按键检测函数
{
	if(dlkey1==0)			//按键1按下后,num加一
	{
		delay_xms(10);
		if(dlkey1==0)
		{
			num++;			//先加数,后检测
			if(num>60)
			{
				num=0;
			}
			while(!dlkey1); //按住按键时,没有反应,松开按键反应						  
		}
	}
	if(dlkey2==0)	  		//按键2按下后,num减一
	{
		delay_xms(10);
		if(dlkey2==0)
		{
			num--;	  		//先减数,后检测
			if(num<0)
			{
				num=60;
			}
			while(!dlkey2);	//按住按键时,没有反应,松开按键反应					  
		}
	}
	if(dlkey3==0)			//按键3按下后,num清零
	{
		delay_xms(10);
		if(dlkey3==0)
		{
			num=0;
			while(!dlkey3);	//按住按键时,没有反应,松开按键反应					  
		}
	}
	if(dlkey4==0)	   		//按键4按下后,自动计数开启/关闭
	{
		delay_xms(10);
		if(dlkey4==0)
		{
			while(!dlkey1);
			TR0 = ~TR0;		//按住按键时,没有反应,松开按键反应				  
		}
	}
}

void display(int i,int j,int k)	 //数码管显示函数
{
	switch(i)
	{
		case(0):P0=duanxuan[j];led2=1,led3=1,led4=1;break;
		case(1):P0=duanxuan[k];led2=0,led3=1,led4=1;break;
		case(2):led2=1,led3=0,led4=1;break;
		case(3):led2=0,led3=0,led4=1;break;
		case(4):led2=1,led3=1,led4=0;break;			 
		case(5):led2=0,led3=1,led4=0;break;
		case(6):led2=1,led3=0,led4=0;break;
		case(7):led2=0,led3=0,led4=0;break;
	}
}

void main()
{
	int i=0,j,k; 
	Init();
	while(1)
	{
		keyscan();			//先按键检测对num值改变后
		j=num/10,k=num%10; 	//再进行j、k的赋值操作
		display(i,j,k);		//数码管显示
		if(numt0 >= 20)		//20次50ms的中断检测为1s
		{
			num++;			//计数加一
			if(num >60)
			{
				num = 0;
			}
			numt0 = 0;
		}
		i=(i+1)%2;			//i控制数码管的显示位置,目前为1号位和2号位
		P0 = 0;				//消影
	}	
}

void TR0_time() interrupt 1	//50ms中断系统
{
	TH0 = (65536-45872)/256;
	TL0 = (65536-45872)%256;
	numt0++;
}

该实验对于num小于0的情况作出改进,如果num选用uint类型,那么num–,小于0之后就会出现bug,但是num使用int类型则不会。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值