本文为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
四、项目结果
五、实战总结
本文讲述键盘、外部中断、数码管综合项目,学会了如何写初始化函数、按键服务函数(处理按键)、数码管服务函数(显示数值),下一文将讲述矩阵键盘与外部中断的综合项目。
接下来分享一下博主我最近的状况: