前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯单片机必备知识—–(5)独立按键

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

作者头像
全栈程序员站长
发布2021-04-15 15:06:02
4780
发布2021-04-15 15:06:02
举报
文章被收录于专栏:全栈程序员必看

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

独立按键

注:在使用独立按键部分时,需将跳线帽放置BIT端

代码逻辑:

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

按键扫描函数

代码语言:javascript
复制
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;	//检测按键是否抬起
	}
}

中断函数

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

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

测试结果:

在这里插入图片描述
在这里插入图片描述

代码粘贴

代码语言:javascript
复制
#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.cn/100136.html原文链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 蓝桥杯单片机必备知识—–(5)独立按键
  • 独立按键
  • 代码逻辑:
  • 按键扫描函数
  • 中断函数
  • 测试结果:
  • 代码粘贴
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档