蓝桥杯单片机必备知识—–(5)独立按键

蓝桥杯单片机必备知识—–(5)独立按键

蓝桥杯单片机必备知识—–(5)独立按键

独立按键

在这里插入图片描述
注:在使用独立按键部分时,需将跳线帽放置BIT端

代码逻辑:

1.放在while(1)一直扫描按键是否按下
2.放在中断中 中断一次扫描按键是否按下
注:大型项目会放在中断中进行,一直扫描会占用过多资源,如果参加比赛则可以在while中一直使用循环

按键扫描函数

void read_key()
{
   
	uchar temp;  
	static unsigned state = 0;		//状态
	temp = P3 & 0x0f; 	//临时存储P3的状态
	switch(state)
	{
   
		case 0:{
   if(P3 != 0x0f) state = 1;}break;	//状态0,检测到有按键按下
		case 1:										//再次检测是否有按键按下,消抖
		{
   
			if(P3 != 0x0f){
   
			switch(temp)
			{
   
				case 0x0e:{
   s7++;state = 2;}break;	//如果S7按键对应的状态改变,则s7++
				case 0x0d:{
   s6++;state = 2;}break;	//如果S6按键对应的状态改变,则s7++
				case 0x0b:{
   s5++;state = 2;}break;	//如果S5按键对应的状态改变,则s7++
				case 0x07:{
   s4++;state = 2;}break;	//如果S4按键对应的状态改变,则s7++
			}
			}
			else state = 0;
		}break;
		case 2:{
   if(P3 == 0xff) state = 0;}break;	//检测按键是否抬起
	}
}

中断函数

void time0() interrupt 1
{
   
	static unsigned char intr = 0;
	display();
	if(++intr == 8) 	//按键消抖时间为5~10ms 
	{
   
		intr = 0;
		read_key();		//进行键扫描
	}
}

主函数内容不再赘述,如有不明白请看1,2中的内容

测试结果:

在这里插入图片描述

代码粘贴

#include <stc15f2k60s2.h>

#define uint unsigned int
#define uchar unsigned char

uchar tab[] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dspbuf[8] = {
   10,10,10,10,10,10,10,10};
uchar s4 =0 ,s5 = 0,s6 = 0,s7 = 0;

void read_key();
void display();
void load();
void cls()
{
   
	//关闭LED
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = 0x1f;
	//关闭BUZZ
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = 0x1f;
}

void main()
{
   
	cls();
	AUXR = 0x80;
	TMOD = 0x80;
	TL0 = 0xcd;
	TH0 = 0xd4;
	
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	while(1)
	{
   }
}

void time0() interrupt 1
{
   
	static unsigned char intr = 0;
	display();
	if(++intr == 8) 	
	{
   
		intr = 0;
		read_key();
	}
}

void read_key()
{
   
	uchar temp;
	static unsigned state = 0;
	temp = P3 & 0x0f;
	switch(state)
	{
   
		case 0:{
   if(P3 != 0x0f) state = 1;}break;
		case 1:
		{
   
			if(P3 != 0x0f){
   
			switch(temp)
			{
   
				case 0x0e:{
   s7++;state = 2;}break;
				case 0x0d:{
   s6++;state = 2;}break;
				case 0x0b:{
   s5++;state = 2;}break;
				case 0x07:{
   s4++;state = 2;}break;
			}
			}
			else state = 0;
		}break;
		case 2:{
   if(P3 == 0xff) state = 0;}break;
	}
}

void load()
{
   
	
	dspbuf[0] = s4;
	dspbuf[1] = s5;
	dspbuf[2] = s6;
	dspbuf[3] = s7;
	dspbuf[4] = 10;
	dspbuf[5] = 10;
	dspbuf[6] = 10;
	dspbuf[7] = 10;
}

void display()
{
   
	static unsigned char dspcom = 0;
	load();
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1 << dspcom;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = tab[dspbuf[dspcom]];
	P2 = 0x1f;
	
	if(++dspcom == 8) dspcom = 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100136.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTP常见的状态码

    HTTP常见的状态码状态码解释200一切正常301永久重定向302临时重定向401用户名或密码错误403禁止访问(客户端IP地址被拒绝404文件不存在414请求URI头部过长500服务器内部错误502BadGateway(错误网关)…

    2022年9月14日
    3
  • JSONObject、JSONArray

    JSONObject、JSONArray最近两个星期接触最多的就是json和map了。  之前用到的json,就是一个键对应一个值,超级简单的一对一关系。现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个数据还那么麻烦。其实,就跟ifelse语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键

    2022年5月4日
    48
  • 在线视频的5种下载办法

    在线视频的5种下载办法最简单的办法,就是利用各种网盘搜索,找到网盘的分享地址,转存到自己的网盘,然后下载。这样就避免了从在线视频网站直接下载,而且常常清晰度比较高。如果网盘找不到,第二种办法是利用一些在线视频的解析网站。

    2022年6月30日
    33
  • java基础API

    java基础APIJava常用类库1.API(1)ApplicationProgrammingInterface,应用程序接口。是一些预先定义的类和接口,或指软件系统不同组成部分衔接的约定。(2)API说明文档API文档查看方式:第一步选择包,第二步,选择类或接口,第三步查看类和接口的使用说明,右边的区域。右边的区域分为五块,分别为类的定义和功能介绍、属性的介绍、构造器的介绍、构造器的介绍、方法的列表、每个方法的使用详细说明。2、java.lang包(1)这是我们api中最基础的一个包(2)该包下面的

    2022年7月9日
    20
  • form表单提交后如何弹出对话框_ajax提交form表单数据

    form表单提交后如何弹出对话框_ajax提交form表单数据定义一个函数:functionsumbit_sure(){vargnl=confirm(“确定要提交?”);if(gnl==true){returntrue;}else{returnfalse;}}然后在form的onsubmit里调用就可以了:

    2022年10月7日
    3
  • 西数移动硬盘无法读取(高枕无忧的成语)

    原标题:让你的秘密高枕无忧WDMyPassport随行版移动硬盘评测现在是一个数据爆炸的时代,游戏厂商所制作的游戏容量越来越大,短视频风靡我们拍出来的短片越来越多,生活工作中的重要资料更是要好好保存。所以移动硬盘是必备的,一款高速、轻薄、大存储的移动硬盘能改变我们的存储生活。这次入手这款WDMyPassport随行版移动硬盘外观设计小巧轻薄,同时读写速度都在100MB/S左右,还有密码保…

    2022年4月11日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号