键盘之中断法2-与数码管结合

 本文为LED-执棋困局,csdn原创首发。
> 发布人:LED-执棋困局
> 欢迎大家与LED-执棋困局相互点赞+关注+收藏+评论,也祝大家生活安康,学业愉快,工作顺利。
> 我的格言是:“尽最大努力,做最好的自己!
版权声明:本文为优快云博主「LCD-执棋困局」的原创文章。

上节课我们学习了流水灯与键盘、外部中断的综合性练习,了解了如何让各个模块间相互不干扰情况下书写代码。今天我们将学习数码管与键盘、外部中断的综合性项目。

在此之前,我们先来回顾一下上一文章的项目练习:键盘之中断法1

一、项目说明

材料:准备一块51单片机,4个按键,AND_4、一个四位数码管。

功能:数码管显示数值(开始默认为0),第一个按键有数值+1的功能,第二个按键有数值-1的功能,第三个按键有数值清0的功能,第四个按键数值显示“8888”的功能。

二、数码管、键盘、外部中断综合

1.1仿真图解

1.2代码详解

1.2.1外部中断初始化

初始化时,要打开总中断和外部中断1,同时触发方式设置为下降沿触发。

按键按下时,引脚INT1电平会变成低电平,从而触发中断。

void EX1_init()
{
	IT1=1;//下降沿触发
	EA=1;//开启总中断
	EX1=1;//开启外部中断1
}

1.2.2按键服务函数

定义数码管显示变量num,在外部中断1服务函数,采用switch-case语句,处理4个键盘各自的功能。要注意num的范围,因为使用四位数码管,所以num范围是0000~9999。

void time1() interrupt 2 //中断服务函数--外部中断1
{
	switch(P2&0x0f)//判断哪个按键按下
	{
		case 0x0e:
			num++;if(num>9999) num=0;//实现加法运算
		  break;
		case 0x0d:
			num--;if(num>9999) num=9999;//实现减法运算
		  break;
		case 0x0b:
			num=0;//实现清0
		  break;
		case 0x07:
			num=8888;//数码管显示8888
		  break;
		default:break;
	}
}

1.2.3数码管服务函数

数码管服务函数作用是在数码管显示num每个位的数值。

LEDBuf[ ]是缓冲区。

num/1000;//千位数
num/100%10;//百位数
num/10%10;//十位数

num%10;//个位数

void dis_service()
{
	LEDBuf[0]=num/1000;
	LEDBuf[1]=num/100%10;
	LEDBuf[2]=num/10%10;
	LEDBuf[3]=num%10;
}

三、代码全展示

#include <reg51.h>//51头文件
#include "display.h"//数码管显示头文件
#include "delay.h"//延时头文件

//函数声明
void EX1_init();//外部中断1初始化函数声明
void dis_service();//数码管功能函数声明

//变量声明
unsigned int num=0;//定义数码管数据

/******************************************************************************************
函数名:main
功能:主函数
参数:无
返回值:无
******************************************************************************************/
void main()
{
	unsigned int i;
	for(i=0;i<5000;i++)
	{
		display();//初始界面
	}
	
	while(1)
	{
		EX1_init();//外部中断1初始化函数
		dis_service();//数码管功能函数
		display();//数码管显示函数
	}
}
/******************************************************************************************
函数名:EX1_init
功能:外部中断1初始化函数
参数:无
返回值:无
******************************************************************************************/
void EX1_init()
{
	IT1=1;//下降沿触发
	EA=1;//开启总中断
	EX1=1;//开启外部中断1
}

void time1() interrupt 2 //中断服务函数--外部中断1
{
	switch(P2&0x0f)//判断哪个按键按下
	{
		case 0x0e:
			num++;if(num>9999) num=0;//实现加法运算
		  break;
		case 0x0d:
			num--;if(num>9999) num=9999;//实现减法运算
		  break;
		case 0x0b:
			num=0;//实现清0
		  break;
		case 0x07:
			num=8888;//数码管显示8888
		  break;
		default:break;
	}
}
/******************************************************************************************
函数名:dis_service
功能:数码管功能函数
参数:无
返回值:无
******************************************************************************************/
void dis_service()
{
	LEDBuf[0]=num/1000;//千位数
	LEDBuf[1]=num/100%10;//百位数
	LEDBuf[2]=num/10%10;//十位数
	LEDBuf[3]=num%10;//个位数
}

     头文件可以从我主页获得哦!!!LCD-执棋困局_单片机-优快云博客LCD-执棋困局擅长单片机,等方面的知识https://blog.youkuaiyun.com/LIN___IT?type=blog

四、项目结果

五、实战总结

本文讲述键盘、外部中断、数码管综合项目,学会了如何写初始化函数、按键服务函数(处理按键)、数码管服务函数(显示数值),下一文将讲述矩阵键盘与外部中断的综合项目。

接下来分享一下博主我最近的状况:

   

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值